package org.jboss.mq.selectors;
import gnu.regexp.RE;
public class RegExp
{
protected RE re;
public RegExp (String pattern, Character escapeChar)
throws Exception
{
re = new RE(adjustPattern(pattern, escapeChar), 0,
gnu.regexp.RESyntax.RE_SYNTAX_POSIX_MINIMAL_BASIC);
}
public boolean isMatch (Object target)
{
return re.isMatch (target);
}
protected String adjustPattern (String pattern, Character escapeChar)
throws Exception
{
int patternLen = pattern.length();
StringBuffer REpattern = new StringBuffer(patternLen + 10);
boolean useEscape = (escapeChar != null);
char escape = Character.UNASSIGNED;
if (useEscape) {
escape = escapeChar.charValue();
}
REpattern.append ('^');
for ( int i = 0; i < patternLen; i++ ) {
boolean escaped = false;
char c = pattern.charAt( i );
if ( useEscape && escape == c ) {
i++;
if ( i < patternLen ) {
escaped = true;
c = pattern.charAt( i );
} else {
throw new Exception( "LIKE ESCAPE: Bad use of escape character" );
}
}
switch ( c ) {
case '_':
if ( escaped ) {
REpattern.append( c );
} else {
REpattern.append( '.' );
}
break;
case '%':
if ( escaped ) {
REpattern.append( c );
} else {
REpattern.append( ".*" );
}
break;
case '*':
case '.':
case '\\':
case '^':
case '$':
case '[':
case ']':
REpattern.append( "\\");
REpattern.append ( c );
break;
default:
REpattern.append( c );
break;
}
}
REpattern.append( '$' );
return REpattern.toString();
}
}