Empty string means '.*' pattern
This commit is contained in:
+19
-12
@@ -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>();
|
||||||
|
|||||||
Reference in New Issue
Block a user