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 }