View Javadoc

1   /***************************************************************************************
2    * Copyright (c) Jonas Bonér, Alexandre Vasseur. All rights reserved.                 *
3    * http://aspectwerkz.codehaus.org                                                    *
4    * ---------------------------------------------------------------------------------- *
5    * The software in this package is published under the terms of the LGPL license      *
6    * a copy of which has been included with this distribution in the license.txt file.  *
7    **************************************************************************************/
8   package org.codehaus.aspectwerkz.expression.regexp;
9   
10  import org.codehaus.aspectwerkz.expression.ExpressionException;
11  import org.codehaus.aspectwerkz.util.Strings;
12  
13  import java.io.ObjectInputStream;
14  
15  /***
16   * Implements the regular expression pattern matcher for names.
17   * 
18   * @author <a href="mailto:jboner@codehaus.org">Jonas Bonér </a>
19   */
20  public class NamePattern extends Pattern {
21      /***
22       * The name pattern.
23       */
24      protected transient com.karneim.util.collection.regex.Pattern m_namePattern;
25  
26      /***
27       * The name pattern as a string.
28       */
29      protected String m_pattern;
30  
31      /***
32       * Private constructor.
33       * 
34       * @param pattern the pattern
35       */
36      NamePattern(final String pattern) {
37          m_pattern = pattern;
38          escape(m_pattern);
39      }
40  
41      /***
42       * Matches a name.
43       * 
44       * @param name the name
45       * @return true if we have a matche
46       */
47      public boolean matches(final String name) {
48          if (name == null) {
49              throw new IllegalArgumentException("name can not be null");
50          }
51          if (name.equals("")) {
52              return false;
53          }
54          return m_namePattern.contains(name);
55      }
56  
57      /***
58       * Returns the pattern as a string.
59       * 
60       * @return the pattern
61       */
62      public String getPattern() {
63          return m_pattern;
64      }
65  
66      /***
67       * Escapes the name pattern.
68       * 
69       * @param namePattern the name pattern
70       */
71      protected void escape(String namePattern) {
72          try {
73              if (namePattern.equals(REGULAR_WILDCARD)) {
74                  namePattern = "[a-zA-Z0-9_$.]+";
75              } else {
76                  namePattern = Strings.replaceSubString(namePattern, "*", "[a-zA-Z0-9_$]*");
77              }
78              m_namePattern = new com.karneim.util.collection.regex.Pattern(namePattern);
79          } catch (Throwable e) {
80              throw new ExpressionException("type pattern is not well formed: " + namePattern, e);
81          }
82      }
83  
84      /***
85       * Provides custom deserialization.
86       * 
87       * @param stream the object input stream containing the serialized object
88       * @throws Exception in case of failure
89       */
90      private void readObject(final ObjectInputStream stream) throws Exception {
91          ObjectInputStream.GetField fields = stream.readFields();
92          m_pattern = (String) fields.get("m_pattern", null);
93          escape(m_pattern);
94      }
95  
96      public int hashCode() {
97          int result = 17;
98          result = (37 * result) + hashCodeOrZeroIfNull(m_pattern);
99          result = (37 * result) + hashCodeOrZeroIfNull(m_namePattern);
100         return result;
101     }
102 
103     protected static int hashCodeOrZeroIfNull(final Object o) {
104         if (null == o) {
105             return 19;
106         }
107         return o.hashCode();
108     }
109 
110     public boolean equals(final Object o) {
111         if (this == o) {
112             return true;
113         }
114         if (!(o instanceof NamePattern)) {
115             return false;
116         }
117         final NamePattern obj = (NamePattern) o;
118         return areEqualsOrBothNull(obj.m_pattern, this.m_pattern)
119             && areEqualsOrBothNull(obj.m_namePattern, this.m_namePattern);
120     }
121 
122     protected static boolean areEqualsOrBothNull(final Object o1, final Object o2) {
123         if (null == o1) {
124             return (null == o2);
125         }
126         return o1.equals(o2);
127     }
128 }