remove reflection around regex classes

This commit is contained in:
Doug MacEachern 2007-11-13 05:38:37 +00:00
parent 224ef34f14
commit 2fd3beab06
1 changed files with 9 additions and 38 deletions

View File

@ -18,55 +18,26 @@
package org.hyperic.sigar.ptql; package org.hyperic.sigar.ptql;
import java.lang.reflect.Method;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.hyperic.sigar.util.ReferenceMap; import org.hyperic.sigar.util.ReferenceMap;
public class StringPattern { public class StringPattern {
static Class patternClass; private static Map patterns = ReferenceMap.synchronizedMap();
static Method compile, matcher, find;
private static Map patterns = null;
//XXX avoiding 1.4 requirement
private static void init() throws Exception {
patterns = ReferenceMap.synchronizedMap();
patternClass = Class.forName("java.util.regex.Pattern");
Class matcherClass = Class.forName("java.util.regex.Matcher");
Class[] arg = { String.class };
compile = patternClass.getDeclaredMethod("compile", arg);
arg = new Class[] { Class.forName("java.lang.CharSequence") };
matcher = patternClass.getDeclaredMethod("matcher", arg);
find = matcherClass.getDeclaredMethod("find", new Class[0]);
}
/** /**
* Wrapper around Pattern.compile(regex).matcher(source).find() * Wrapper around Pattern.compile(regex).matcher(source).find()
*/ */
public static boolean matches(String source, String regex) { public static boolean matches(String source, String regex) {
try { Pattern pattern = (Pattern)patterns.get(regex);
if (patterns == null) {
init();
}
Object pattern = patterns.get(regex);
if (pattern == null) { if (pattern == null) {
//pattern = Pattern.compile(regex) pattern = Pattern.compile(regex);
pattern = compile.invoke(patternClass, new Object[] { regex });
patterns.put(regex, pattern); patterns.put(regex, pattern);
} }
//m = pattern.matcher(source) Matcher matcher = pattern.matcher(source);
Object m = matcher.invoke(pattern, new Object[] { source }); return matcher.find();
//result = m.find()
Boolean result = (Boolean)find.invoke(m, new Object[0]);
return result.booleanValue();
} catch (Exception e) {
System.err.println("Error matching '" +
regex + "' against '" +
source + "'");
e.printStackTrace();
return false;
}
} }
} }