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 }