/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.expression.regexp;
import org.codehaus.aspectwerkz.expression.ExpressionException;
import org.codehaus.aspectwerkz.util.Strings;
import java.io.ObjectInputStream;
/**
* Implements the regular expression pattern matcher for names.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public class NamePattern extends Pattern {
/**
* The name pattern.
*/
protected transient com.karneim.util.collection.regex.Pattern m_namePattern;
/**
* The name pattern as a string.
*/
protected String m_pattern;
/**
* Private constructor.
*
* @param pattern the pattern
*/
NamePattern(final String pattern) {
m_pattern = pattern;
escape(m_pattern);
}
/**
* Matches a name.
*
* @param name the name
* @return true if we have a matche
*/
public boolean matches(final String name) {
if (name == null) {
throw new IllegalArgumentException("name can not be null");
}
if (name.equals("")) {
return false;
}
return m_namePattern.contains(name);
}
/**
* Returns the pattern as a string.
*
* @return the pattern
*/
public String getPattern() {
return m_pattern;
}
/**
* Escapes the name pattern.
*
* @param namePattern the name pattern
*/
protected void escape(String namePattern) {
try {
if (namePattern.equals(REGULAR_WILDCARD)) {
namePattern = "[a-zA-Z0-9_$.]+";
} else {
namePattern = Strings.replaceSubString(namePattern, "*", "[a-zA-Z0-9_$]*");
}
m_namePattern = new com.karneim.util.collection.regex.Pattern(namePattern);
} catch (Throwable e) {
throw new ExpressionException("type pattern is not well formed: " + namePattern, e);
}
}
/**
* Provides custom deserialization.
*
* @param stream the object input stream containing the serialized object
* @throws Exception in case of failure
*/
private void readObject(final ObjectInputStream stream) throws Exception {
ObjectInputStream.GetField fields = stream.readFields();
m_pattern = (String) fields.get("m_pattern", null);
escape(m_pattern);
}
public int hashCode() {
int result = 17;
result = (37 * result) + hashCodeOrZeroIfNull(m_pattern);
result = (37 * result) + hashCodeOrZeroIfNull(m_namePattern);
return result;
}
protected static int hashCodeOrZeroIfNull(final Object o) {
if (null == o) {
return 19;
}
return o.hashCode();
}
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof NamePattern)) {
return false;
}
final NamePattern obj = (NamePattern) o;
return areEqualsOrBothNull(obj.m_pattern, this.m_pattern)
&& areEqualsOrBothNull(obj.m_namePattern, this.m_namePattern);
}
protected static boolean areEqualsOrBothNull(final Object o1, final Object o2) {
if (null == o1) {
return (null == o2);
}
return o1.equals(o2);
}
}