package javax.management;
import java.io.IOException;
import java.io.ObjectInputStream;
import gnu.regexp.UncheckedRE;
class MatchQueryExp extends QueryEval implements QueryExp
{
private static final long serialVersionUID = -7156603696948215014L;
private AttributeValueExp exp;
private String pattern;
private transient UncheckedRE re;
public MatchQueryExp()
{
}
public MatchQueryExp(AttributeValueExp attr, String string)
{
this.exp = attr;
this.pattern = string;
generateRegExp();
}
public boolean apply(ObjectName name)
throws BadStringOperationException,
BadBinaryOpValueExpException,
BadAttributeValueExpException,
InvalidApplicationException
{
ValueExp calcAttr = exp.apply(name);
if (calcAttr instanceof StringValueExp)
{
return re.isMatch(calcAttr.toString());
}
return false;
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException
{
ois.defaultReadObject();
generateRegExp();
}
public String toString()
{
return new String("(" + exp.toString() + " matches " +
pattern.toString() + ")");
}
private void generateRegExp()
{
StringBuffer buffer = new StringBuffer();
char[] chars = pattern.toCharArray();
boolean escaping = false;
for (int i=0; i < chars.length; i++)
{
if (chars[i] == '\\' && escaping == false)
escaping = true;
else
{
if (chars[i] == '?' && escaping == false)
buffer.append("(?:.)");
else if (chars[i] == '?')
buffer.append("\\?");
else if (chars[i] == '*' && escaping == false)
buffer.append("(?:.)*");
else if (chars[i] == '*')
buffer.append("\\*");
else if (chars[i] == '^')
buffer.append("\\^");
else if (chars[i] == '$')
buffer.append("\\$");
else if (chars[i] == '\\')
buffer.append("\\\\");
else if (chars[i] == '.')
buffer.append("\\.");
else if (chars[i] == '|')
buffer.append("\\|");
else if (chars[i] == '[' && escaping == true)
buffer.append("\\[");
else
buffer.append(chars[i]);
escaping = false;
}
}
if (escaping)
buffer.append("\\\\");
re = new UncheckedRE(buffer);
}
}