Empty string means '.*' pattern

This commit is contained in:
Andrey Breslav
2013-05-12 10:44:19 +02:00
parent 90661e8706
commit 35f2993ec9
@@ -30,6 +30,7 @@ import java.util.regex.Pattern;
import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.asm4.Opcodes.*;
public class InterceptionInstrumenter implements Instrumenter { public class InterceptionInstrumenter implements Instrumenter {
private static final Pattern ANYTHING = Pattern.compile(".*");
private final Map<String, ClassMatcher> classPatterns = new LinkedHashMap<String, ClassMatcher>(); private final Map<String, ClassMatcher> classPatterns = new LinkedHashMap<String, ClassMatcher>();
private final Set<String> neverMatchedClassPatterns = new LinkedHashSet<String>(); private final Set<String> neverMatchedClassPatterns = new LinkedHashSet<String>();
@@ -55,8 +56,8 @@ public class InterceptionInstrumenter implements Instrumenter {
throw new IllegalArgumentException("Non-static field annotated @MethodInterceptor: " + field); throw new IllegalArgumentException("Non-static field annotated @MethodInterceptor: " + field);
} }
Pattern classPattern = Pattern.compile(annotation.className()); Pattern classPattern = compilePattern(annotation.className());
List<MethodInstrumenter> instrumenters = addClassPattern(classPattern.pattern()); List<MethodInstrumenter> instrumenters = addClassPattern(classPattern);
try { try {
Object interceptor = field.get(null); Object interceptor = field.get(null);
@@ -93,11 +94,12 @@ public class InterceptionInstrumenter implements Instrumenter {
String nameFromAnnotation = annotation.methodName(); String nameFromAnnotation = annotation.methodName();
String methodName = nameFromAnnotation.isEmpty() ? field.getName() : nameFromAnnotation; String methodName = nameFromAnnotation.isEmpty() ? field.getName() : nameFromAnnotation;
MethodInstrumenterImpl instrumenter = new MethodInstrumenterImpl( MethodInstrumenterImpl instrumenter = new MethodInstrumenterImpl(
Pattern.compile(methodName), compilePattern(methodName),
Pattern.compile(annotation.erasedSignature()), compilePattern(annotation.erasedSignature()),
annotation.allowMultipleMatches(), annotation.allowMultipleMatches(),
enterData, enterData,
exitData); exitData
);
instrumenters.add(instrumenter); instrumenters.add(instrumenter);
neverMatchedInstrumenters.add(instrumenter); neverMatchedInstrumenters.add(instrumenter);
} }
@@ -108,12 +110,12 @@ public class InterceptionInstrumenter implements Instrumenter {
} }
} }
private List<MethodInstrumenter> addClassPattern(String classPattern) { private List<MethodInstrumenter> addClassPattern(Pattern classPattern) {
ClassMatcher classMatcher = classPatterns.get(classPattern); ClassMatcher classMatcher = classPatterns.get(classPattern.pattern());
if (classMatcher == null) { if (classMatcher == null) {
classMatcher = new ClassMatcher(Pattern.compile(classPattern)); classMatcher = new ClassMatcher(classPattern);
classPatterns.put(classPattern, classMatcher); classPatterns.put(classPattern.pattern(), classMatcher);
neverMatchedClassPatterns.add(classPattern); neverMatchedClassPatterns.add(classPattern.pattern());
} }
return classMatcher.instrumenters; return classMatcher.instrumenters;
} }
@@ -308,6 +310,11 @@ public class InterceptionInstrumenter implements Instrumenter {
} }
} }
private static Pattern compilePattern(String regex) {
if (regex.isEmpty()) return ANYTHING;
return Pattern.compile(regex);
}
private static class ClassMatcher { private static class ClassMatcher {
private final Pattern classPattern; private final Pattern classPattern;
private final List<MethodInstrumenter> instrumenters = new ArrayList<MethodInstrumenter>(); private final List<MethodInstrumenter> instrumenters = new ArrayList<MethodInstrumenter>();