Skip to content

Commit 370f113

Browse files
authored
Merge pull request #1095 from HubSpot/distinct-function-proxies
Make ELFunction proxies distinct on injected instance class name and package
2 parents e496e7b + 4c23c13 commit 370f113

3 files changed

Lines changed: 80 additions & 15 deletions

File tree

src/main/java/com/hubspot/jinjava/doc/JinjavaDocFactory.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ public class JinjavaDocFactory {
2626
private static final Class JINJAVA_DOC_CLASS =
2727
com.hubspot.jinjava.doc.annotations.JinjavaDoc.class;
2828

29-
private static final String GUICE_CLASS_INDICATOR = "$$EnhancerByGuice$$";
30-
3129
private final Jinjava jinjava;
3230

3331
public JinjavaDocFactory(Jinjava jinjava) {
@@ -320,11 +318,7 @@ private Map<String, String> extractMeta(JinjavaMetaValue[] metaValues) {
320318
private com.hubspot.jinjava.doc.annotations.JinjavaDoc getJinjavaDocAnnotation(
321319
Class<?> clazz
322320
) {
323-
if (
324-
clazz.getName().contains(GUICE_CLASS_INDICATOR) && clazz.getSuperclass() != null
325-
) {
326-
clazz = clazz.getSuperclass();
327-
}
321+
clazz = InjectedContextFunctionProxy.removeGuiceWrapping(clazz);
328322

329323
return clazz.getAnnotation(com.hubspot.jinjava.doc.annotations.JinjavaDoc.class);
330324
}

src/main/java/com/hubspot/jinjava/lib/fn/InjectedContextFunctionProxy.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,25 @@
1313
import javassist.bytecode.AccessFlag;
1414

1515
public class InjectedContextFunctionProxy {
16+
private static final String GUICE_CLASS_INDICATOR = "$$EnhancerByGuice$$";
1617

1718
public static ELFunctionDefinition defineProxy(
1819
String namespace,
1920
String name,
2021
Method m,
2122
Object injectedInstance
2223
) {
24+
Class<?> injectedInstanceClass = removeGuiceWrapping(injectedInstance.getClass());
2325
try {
2426
ClassPool pool = ClassPool.getDefault();
2527

26-
String ccName =
27-
InjectedContextFunctionProxy.class.getSimpleName() +
28-
"$$" +
29-
namespace +
30-
"$$" +
31-
name;
28+
String ccName = String.format(
29+
"%s$$%s$$%s$$%s",
30+
injectedInstanceClass.getName(),
31+
InjectedContextFunctionProxy.class.getSimpleName(),
32+
namespace,
33+
name
34+
);
3235
Class<?> injectedClass = null;
3336

3437
try {
@@ -97,4 +100,13 @@ public static ELFunctionDefinition defineProxy(
97100
throw new RuntimeException(e);
98101
}
99102
}
103+
104+
public static Class<?> removeGuiceWrapping(Class<?> clazz) {
105+
if (
106+
clazz.getName().contains(GUICE_CLASS_INDICATOR) && clazz.getSuperclass() != null
107+
) {
108+
clazz = clazz.getSuperclass();
109+
}
110+
return clazz;
111+
}
100112
}

src/test/java/com/hubspot/jinjava/lib/fn/InjectedContextFunctionProxyTest.java

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ public String concatState(String in) {
1919
}
2020
}
2121

22+
public static class OtherClass {
23+
private String state;
24+
25+
public OtherClass(String state) {
26+
this.state = state;
27+
}
28+
29+
public String prependState(String in) {
30+
return state + in;
31+
}
32+
}
33+
2234
@Test
2335
public void testDefineProxy() throws Exception {
2436
Method m = MyClass.class.getDeclaredMethod("concatState", String.class);
@@ -31,9 +43,56 @@ public void testDefineProxy() throws Exception {
3143
instance
3244
);
3345
assertThat(proxy.getName()).isEqualTo("ns:fooproxy");
34-
assertThat(proxy.getMethod().getDeclaringClass().getSimpleName())
35-
.isEqualTo(InjectedContextFunctionProxy.class.getSimpleName() + "$$ns$$fooproxy");
46+
assertThat(proxy.getMethod().getDeclaringClass().getName())
47+
.isEqualTo(
48+
MyClass.class.getName() +
49+
"$$" +
50+
InjectedContextFunctionProxy.class.getSimpleName() +
51+
"$$ns$$fooproxy"
52+
);
3653

3754
assertThat(proxy.getMethod().invoke(null, "foo")).isEqualTo("foobar");
3855
}
56+
57+
@Test
58+
public void testDefineMultipleProxies() throws Exception {
59+
Method concat = MyClass.class.getDeclaredMethod("concatState", String.class);
60+
MyClass myClassInstance = new MyClass("bar");
61+
62+
ELFunctionDefinition myClassProxy = InjectedContextFunctionProxy.defineProxy(
63+
"ns",
64+
"fooproxy",
65+
concat,
66+
myClassInstance
67+
);
68+
Method prepend = OtherClass.class.getDeclaredMethod("prependState", String.class);
69+
OtherClass otherClassInstance = new OtherClass("bar");
70+
71+
ELFunctionDefinition otherClassProxy = InjectedContextFunctionProxy.defineProxy(
72+
"ns",
73+
"fooproxy",
74+
prepend,
75+
otherClassInstance
76+
);
77+
assertThat(myClassProxy.getName()).isEqualTo("ns:fooproxy");
78+
assertThat(myClassProxy.getMethod().getDeclaringClass().getName())
79+
.isEqualTo(
80+
MyClass.class.getName() +
81+
"$$" +
82+
InjectedContextFunctionProxy.class.getSimpleName() +
83+
"$$ns$$fooproxy"
84+
);
85+
86+
assertThat(myClassProxy.getMethod().invoke(null, "foo")).isEqualTo("foobar");
87+
assertThat(otherClassProxy.getName()).isEqualTo("ns:fooproxy");
88+
assertThat(otherClassProxy.getMethod().getDeclaringClass().getName())
89+
.isEqualTo(
90+
OtherClass.class.getName() +
91+
"$$" +
92+
InjectedContextFunctionProxy.class.getSimpleName() +
93+
"$$ns$$fooproxy"
94+
);
95+
96+
assertThat(otherClassProxy.getMethod().invoke(null, "foo")).isEqualTo("barfoo");
97+
}
3998
}

0 commit comments

Comments
 (0)