Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#noissue] Add specific filter for Instrument #12004

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,17 @@ public interface InstrumentClass {

InstrumentMethod getConstructor(String... parameterTypes);

InstrumentMethod getConstructor(MethodFilter filter);

List<InstrumentMethod> getDeclaredConstructors();

List<InstrumentMethod> getDeclaredMethods();

List<InstrumentMethod> getDeclaredMethods(MethodFilter filter);

InstrumentMethod getDeclaredMethod(String name, String... parameterTypes);

InstrumentMethod getDeclaredMethod(String name, MethodFilter filter);

@Deprecated
InstrumentMethod getLambdaMethod(String... parameterTypes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,35 @@ public List<InstrumentMethod> getDeclaredMethods(final MethodFilter methodFilter
return candidateList;
}

@Override
public InstrumentMethod getDeclaredMethod(final String methodName, final MethodFilter methodFilter) {
Objects.requireNonNull(methodName, "name");
Objects.requireNonNull(methodFilter, "methodFilter");

final List<ASMMethodNodeAdapter> declaredMethod = this.classNode.getDeclaredMethod(methodName);
if (declaredMethod.isEmpty()) {
return null;
}
for (ASMMethodNodeAdapter methodNode : declaredMethod) {
final InstrumentMethod method = new ASMMethod(this.engineComponent, this.pluginContext, this, methodNode);
if (methodFilter.accept(method)) {
return method;
}
}

return null;
}

@Override
public InstrumentMethod getConstructor(final String... parameterTypes) {
return getDeclaredMethod("<init>", parameterTypes);
}

@Override
public InstrumentMethod getConstructor(final MethodFilter methodFilter) {
return getDeclaredMethod("<init>", methodFilter);
}

@Override
public List<InstrumentMethod> getDeclaredConstructors() {
final List<InstrumentMethod> candidateList = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,14 @@ public ASMMethodNodeAdapter getDeclaredMethod(final String methodName, final Str
return findDeclaredMethod(methodName, desc);
}

public List<ASMMethodNodeAdapter> getDeclaredMethod(final String methodName) {
if (this.skipCode) {
throw new IllegalStateException("not supported operation, skipCode option is true.");
}

return findDeclaredMethod(methodName);
}

public List<ASMMethodNodeAdapter> getDeclaredConstructors() {
if (this.skipCode) {
throw new IllegalStateException("not supported operation, skipCode option is true.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@ public InstrumentMethod getDeclaredMethod(String name, String... parameterTypes)
return null;
}

@Override
public InstrumentMethod getDeclaredMethod(String name, MethodFilter filter) {
return null;
}

@Override
@Deprecated
public InstrumentMethod getLambdaMethod(String... parameterTypes) {
Expand Down Expand Up @@ -110,6 +115,11 @@ public InstrumentMethod getConstructor(String... parameterTypes) {
return null;
}

@Override
public InstrumentMethod getConstructor(MethodFilter filter) {
return null;
}

@Override
public List<InstrumentMethod> getDeclaredConstructors() {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ public void getDeclaredMethod() {
ASMClassNodeAdapter adapter = ASMClassNodeAdapter.get(pluginClassInputStreamProvider, ASMClassNodeLoader.getClassLoader(),
getClass().getProtectionDomain(), "com/navercorp/pinpoint/profiler/instrument/mock/ArgsClass");
List<ASMMethodNodeAdapter> constructors = adapter.getDeclaredConstructors();
assertThat(constructors).hasSize(2);
assertThat(constructors).hasSize(4);
assertEquals("ArgsClass", constructors.get(0).getName());

assertEquals("ArgsClass", constructors.get(1).getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
import org.objectweb.asm.tree.ClassNode;

import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down Expand Up @@ -256,18 +257,40 @@ public void getDeclaredMethods() throws Exception {
assertEquals("arg", methods.get(0).getName());
}

@Test
public void getSpecificDeclaredMethod() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
InstrumentMethod method1 = clazz.getDeclaredMethod("argSpecificMethod", MethodFilters.chain(
MethodFilters.argAt(1, "long")
));
assertNotNull(method1);
assertEquals(2, method1.getParameterTypes().length);
assertEquals("int", method1.getParameterTypes()[0]);
}

@Test
public void getDeclaredConstructors() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
List<InstrumentMethod> constructors = clazz.getDeclaredConstructors();
assertNotNull(constructors);
assertThat(constructors).hasSize(2);
assertThat(constructors).hasSize(4);
assertEquals("ArgsClass", constructors.get(0).getName());

assertEquals("ArgsClass", constructors.get(1).getName());
assertArrayEquals(new String[]{"int"}, constructors.get(1).getParameterTypes());
}

@Test
public void getSpecificDeclaredConstructor() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
InstrumentMethod constructor = clazz.getConstructor(MethodFilters.chain(
MethodFilters.name("ArgsClass"),
MethodFilters.argAt(1, "int")
));
assertNotNull(constructor);
assertEquals("java.lang.String", constructor.getParameterTypes()[0]);
}

@Test
public void hasDeclaredMethod() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ public ArgsClass() {
public ArgsClass(int a) {
}

public ArgsClass(String a) {
}

public ArgsClass(String a, int b) {
}


public void arg() {
}
Expand Down Expand Up @@ -109,4 +115,10 @@ public void argObject4(String a, Integer b, Long c, Float d) {
public void argString5(String a, String b, String c, String d, String e) {
}

public void argSpecificMethod(int a) {
}

public void argSpecificMethod(int a, long b) {
}

}