From 9a22a65e6494b2ea49dd1711fe509b4a4ea300af Mon Sep 17 00:00:00 2001 From: Allan-QLB Date: Wed, 27 Nov 2024 17:51:48 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dognl=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E8=8E=B7=E5=8F=96=E5=AD=97=E6=AE=B5=E5=80=BC=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=B1=BB=E5=9E=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../express/ArthasObjectPropertyAccessor.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java b/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java index f83d330448d..a028de4caf5 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java @@ -5,12 +5,25 @@ import ognl.ObjectPropertyAccessor; import ognl.OgnlContext; import ognl.OgnlException; +import ognl.OgnlRuntime; /** * @author hengyunabc 2022-03-24 */ public class ArthasObjectPropertyAccessor extends ObjectPropertyAccessor { + @Override + public Object getPossibleProperty(OgnlContext context, Object target, String name) throws OgnlException { + Object result; + try { + result = OgnlRuntime.getFieldValue(context, target, name, true); + } catch (Exception ex) { + throw new OgnlException(name, ex); + } + + return result; + } + @Override public Object setPossibleProperty(OgnlContext context, Object target, String name, Object value) throws OgnlException { if (GlobalOptions.strict) { From 25992ae8c098c14016b655536facb9db2fe3c8b1 Mon Sep 17 00:00:00 2001 From: Allan-QLB Date: Wed, 27 Nov 2024 18:40:29 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/express/ArthasObjectPropertyAccessor.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java b/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java index a028de4caf5..14942fa39f6 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java @@ -7,16 +7,18 @@ import ognl.OgnlException; import ognl.OgnlRuntime; +import java.util.Map; + /** * @author hengyunabc 2022-03-24 */ public class ArthasObjectPropertyAccessor extends ObjectPropertyAccessor { @Override - public Object getPossibleProperty(OgnlContext context, Object target, String name) throws OgnlException { + public Object getPossibleProperty(Map context, Object target, String name) throws OgnlException { Object result; try { - result = OgnlRuntime.getFieldValue(context, target, name, true); + result = OgnlRuntime.getFieldValue((OgnlContext) context, target, name, true); } catch (Exception ex) { throw new OgnlException(name, ex); } @@ -25,7 +27,7 @@ public Object getPossibleProperty(OgnlContext context, Object target, String nam } @Override - public Object setPossibleProperty(OgnlContext context, Object target, String name, Object value) throws OgnlException { + public Object setPossibleProperty(Map context, Object target, String name, Object value) throws OgnlException { if (GlobalOptions.strict) { throw new IllegalAccessError(GlobalOptions.STRICT_MESSAGE); } From a1bf19ca03e7416bb3c6fc3ae87653ad44026687 Mon Sep 17 00:00:00 2001 From: Allan-QLB Date: Thu, 19 Dec 2024 16:49:54 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../express/ArthasObjectPropertyAccessor.java | 1 - .../ArthasObjectPropertyAccessorTest.java | 57 +++++++++++++++++++ .../arthas/core/command/express/Fetcher.java | 45 +++++++++++++++ .../core/command/express/FlowAttribute.java | 7 +++ .../core/command/express/FlowContext.java | 8 +++ 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessorTest.java create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/Fetcher.java diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java b/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java index 6305fcae21d..cab20626a2a 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessor.java @@ -9,7 +9,6 @@ import ognl.OgnlException; import ognl.OgnlRuntime; -import java.util.Map; /** * @author hengyunabc 2022-03-24 diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessorTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessorTest.java new file mode 100644 index 00000000000..c8367dc28ce --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/command/express/ArthasObjectPropertyAccessorTest.java @@ -0,0 +1,57 @@ +package com.taobao.arthas.core.command.express; + +import com.taobao.arthas.core.advisor.Advice; +import ognl.OgnlException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class ArthasObjectPropertyAccessorTest { + + private Express express; + + @BeforeEach + public void setUp () { + Fetcher fetcher = new Fetcher().add(new Fetcher.Fetch() + .add(new FlowContext("aa")) + .add(new FlowContext("bb")) + ).add(new Fetcher.Fetch() + .add(new FlowContext("cc")) + .add(new FlowContext("dd")) + .add(new FlowContext("ee")) + ); + + Object[] params = new Object[4]; + params[0] = fetcher; + Advice advice = Advice.newForAfterReturning(null, getClass(), null, null, params, null); + express = ExpressFactory.unpooledExpress(null).bind(advice); + } + + @Test + void getPossibleProperty() throws ExpressException { + assertInstanceOf(List.class, express.get("params[0].completedFetches")); + assertEquals(2, ((List) express.get("params[0].completedFetches")).size()); + assertThrows(ExpressException.class, () -> express.is("params[0].hasCompletedFetches")); + assertTrue(express.is("params[0].hasCompletedFetches()")); + assertThrows(ExpressException.class, () -> express.is("params[0].getCompletedFetches")); + assertTrue(express.is("params[0].getCompletedFetches()")); + assertInstanceOf(Fetcher.Fetch.class, express.get("params[0].completedFetches[1]")); + assertInstanceOf(List.class, express.get("params[0].completedFetches[1].flowContexts")); + assertEquals(3, ((List) express.get("params[0].completedFetches[1].flowContexts")).size()); + assertTrue(express.is("params[0].completedFetches[1].hasFlowContexts()")); + assertTrue(express.is("params[0].completedFetches[1].getFlowContexts()")); + assertInstanceOf(List.class, express.get("params[0].completedFetches[1].getFlowContexts1()")); + assertInstanceOf(List.class, express.get("params[0].completedFetches.{flowContexts.{flowAttribute.bxApp}}")); + assertIterableEquals(Arrays.asList( + Arrays.asList("aa", "bb"), + Arrays.asList("cc", "dd", "ee") + ), (Iterable) express.get("params[0].completedFetches.{flowContexts.{flowAttribute.bxApp}}")); + } + + + +} \ No newline at end of file diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/Fetcher.java b/core/src/test/java/com/taobao/arthas/core/command/express/Fetcher.java new file mode 100644 index 00000000000..7462d3757c0 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/command/express/Fetcher.java @@ -0,0 +1,45 @@ +package com.taobao.arthas.core.command.express; + + +import java.util.ArrayList; +import java.util.List; + +public class Fetcher { + private final List completedFetches = new ArrayList<>(); + + public boolean hasCompletedFetches() { + return !completedFetches.isEmpty(); + } + + public boolean getCompletedFetches() { + return hasCompletedFetches(); + } + + public Fetcher add(Fetch fetch) { + completedFetches.add(fetch); + return this; + } + + public static class Fetch { + private final List flowContexts = new ArrayList<>(); + public boolean hasFlowContexts() { + return !flowContexts.isEmpty(); + } + + public boolean getFlowContexts() { + return !flowContexts.isEmpty(); + } + + public List getFlowContexts1() { + return flowContexts; + } + + public Fetch add(FlowContext flowContext) { + flowContexts.add(flowContext); + return this; + } + + } +} + + diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java b/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java index 1848b650ca1..f52a40a69fd 100644 --- a/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java +++ b/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java @@ -3,6 +3,13 @@ public class FlowAttribute { private String bxApp = "aaa"; + public FlowAttribute() { + } + + public FlowAttribute(String bxApp) { + this.bxApp = bxApp; + } + public String getBxApp() { return this.bxApp ; } diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java b/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java index c1991bdbe79..bf3d0211b2b 100644 --- a/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java +++ b/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java @@ -3,6 +3,14 @@ public class FlowContext { private FlowAttribute flowAttribute = new FlowAttribute(); + + public FlowContext() { + } + + public FlowContext(String app) { + this.flowAttribute = new FlowAttribute(app); + } + public FlowAttribute getFlowAttribute() { return this.flowAttribute ; }