View Javadoc

1   /*
2    * Copyright (c) 2003-2008, by Henrik Arro and Contributors
3    *
4    * This file is part of JSeq, a tool to automatically create
5    * sequence diagrams by tracing program execution.
6    *
7    * See <http://jseq.sourceforge.net> for more information.
8    *
9    * JSeq is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation, either version 3 of
12   * the License, or (at your option) any later version.
13   *
14   * JSeq is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17   * GNU Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public License
20   * along with JSeq. If not, see <http://www.gnu.org/licenses/>.
21   */
22  
23  package th.co.edge.jseq;
24  
25  /**
26   * A <code>Filter</code> that only accepts <code>Activation</code>s with
27   * method names that do not match a given exclude pattern.
28   */
29  public class ClassExclusionFilter implements ActivationList.Filter {
30      private String excludePattern;
31  
32      /**
33       * Creates a new <code>ClassExclusionFilter</code> with the given method
34       * name exclude pattern. If the pattern starts or ends with "*", all method
35       * names with the correct suffix or prefix, respectively, are accepted.
36       *
37       * <p>
38       * For example, the pattern "foo.Bar.baz" would only match a method named
39       * "baz" in the class foo.bar, "*.baz" would match any method named "baz" in
40       * any class, and "foo.Bar.*" would match all method in the class foo.Bar.
41       *
42       * @param excludePattern
43       *            the exclude pattern to use for this filter instance, possibly
44       *            starting or ending with the wildcard "*"
45       */
46      public ClassExclusionFilter(String excludePattern) {
47          this.excludePattern = excludePattern;
48      }
49  
50      /**
51       * Returns <code>true</code> if and only if the given
52       * <code>Activation</code> represents a method call where the class name
53       * plus method name matches the exclude pattern used by this filter.
54       *
55       * @param activation
56       *            the <code>Activation</code> to check for matching method
57       *            name
58       *
59       * @return <code>true</code> if <code>activation</code> represents a
60       *         method call that matches the exclude pattern used by this filter
61       */
62      public boolean accept(Activation activation) {
63          String fullMethodName =
64                  activation.getClassName() + "." + activation.getMethod().name();
65          boolean accepted = true;
66          if (excludePattern.endsWith("*")) {
67              String prefix =
68                      excludePattern.substring(0, excludePattern.length() - 1);
69              accepted = !fullMethodName.startsWith(prefix);
70          } else if (excludePattern.startsWith("*")) {
71              String suffix = excludePattern.substring(1);
72              accepted = !fullMethodName.endsWith(suffix);
73          } else {
74              accepted = !fullMethodName.equals(excludePattern);
75          }
76          return accepted;
77      }
78  }