From dbb4af32f24e4b2420b2a8ee59ef435cf44f90e8 Mon Sep 17 00:00:00 2001 From: thji Date: Wed, 26 Mar 2025 21:12:58 +0800 Subject: [PATCH 1/2] feat: add root object --- .../dynamic/common/ExpressionParseUtil.java | 28 ++++++++++++++- .../common/ExpressionParseUtilTest.java | 36 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java b/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java index 26f039684..a1ed66f77 100644 --- a/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java +++ b/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java @@ -42,13 +42,15 @@ public static String generateKey(Method method, Object[] args, String keyExpress if (expression == null) { return null; } + // create root object + MethodRootObject rootObject = new MethodRootObject(method, args); try { String[] parameterNames = NAME_DISCOVERER.getParameterNames(method); if (parameterNames == null || args.length != parameterNames.length) { return null; } - EvaluationContext context = new StandardEvaluationContext(); + EvaluationContext context = new StandardEvaluationContext(rootObject); for (int i = 0; i < args.length; i++) { context.setVariable(parameterNames[i], args[i]); } @@ -62,6 +64,30 @@ public static String generateKey(Method method, Object[] args, String keyExpress } } + + private static class MethodRootObject { + private final Method method; + private final Object[] args; + + private MethodRootObject(Method method, Object[] args) { + this.method = method; + this.args = args; + } + + public String getMethodName() { + return method.getName(); + } + + public Method getMethod() { + return this.method; + } + + public Object[] getArgs() { + return this.args; + } + + } + public static String replaceToExpression(Method method, String additionalSignature) { if (method == null || StringUtil.isEmpty(additionalSignature)) { return null; diff --git a/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/ExpressionParseUtilTest.java b/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/ExpressionParseUtilTest.java index 7d8e6cb59..a3cd26d97 100644 --- a/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/ExpressionParseUtilTest.java +++ b/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/ExpressionParseUtilTest.java @@ -114,6 +114,42 @@ static Stream generateKeyArgs() throws NoSuchMethodException { Foo1.class), "T(io.arex.inst.dynamic.common.ExpressionParseUtilTest).getMapKey(#f1.f1, #f1.f2)", (Predicate) "getMapKey-p1-1"::equals + ), + Arguments.of( + new Object[]{ + new Foo2("p1", 1), + new Foo2("p2", 2), + new Foo1(new Foo2("p3", 3)) + }, + ExpressionParseUtilTest.class.getDeclaredMethod("testParseMethodKey3", Foo2.class, + Foo2.class, + Foo1.class), + "#root.methodName + #f1.getF2() + #f2.getF2().toString() + #f3.getFoo2().f1", + (Predicate) "testParseMethodKey312p3"::equals + ), + Arguments.of( + new Object[]{ + new Foo2("p1", 1), + new Foo2("p2", 2), + new Foo1(new Foo2("p3", 3)) + }, + ExpressionParseUtilTest.class.getDeclaredMethod("testParseMethodKey3", Foo2.class, + Foo2.class, + Foo1.class), + "#root.method.name + #f1.getF2() + #f2.getF2().toString() + #f3.getFoo2().f1", + (Predicate) "testParseMethodKey312p3"::equals + ), + Arguments.of( + new Object[]{ + new Foo2("p1", 1), + new Foo2("p2", 2), + new Foo1(new Foo2("p3", 3)) + }, + ExpressionParseUtilTest.class.getDeclaredMethod("testParseMethodKey3", Foo2.class, + Foo2.class, + Foo1.class), + "#root.args[0].getF2().toString + #f1.getF2() + #f2.getF2().toString() + #f3.getFoo2().f1", + (Predicate) "112p3"::equals ) ); } From e6428f2a3f5881ee3b53e88d03af470129819067 Mon Sep 17 00:00:00 2001 From: thji Date: Thu, 3 Apr 2025 17:27:55 +0800 Subject: [PATCH 2/2] feat: code style --- .../arex/inst/dynamic/common/ExpressionParseUtil.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java b/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java index a1ed66f77..d8cddf462 100644 --- a/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java +++ b/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/ExpressionParseUtil.java @@ -42,14 +42,16 @@ public static String generateKey(Method method, Object[] args, String keyExpress if (expression == null) { return null; } - // create root object - MethodRootObject rootObject = new MethodRootObject(method, args); + try { String[] parameterNames = NAME_DISCOVERER.getParameterNames(method); if (parameterNames == null || args.length != parameterNames.length) { return null; } + + MethodRootObject rootObject = new MethodRootObject(method, args); + EvaluationContext context = new StandardEvaluationContext(rootObject); for (int i = 0; i < args.length; i++) { context.setVariable(parameterNames[i], args[i]); @@ -64,7 +66,10 @@ public static String generateKey(Method method, Object[] args, String keyExpress } } - + /** + * the root object used during the expression evaluation. It contains the method and its + * arguments. + */ private static class MethodRootObject { private final Method method; private final Object[] args;