Skip to content

Commit

Permalink
Provide common method filters
Browse files Browse the repository at this point in the history
  • Loading branch information
lioolli committed Jun 1, 2015
1 parent 11af28a commit 455997d
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 13 deletions.
@@ -0,0 +1,76 @@
/**
* Copyright 2014 NAVER Corp.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.navercorp.pinpoint.bootstrap.instrument;

/**
* @author Jongho Moon
*
*/
public class MethodFilters {

private MethodFilters() { }

public static MethodFilter name(String... names) {
return new MethodNameFilter(names);
}

public static MethodFilter modifier(int required) {
return modifier(required, 0);
}

public static MethodFilter modifierNot(int rejected) {
return modifier(0, rejected);
}

public static MethodFilter modifier(int required, int rejected) {
return new ModifierFilter(required, rejected);
}


private static final class MethodNameFilter implements MethodFilter {
private final String[] names;

public MethodNameFilter(String[] names) {
this.names = names;
}

@Override
public boolean filter(MethodInfo method) {
for (String name : names) {
if (name.equals(method.getName())) {
return false;
}
}

return true;
}
}

private static final class ModifierFilter implements MethodFilter {
private final int required;
private final int rejected;

public ModifierFilter(int required, int rejected) {
this.required = required;
this.rejected = rejected;
}

@Override
public boolean filter(MethodInfo method) {
int modifier = method.getModifiers();
return ((required & modifier) != required) || ((rejected & modifier) != 0);
}
}
}
Expand Up @@ -32,7 +32,7 @@ public interface BaseClassFileTransformerBuilder {

public void weave(String aspectClassName);

public MethodTransformerBuilder editMethods(MethodFilter filter);
public MethodTransformerBuilder editMethods(MethodFilter... filter);

public MethodTransformerBuilder editMethod(String name, String... parameterTypeNames);

Expand Down
Expand Up @@ -139,7 +139,7 @@ private MethodTransformer createFilteredMethodEditor(TargetFilter annotation, In
MethodFilter filter = (MethodFilter)filterFactory.createInstance(ObjectRecipe.byConstructor(type, (Object[])annotation.constructorArguments()));
MethodRecipe recipe = annotation.singleton() ? new SharedAnnotatedInterceptorInjector(injector) : injector;

return new FilteringMethodTransformer(filter, Arrays.<MethodRecipe>asList(recipe), null);
return new FilteringMethodTransformer(new MethodFilter[] { filter }, Arrays.<MethodRecipe>asList(recipe), null);
}

@Override
Expand Down
Expand Up @@ -95,8 +95,8 @@ public InterceptorBuilder injectInterceptor(String className, Object... construc
}

@Override
public MethodTransformerBuilder editMethods(MethodFilter filter) {
DefaultMethodEditorBuilder builder = new DefaultMethodEditorBuilder(filter);
public MethodTransformerBuilder editMethods(MethodFilter... filters) {
DefaultMethodEditorBuilder builder = new DefaultMethodEditorBuilder(filters);
recipeBuilders.add(builder);
return builder;
}
Expand Down Expand Up @@ -215,27 +215,27 @@ public MethodRecipe buildRecipe() {
public class DefaultMethodEditorBuilder implements MethodTransformerBuilder, ConstructorTransformerBuilder, RecipeBuilder<ClassRecipe> {
private final String methodName;
private final String[] parameterTypeNames;
private final MethodFilter filter;
private final MethodFilter[] filters;
private final List<RecipeBuilder<MethodRecipe>> recipeBuilders = new ArrayList<RecipeBuilder<MethodRecipe>>();
private final EnumSet<MethodTransformerProperty> properties = EnumSet.noneOf(MethodTransformerProperty.class);
private MethodTransformerExceptionHandler exceptionHandler;

private DefaultMethodEditorBuilder(String... parameterTypeNames) {
this.methodName = null;
this.parameterTypeNames = parameterTypeNames;
this.filter = null;
this.filters = null;
}

private DefaultMethodEditorBuilder(String methodName, String... parameterTypeNames) {
this.methodName = methodName;
this.parameterTypeNames = parameterTypeNames;
this.filter = null;
this.filters = null;
}

private DefaultMethodEditorBuilder(MethodFilter filter) {
private DefaultMethodEditorBuilder(MethodFilter[] filters) {
this.methodName = null;
this.parameterTypeNames = null;
this.filter = filter;
this.filters = filters;
}

@Override
Expand Down Expand Up @@ -265,8 +265,8 @@ public MethodTransformer buildRecipe() {

private MethodTransformer buildMethodEditor(List<MethodRecipe> recipes) {
MethodTransformer transformer;
if (filter != null) {
transformer = new FilteringMethodTransformer(filter, recipes, exceptionHandler);
if (filters != null && filters.length > 0) {
transformer = new FilteringMethodTransformer(filters, recipes, exceptionHandler);
} else if (methodName != null) {
transformer = new DedicatedMethodTransformer(methodName, parameterTypeNames, recipes, exceptionHandler, properties.contains(MethodTransformerProperty.IGNORE_IF_NOT_EXIST));
} else {
Expand Down
Expand Up @@ -34,8 +34,8 @@ public class FilteringMethodTransformer implements MethodTransformer {
private final List<MethodRecipe> recipes;
private final MethodTransformerExceptionHandler exceptionHandler;

public FilteringMethodTransformer(MethodFilter filter, List<MethodRecipe> recipes, MethodTransformerExceptionHandler handler) {
this.filter = filter;
public FilteringMethodTransformer(MethodFilter[] filters, List<MethodRecipe> recipes, MethodTransformerExceptionHandler handler) {
this.filter = filters.length == 1 ? filters[0] : new AndFilter(filters);
this.recipes = recipes;
this.exceptionHandler = handler;
}
Expand Down Expand Up @@ -74,4 +74,23 @@ public String toString() {
builder.append(']');
return builder.toString();
}

private static final class AndFilter implements MethodFilter {
private final MethodFilter[] filters;

public AndFilter(MethodFilter[] filters) {
this.filters = filters;
}

@Override
public boolean filter(MethodInfo method) {
for (MethodFilter filter : filters) {
if (filter.filter(method)) {
return true;
}
}

return false;
}
}
}

0 comments on commit 455997d

Please sign in to comment.