From b126872f3c28803fd9d43815789edd5940151648 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Mon, 7 Oct 2024 21:09:52 +0800 Subject: [PATCH 01/27] [support qlexpress] --- core/pom.xml | 8 +- .../com/taobao/arthas/core/GlobalOptions.java | 24 ++++ .../core/command/express/ExpressFactory.java | 39 +++++-- .../core/command/express/QLExpress.java | 108 ++++++++++++++++++ .../core/command/express/QLExpressRunner.java | 34 ++++++ .../core/command/express/QLGlobalContext.java | 49 ++++++++ .../core/command/klass100/OgnlCommand.java | 16 +-- .../core/command/model/ExpressTypeEnum.java | 21 ++++ .../command/model/QLExpressConfigModel.java | 97 ++++++++++++++++ pom.xml | 5 + 10 files changed, 384 insertions(+), 17 deletions(-) create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java create mode 100644 core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java create mode 100644 core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java diff --git a/core/pom.xml b/core/pom.xml index 6899d764cce..e0949c9643e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -22,8 +22,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.6 - 1.6 + 8 + 8 UTF-8 true @@ -222,6 +222,10 @@ ognl ognl + + com.alibaba + QLExpress4 + junit junit diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 6e623e00c0c..6dc79ac3257 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -11,6 +11,8 @@ public class GlobalOptions { + "not allowed to set object properties. " + "Want to set object properties, execute `options strict false`"; + public static final String QLEXPRESS_CONFIG = "qlexpress-config"; + /** * 是否支持系统类
* 这个开关打开之后将能代理到来自JVM的部分类,由于有非常强的安全风险可能会引起系统崩溃
@@ -136,4 +138,26 @@ public class GlobalOptions { description = STRICT_MESSAGE ) public static volatile boolean strict = true; + + + /** + * 是否切换使用表达式ognl/qlexpress开关 + */ + @Option(level = 1, + name = "express-type", + summary = "Option to use ognl/qlExpress", + description = "Option to use ognl/qlExpress in commands, default ognl" + ) + public static volatile String ExpressType = "ognl"; + + + /** + * qlexpress使用参数 + */ + @Option(level = 1, + name = QLEXPRESS_CONFIG, + summary = "config init when use qlExpress, example: {\"\": \"\"} ", + description = "" + ) + public static volatile String QLExpressConfig = ""; } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index d2d578bc17f..a1bba017f00 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -1,18 +1,18 @@ package com.taobao.arthas.core.command.express; +import com.alibaba.fastjson.JSON; +import com.taobao.arthas.core.GlobalOptions; +import com.taobao.arthas.core.command.model.ExpressTypeEnum; +import com.taobao.arthas.core.command.model.QLExpressConfigModel; + /** * ExpressFactory * @author ralf0131 2017-01-04 14:40. * @author hengyunabc 2018-10-08 */ public class ExpressFactory { - - private static final ThreadLocal expressRef = new ThreadLocal() { - @Override - protected Express initialValue() { - return new OgnlExpress(); - } - }; + private static final ThreadLocal expressRef = ThreadLocal.withInitial(() -> new OgnlExpress()); + private static final ThreadLocal expressRefQLExpress = ThreadLocal.withInitial(() -> new QLExpress()); /** * get ThreadLocal Express Object @@ -20,13 +20,38 @@ protected Express initialValue() { * @return */ public static Express threadLocalExpress(Object object) { + if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) { + return expressRefQLExpress.get().reset().bind(object); + } return expressRef.get().reset().bind(object); } public static Express unpooledExpress(ClassLoader classloader) { + if (classloader == null) { + classloader = ClassLoader.getSystemClassLoader(); + } + if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) { + return new QLExpress(classloader); + } + return new OgnlExpress(new ClassLoaderClassResolver(classloader)); + } + + public static Express unpooledExpressByOGNL(ClassLoader classloader) { if (classloader == null) { classloader = ClassLoader.getSystemClassLoader(); } return new OgnlExpress(new ClassLoaderClassResolver(classloader)); } + + public static boolean checkQLExpressConfig(String configValue) { + try { + if ("".equals(configValue)) { + return true; + } + JSON.parseObject(configValue, QLExpressConfigModel.class); + return true; + }catch (Throwable t){ + return false; + } + } } \ No newline at end of file diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java new file mode 100644 index 00000000000..9217bd22398 --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -0,0 +1,108 @@ +package com.taobao.arthas.core.command.express; + +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; +import com.alibaba.fastjson.JSON; +import com.alibaba.qlexpress4.Express4Runner; +import com.alibaba.qlexpress4.InitOptions; +import com.alibaba.qlexpress4.QLOptions; +import com.taobao.arthas.core.GlobalOptions; +import com.taobao.arthas.core.command.model.QLExpressConfigModel; + + +/** + * @Author TaoKan + * @Date 2024/9/17 6:01 PM + */ +public class QLExpress implements Express { + private static final Logger logger = LoggerFactory.getLogger(QLExpress.class); + private Express4Runner expressRunner; + private QLGlobalContext qlGlobalContext; + private Object runResult; + + private QLExpressConfigModel qlExpressConfigModel; + + private QLOptions qlOptions; + + private InitOptions initOptions; + + public QLExpress() { + initQLExpress(); + initConfig(null); + initContext(); + } + + public QLExpress(ClassLoader classloader) { + initQLExpress(); + initConfig(classloader); + initContext(); + } + + private void initConfig(ClassLoader classloader) { + try { + QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class); + this.qlExpressConfigModel = qlExpressConfigModel; + QLOptions.Builder qlOptionsBuilder = QLOptions.builder(); + qlOptionsBuilder.cache(qlExpressConfigModel.isCache()); + qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer()); + qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength()); + qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext()); + qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise()); + qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis()); + qlOptions = qlOptionsBuilder.build(); + + InitOptions.Builder initOptionsBuilder = InitOptions.builder(); + initOptionsBuilder.allowPrivateAccess(qlExpressConfigModel.isAllowPrivateAccess()); + initOptionsBuilder.debug(qlExpressConfigModel.isDebug()); + initOptionsBuilder.useCacheClear(qlExpressConfigModel.isUseCacheClear()); + initOptions = initOptionsBuilder.build(); + //4.0设置InitOptions + }catch (Throwable t){ + //异常不设置options + logger.error("Error Init Options For QLExpress:", t); + } + } + + private void initQLExpress() { + expressRunner = QLExpressRunner.getInstance(); + } + + private void initContext() { + qlGlobalContext = new QLGlobalContext(); + } + + @Override + public Object get(String express) throws ExpressException { + try { + Object result = expressRunner.execute(express, qlGlobalContext, qlOptions); + return result; + } catch (Exception e) { + logger.error("Error during evaluating the expression with QLExpress:", e); + throw new ExpressException(express, e); + } + } + + @Override + public boolean is(String express) throws ExpressException { + final Object ret = get(express); + return ret instanceof Boolean && (Boolean) ret; + } + + @Override + public Express bind(Object object) { + qlGlobalContext.bindObj(object); + return this; + } + + @Override + public Express bind(String name, Object value) { + qlGlobalContext.put(name, value); + return this; + } + + @Override + public Express reset() { + qlGlobalContext.clear(); + return this; + } +} diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java new file mode 100644 index 00000000000..2c6cfee71f6 --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java @@ -0,0 +1,34 @@ +package com.taobao.arthas.core.command.express; + + +import com.alibaba.qlexpress4.Express4Runner; +import com.alibaba.qlexpress4.InitOptions; + +/** + * @Author TaoKan + * @Date 2024/9/22 12:20 PM + */ +public class QLExpressRunner { + private volatile static QLExpressRunner instance = null; + private Express4Runner expressRunner; + + private QLExpressRunner(){ + expressRunner = new Express4Runner(InitOptions.DEFAULT_OPTIONS); + } + + //对外提供静态方法获取对象 + public static Express4Runner getInstance(){ + //第一次判断,如果instance不为null,不进入抢锁阶段,直接返回实例 + if(instance == null){ + synchronized (QLExpressRunner.class){ + //抢到锁之后再次进行判断是否为null + if(instance == null){ + instance = new QLExpressRunner(); + } + } + } + return instance.expressRunner; + } + + +} diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java new file mode 100644 index 00000000000..1a510178a4b --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java @@ -0,0 +1,49 @@ +package com.taobao.arthas.core.command.express; + +import com.alibaba.qlexpress4.exception.PureErrReporter; +import com.alibaba.qlexpress4.runtime.ReflectLoader; +import com.alibaba.qlexpress4.runtime.Value; +import com.alibaba.qlexpress4.runtime.context.ExpressContext; +import com.alibaba.qlexpress4.runtime.data.MapItemValue; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author TaoKan + * @Date 2024/9/22 12:39 PM + */ +public class QLGlobalContext implements ExpressContext { + private Map context; + private Object object; + private ReflectLoader reflectLoader; + + public QLGlobalContext(Map context, Object bindObject, ReflectLoader reflectLoader) { + this.context = context; + this.object = bindObject; + this.reflectLoader = reflectLoader; + } + + public QLGlobalContext() { + this.context = new ConcurrentHashMap<>(); + } + + public void put(String name, Object value){ + context.put(name, value); + } + + public void clear() { + context.clear(); + } + + public void bindObj(Object object) { + this.object = object; + } + @Override + public Value get(Map attachments, String variableName) { + if ((this.reflectLoader != null) && (this.object != null) && !variableName.startsWith("#")) { + return this.reflectLoader.loadField(this.object, variableName, true, PureErrReporter.INSTANCE); + } + return new MapItemValue(this.context, variableName); + } +} diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java index bb36bb5d91c..6b18a1a1f1d 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java @@ -31,13 +31,13 @@ @Name("ognl") @Summary("Execute ognl expression.") @Description(Constants.EXAMPLE - + " ognl '@java.lang.System@out.println(\"hello \\u4e2d\\u6587\")' \n" - + " ognl -x 2 '@Singleton@getInstance()' \n" - + " ognl '@Demo@staticFiled' \n" - + " ognl '#value1=@System@getProperty(\"java.home\"), #value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}'\n" - + " ognl -c 5d113a51 '@com.taobao.arthas.core.GlobalOptions@isDump' \n" - + Constants.WIKI + Constants.WIKI_HOME + "ognl\n" - + " https://commons.apache.org/proper/commons-ognl/language-guide.html") + + " ognl '@java.lang.System@out.println(\"hello \\u4e2d\\u6587\")' \n" + + " ognl -x 2 '@Singleton@getInstance()' \n" + + " ognl '@Demo@staticFiled' \n" + + " ognl '#value1=@System@getProperty(\"java.home\"), #value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}'\n" + + " ognl -c 5d113a51 '@com.taobao.arthas.core.GlobalOptions@isDump' \n" + + Constants.WIKI + Constants.WIKI_HOME + "ognl\n" + + " https://commons.apache.org/proper/commons-ognl/language-guide.html") public class OgnlCommand extends AnnotatedCommand { private static final Logger logger = LoggerFactory.getLogger(OgnlCommand.class); @@ -100,7 +100,7 @@ public void process(CommandProcess process) { classLoader = ClassLoader.getSystemClassLoader(); } - Express unpooledExpress = ExpressFactory.unpooledExpress(classLoader); + Express unpooledExpress = ExpressFactory.unpooledExpressByOGNL(classLoader); try { Object value = unpooledExpress.get(express); OgnlModel ognlModel = new OgnlModel() diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java new file mode 100644 index 00000000000..1bc2b6ba36a --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java @@ -0,0 +1,21 @@ +package com.taobao.arthas.core.command.model; + +/** + * @Author TaoKan + * @Date 2024/9/22 7:32 AM + */ +public enum ExpressTypeEnum +{ + OGNL("ognl"), + QLEXPRESS("QLExpress"); + + private String expressType; + + ExpressTypeEnum(String expressType) { + this.expressType = expressType; + } + + public String getExpressType() { + return expressType; + } +} diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java b/core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java new file mode 100644 index 00000000000..05348c6213d --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/model/QLExpressConfigModel.java @@ -0,0 +1,97 @@ +package com.taobao.arthas.core.command.model; + +/** + * @Author TaoKan + * @Date 2024/9/22 7:51 AM + */ +public class QLExpressConfigModel { + //QL_OPTIONS + private boolean precise = false; + private boolean polluteUserContext = false; + private long timeoutMillis = -1L; + + private boolean cache = false; + private boolean avoidNullPointer = false; + private int maxArrLength = -1; + + + //INIT_OPTIONS + private boolean allowPrivateAccess = true; + private boolean debug; + private boolean useCacheClear; + + public boolean isAllowPrivateAccess() { + return allowPrivateAccess; + } + + public void setAllowPrivateAccess(boolean allowPrivateAccess) { + this.allowPrivateAccess = allowPrivateAccess; + } + + public boolean isDebug() { + return debug; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + public boolean isUseCacheClear() { + return useCacheClear; + } + + public void setUseCacheClear(boolean useCacheClear) { + this.useCacheClear = useCacheClear; + } + + + + public boolean isPrecise() { + return precise; + } + + public void setPrecise(boolean precise) { + this.precise = precise; + } + + public boolean isPolluteUserContext() { + return polluteUserContext; + } + + public void setPolluteUserContext(boolean polluteUserContext) { + this.polluteUserContext = polluteUserContext; + } + + public long getTimeoutMillis() { + return timeoutMillis; + } + + public void setTimeoutMillis(long timeoutMillis) { + this.timeoutMillis = timeoutMillis; + } + + public boolean isAvoidNullPointer() { + return avoidNullPointer; + } + + public void setAvoidNullPointer(boolean avoidNullPointer) { + this.avoidNullPointer = avoidNullPointer; + } + + public int getMaxArrLength() { + return maxArrLength; + } + + public void setMaxArrLength(int maxArrLength) { + this.maxArrLength = maxArrLength; + } + + + public boolean isCache() { + return cache; + } + + public void setCache(boolean cache) { + this.cache = cache; + } +} diff --git a/pom.xml b/pom.xml index 463cfc3edd1..fc73af016d2 100644 --- a/pom.xml +++ b/pom.xml @@ -156,6 +156,11 @@ ognl 3.1.19
+ + com.alibaba + QLExpress4 + 4.0.0-beta + junit junit From 30fe6897cc84688462a89ef4b3a8d714fdb82b03 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Tue, 8 Oct 2024 19:25:59 +0800 Subject: [PATCH 02/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 4 ++++ .../taobao/arthas/core/command/express/ExpressFactory.java | 2 +- .../com/taobao/arthas/core/command/express/QLExpress.java | 2 +- pom.xml | 5 +++++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index cfda902b71d..feab1651739 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -211,6 +211,10 @@ ognl ognl + + com.alibaba + QLExpress4 + org.junit.vintage junit-vintage-engine diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index a1bba017f00..ad072e31398 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -1,6 +1,6 @@ package com.taobao.arthas.core.command.express; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.command.model.ExpressTypeEnum; import com.taobao.arthas.core.command.model.QLExpressConfigModel; diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 9217bd22398..176f970f706 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -2,7 +2,7 @@ import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import com.alibaba.qlexpress4.Express4Runner; import com.alibaba.qlexpress4.InitOptions; import com.alibaba.qlexpress4.QLOptions; diff --git a/pom.xml b/pom.xml index f6d2061162f..0bff6526a3d 100644 --- a/pom.xml +++ b/pom.xml @@ -158,6 +158,11 @@ ognl 3.4.2 + + com.alibaba + QLExpress4 + 4.0.0-beta + org.junit junit-bom From efebecdccecee2281065c73bc39f4c210b16f526 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Tue, 8 Oct 2024 19:27:26 +0800 Subject: [PATCH 03/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/taobao/arthas/core/command/express/ExpressFactory.java | 2 +- .../java/com/taobao/arthas/core/command/express/QLExpress.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index ad072e31398..a1bba017f00 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -1,6 +1,6 @@ package com.taobao.arthas.core.command.express; -import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson.JSON; import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.command.model.ExpressTypeEnum; import com.taobao.arthas.core.command.model.QLExpressConfigModel; diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 176f970f706..9217bd22398 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -2,7 +2,7 @@ import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; -import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson.JSON; import com.alibaba.qlexpress4.Express4Runner; import com.alibaba.qlexpress4.InitOptions; import com.alibaba.qlexpress4.QLOptions; From b1a0379a2fff3e73efb77c5150aad49a65210ae5 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Tue, 8 Oct 2024 19:39:11 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/command/express/ExpressFactory.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index a1bba017f00..32e5fe7999b 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -1,9 +1,7 @@ package com.taobao.arthas.core.command.express; -import com.alibaba.fastjson.JSON; import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.command.model.ExpressTypeEnum; -import com.taobao.arthas.core.command.model.QLExpressConfigModel; /** * ExpressFactory @@ -42,16 +40,4 @@ public static Express unpooledExpressByOGNL(ClassLoader classloader) { } return new OgnlExpress(new ClassLoaderClassResolver(classloader)); } - - public static boolean checkQLExpressConfig(String configValue) { - try { - if ("".equals(configValue)) { - return true; - } - JSON.parseObject(configValue, QLExpressConfigModel.class); - return true; - }catch (Throwable t){ - return false; - } - } } \ No newline at end of file From a878dc638522e82114411fa690eda6b6e3d47c55 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 27 Oct 2024 20:56:29 +0800 Subject: [PATCH 05/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/taobao/arthas/core/GlobalOptions.java | 2 +- .../core/command/express/QLExpress.java | 2 +- site/yarn.lock | 267 ++++++++++++++++-- 3 files changed, 243 insertions(+), 28 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 6dc79ac3257..e242fa517ca 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -156,7 +156,7 @@ public class GlobalOptions { */ @Option(level = 1, name = QLEXPRESS_CONFIG, - summary = "config init when use qlExpress, example: {\"\": \"\"} ", + summary = "config init when use qlExpress, example: {\"precise\": true }", description = "" ) public static volatile String QLExpressConfig = ""; diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 9217bd22398..176f970f706 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -2,7 +2,7 @@ import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import com.alibaba.qlexpress4.Express4Runner; import com.alibaba.qlexpress4.InitOptions; import com.alibaba.qlexpress4.QLOptions; diff --git a/site/yarn.lock b/site/yarn.lock index 678a41700fe..7fc4825848d 100644 --- a/site/yarn.lock +++ b/site/yarn.lock @@ -76,7 +76,7 @@ "@algolia/requester-common" "4.14.2" "@algolia/transporter" "4.14.2" -"@algolia/client-search@^4.9.1", "@algolia/client-search@4.14.2": +"@algolia/client-search@4.14.2": version "4.14.2" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz" integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw== @@ -130,7 +130,7 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz" integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== -"@docsearch/css@^3.2.1", "@docsearch/css@3.2.1": +"@docsearch/css@3.2.1", "@docsearch/css@^3.2.1": version "3.2.1" resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz" integrity sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g== @@ -143,7 +143,7 @@ "@docsearch/react" "3.2.1" preact "^10.0.0" -"@docsearch/react@^3.2.1", "@docsearch/react@3.2.1": +"@docsearch/react@3.2.1", "@docsearch/react@^3.2.1": version "3.2.1" resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz" integrity sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ== @@ -153,6 +153,16 @@ "@docsearch/css" "3.2.1" algoliasearch "^4.0.0" +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + +"@esbuild/linux-loong64@0.15.5": + version "0.15.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82" + integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A== + "@mdit-vue/plugin-component@^0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-0.10.0.tgz" @@ -210,7 +220,7 @@ "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/shared@^0.10.0", "@mdit-vue/shared@0.10.0": +"@mdit-vue/shared@0.10.0", "@mdit-vue/shared@^0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/shared/-/shared-0.10.0.tgz" integrity sha512-rUyu0NVNbaEg4DUiQenh/fam1MLdkItdzEVScN7vP0UzDWOwmGaKwkhlMmkSTW80H63ZlKst0fPe9LaGHImSZg== @@ -219,7 +229,7 @@ "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/types@^0.10.0", "@mdit-vue/types@0.10.0": +"@mdit-vue/types@0.10.0", "@mdit-vue/types@^0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/types/-/types-0.10.0.tgz" integrity sha512-ROz5zVKt3COpuWUYFnpJh5kIXit9SQeMtimGBlwKJL1xEBNPG3QKD3VZzez5Ng/dBCApianCQhNVZGCza82Myw== @@ -232,7 +242,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -399,7 +409,7 @@ "@vue/compiler-ssr" "3.2.38" "@vue/shared" "3.2.38" -"@vue/shared@^3.2.37", "@vue/shared@3.2.38": +"@vue/shared@3.2.38", "@vue/shared@^3.2.37": version "3.2.38" resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz" integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg== @@ -435,7 +445,7 @@ envinfo "^7.8.1" esbuild "^0.15.5" -"@vuepress/client@^2.0.0-beta.50", "@vuepress/client@2.0.0-beta.51": +"@vuepress/client@2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.51.tgz" integrity sha512-5iQV765kwR6/eIZPMlV5O34DUvHCMjF7zpr91x5i8BEAg7A0jfHvdrwNavAKWiQEU77f4dIBXtWy6nwX+lgmbw== @@ -478,7 +488,7 @@ markdown-it-emoji "^2.0.2" mdurl "^1.0.1" -"@vuepress/plugin-active-header-links@^2.0.0-beta.51", "@vuepress/plugin-active-header-links@2.0.0-beta.51": +"@vuepress/plugin-active-header-links@2.0.0-beta.51", "@vuepress/plugin-active-header-links@^2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.51.tgz" integrity sha512-AV9qLVSD3e9Xnp+2Vu9tegUdzbm9HD2bF6pRC3xEdW8GzRlsHBTfMpFwfsKvkKofk90+4ICkPWY9mY95P4mNSw== @@ -590,7 +600,7 @@ "@vuepress/core" "2.0.0-beta.51" prismjs "^1.28.0" -"@vuepress/plugin-theme-data@^2.0.0-beta.51", "@vuepress/plugin-theme-data@2.0.0-beta.51": +"@vuepress/plugin-theme-data@2.0.0-beta.51", "@vuepress/plugin-theme-data@^2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.51.tgz" integrity sha512-sfsZRhb7zZATqY1+BXkynZZ7HEZnBZEd4iuEyCNpWEnjwa7/qjPSKJyAb/M0a2SLgN2/UcPdM5URMfE1mV/4QQ== @@ -673,7 +683,7 @@ dependencies: vue-demi "*" -algoliasearch@^4.0.0, algoliasearch@^4.9.1: +algoliasearch@^4.0.0: version "4.14.2" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz" integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg== @@ -761,7 +771,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, "browserslist@>= 4.21.0": +browserslist@^4.21.3: version "4.21.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== @@ -794,7 +804,7 @@ chalk@^5.0.0, chalk@^5.0.1: resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz" integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== -chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -891,6 +901,206 @@ envinfo@^7.8.1: resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8" + integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-android-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193" + integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + +esbuild-darwin-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d" + integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== + +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + +esbuild-darwin-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997" + integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg== + +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a" + integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-freebsd-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd" + integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-32@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32" + integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9" + integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d" + integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-arm@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5" + integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-mips64le@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981" + integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-ppc64le@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474" + integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-riscv64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896" + integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-linux-s390x@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae" + integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-netbsd-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8" + integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-openbsd-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035" + integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-sunos-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141" + integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-32@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7" + integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9" + integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + +esbuild-windows-arm64@0.15.5: + version "0.15.5" + resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b" + integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA== + esbuild@^0.14.47: version "0.14.54" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz" @@ -1036,6 +1246,11 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -1231,7 +1446,7 @@ markdown-it-emoji@^2.0.2: resolved "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz" integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ== -markdown-it@*, markdown-it@^13.0.1: +markdown-it@^13.0.1: version "13.0.1" resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz" integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== @@ -1390,7 +1605,7 @@ postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.0, postcss@^8.1.10, postcss@^8.4.16: +postcss@^8.1.10, postcss@^8.4.16: version "8.4.16" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== @@ -1457,13 +1672,6 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rollup@^2.78.1: - version "2.78.1" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz" - integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg== - optionalDependencies: - fsevents "~2.3.2" - "rollup@>=2.75.6 <2.77.0 || ~2.77.0": version "2.77.3" resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz" @@ -1471,6 +1679,13 @@ rollup@^2.78.1: optionalDependencies: fsevents "~2.3.2" +rollup@^2.78.1: + version "2.78.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz" + integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg== + optionalDependencies: + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -1483,7 +1698,7 @@ safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass@*, sass@^1.54.5, sass@^1.54.8: +sass@^1.54.5, sass@^1.54.8: version "1.54.8" resolved "https://registry.npmjs.org/sass/-/sass-1.54.8.tgz" integrity sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww== @@ -1527,7 +1742,7 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -1616,7 +1831,7 @@ util-deprecate@^1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -vite@^3.0.0, vite@~3.0.9: +vite@~3.0.9: version "3.0.9" resolved "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz" integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw== @@ -1645,7 +1860,7 @@ vue-router@^4.1.4, vue-router@^4.1.5: dependencies: "@vue/devtools-api" "^6.1.4" -"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.37, vue@^3.2.38, vue@3.2.38: +vue@^3.2.37, vue@^3.2.38: version "3.2.38" resolved "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz" integrity sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q== From c780218b65b22eab23f8629a3bbe307d11086d4a Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 3 Nov 2024 21:17:13 +0800 Subject: [PATCH 06/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index e242fa517ca..24d3ab3a0aa 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -156,7 +156,7 @@ public class GlobalOptions { */ @Option(level = 1, name = QLEXPRESS_CONFIG, - summary = "config init when use qlExpress, example: {\"precise\": true }", + summary = "config init when use qlExpress, with json-simple, for example: {\"precise\": true }", description = "" ) public static volatile String QLExpressConfig = ""; From a54ac6548965b94b6637c77e809ca2ed9a6c4cc3 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 3 Nov 2024 21:40:25 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 4 ++-- .../com/taobao/arthas/core/command/model/ExpressTypeEnum.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 24d3ab3a0aa..29912fbd0d2 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -145,8 +145,8 @@ public class GlobalOptions { */ @Option(level = 1, name = "express-type", - summary = "Option to use ognl/qlExpress", - description = "Option to use ognl/qlExpress in commands, default ognl" + summary = "Option to use ognl/qlexpress", + description = "Option to use ognl/qlexpress in commands, default ognl, can change to qlexpress" ) public static volatile String ExpressType = "ognl"; diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java index 1bc2b6ba36a..5191f875d04 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java +++ b/core/src/main/java/com/taobao/arthas/core/command/model/ExpressTypeEnum.java @@ -7,7 +7,7 @@ public enum ExpressTypeEnum { OGNL("ognl"), - QLEXPRESS("QLExpress"); + QLEXPRESS("qlexpress"); private String expressType; From cbdf590aff22c789e228f244eef2c5a653a26767 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 3 Nov 2024 21:48:21 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 29912fbd0d2..bc40cbefd53 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -156,7 +156,7 @@ public class GlobalOptions { */ @Option(level = 1, name = QLEXPRESS_CONFIG, - summary = "config init when use qlExpress, with json-simple, for example: {\"precise\": true }", + summary = "config init when use qlexpress, with json-simple, for example: {\"precise\": true }", description = "" ) public static volatile String QLExpressConfig = ""; From ec0f951dc098ca8917641462f1b2d96e2ecb2d64 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 10 Nov 2024 10:59:45 +0800 Subject: [PATCH 09/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/basic1000/OptionsCommand.java | 1 + .../core/command/express/ExpressFactory.java | 8 +++ .../core/command/express/QLExpressTest.java | 57 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java index 14a0a6174ad..f134315f1b6 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java @@ -71,6 +71,7 @@ public void setOptionValue(String optionValue) { @Override public void process(CommandProcess process) { try { + logger.info("start"); ExitStatus status = null; if (isShow()) { status = processShow(process); diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index 32e5fe7999b..112257b2454 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -1,14 +1,20 @@ package com.taobao.arthas.core.command.express; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.GlobalOptions; +import com.taobao.arthas.core.command.klass100.OgnlCommand; import com.taobao.arthas.core.command.model.ExpressTypeEnum; + /** * ExpressFactory * @author ralf0131 2017-01-04 14:40. * @author hengyunabc 2018-10-08 */ public class ExpressFactory { + private static final Logger logger = LoggerFactory.getLogger(ExpressFactory.class); + private static final ThreadLocal expressRef = ThreadLocal.withInitial(() -> new OgnlExpress()); private static final ThreadLocal expressRefQLExpress = ThreadLocal.withInitial(() -> new QLExpress()); @@ -18,6 +24,7 @@ public class ExpressFactory { * @return */ public static Express threadLocalExpress(Object object) { + logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType()); if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) { return expressRefQLExpress.get().reset().bind(object); } @@ -28,6 +35,7 @@ public static Express unpooledExpress(ClassLoader classloader) { if (classloader == null) { classloader = ClassLoader.getSystemClassLoader(); } + logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType()); if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) { return new QLExpress(classloader); } diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java new file mode 100644 index 00000000000..6341242ac25 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java @@ -0,0 +1,57 @@ +package com.taobao.arthas.core.command.express; + +import org.junit.Assert; +import org.junit.Test; + +/** + * @Author TaoKan + * @Date 2024/10/7 9:21 PM + */ +public class QLExpressTest { + + @Test + public void testValidQLExpr1() throws ExpressException { + Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); + Assert.assertEquals(unpooledExpress.get("\"test\".length() % 2 == 0 ? \"even length\" : \"odd length\""), + "even length"); + } + + @Test + public void testValidQLExpr2() throws ExpressException { + System.setProperty("ognl.chain.short-circuit", String.valueOf(false)); + Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); + Assert.assertEquals(unpooledExpress.get("4 in {1, 2, 3, 4}"), true); + Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{^ #this % 2 == 0}[$]"), 2); + Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{? #this % 2 == 0}[$]"), 4); + } + + @Test + public void testValidQLExpr3() throws ExpressException { + Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); + Assert.assertEquals(unpooledExpress.get("#factorial = :[#this <= 1 ? 1 : #this * #factorial(#this - 1)], #factorial(5)"), + 120); + } + + @Test + public void testValidQLExpr4() throws ExpressException { + Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); + System.setProperty("arthas.test1", "arthas"); + System.setProperty("arthas.ognl.test2", "test"); + Assert.assertEquals(unpooledExpress.get("#value1=@System@getProperty(\"arthas.test1\")," + + "#value2=@System@getProperty(\"arthas.ognl.test2\"), {#value1, #value2}").toString(), + "[arthas, test]"); + System.clearProperty("arthas.test1"); + System.clearProperty("arthas.ognl.test2"); + } + + @Test + public void testInvalidQLExpr() { + try { + Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); + System.out.println(unpooledExpress.get("#value1=@System.getProperty(\"java.home\")," + + "#value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}").toString()); + } catch (Exception e){ + Assert.assertTrue(e.getCause() instanceof ognl.ExpressionSyntaxException); + } + } +} From 2dab795545393215ad337e3dcaae6affc40aa5fa Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 10 Nov 2024 11:10:53 +0800 Subject: [PATCH 10/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taobao/arthas/core/command/express/ExpressFactory.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index 112257b2454..bb1757c7523 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -24,8 +24,7 @@ public class ExpressFactory { * @return */ public static Express threadLocalExpress(Object object) { - logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType()); - if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) { + if (GlobalOptions.ExpressType.equals(ExpressTypeEnum.QLEXPRESS.getExpressType())) { return expressRefQLExpress.get().reset().bind(object); } return expressRef.get().reset().bind(object); @@ -35,8 +34,7 @@ public static Express unpooledExpress(ClassLoader classloader) { if (classloader == null) { classloader = ClassLoader.getSystemClassLoader(); } - logger.info("expressType:"+GlobalOptions.ExpressType+ "_"+ExpressTypeEnum.QLEXPRESS.getExpressType()); - if (GlobalOptions.ExpressType == ExpressTypeEnum.QLEXPRESS.getExpressType()) { + if (GlobalOptions.ExpressType.equals(ExpressTypeEnum.QLEXPRESS.getExpressType())) { return new QLExpress(classloader); } return new OgnlExpress(new ClassLoaderClassResolver(classloader)); From 44fde5c4ea16dfa5814ba4f7b1ab03ba41cbbbe7 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 10 Nov 2024 11:33:47 +0800 Subject: [PATCH 11/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/basic1000/OptionsCommand.java | 1 - .../core/command/express/QLExpress.java | 25 +++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java index f134315f1b6..14a0a6174ad 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/OptionsCommand.java @@ -71,7 +71,6 @@ public void setOptionValue(String optionValue) { @Override public void process(CommandProcess process) { try { - logger.info("start"); ExitStatus status = null; if (isShow()) { status = processShow(process); diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 176f970f706..9e4076bf9c5 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -28,27 +28,29 @@ public class QLExpress implements Express { public QLExpress() { initQLExpress(); - initConfig(null); + initConfig(); initContext(); } public QLExpress(ClassLoader classloader) { initQLExpress(); - initConfig(classloader); + initConfig(); initContext(); } - private void initConfig(ClassLoader classloader) { + private void initConfig() { try { - QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class); - this.qlExpressConfigModel = qlExpressConfigModel; QLOptions.Builder qlOptionsBuilder = QLOptions.builder(); - qlOptionsBuilder.cache(qlExpressConfigModel.isCache()); - qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer()); - qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength()); - qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext()); - qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise()); - qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis()); + if (GlobalOptions.QLExpressConfig.length() > 0) { + QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class); + this.qlExpressConfigModel = qlExpressConfigModel; + qlOptionsBuilder.cache(qlExpressConfigModel.isCache()); + qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer()); + qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength()); + qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext()); + qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise()); + qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis()); + } qlOptions = qlOptionsBuilder.build(); InitOptions.Builder initOptionsBuilder = InitOptions.builder(); @@ -74,6 +76,7 @@ private void initContext() { @Override public Object get(String express) throws ExpressException { try { + logger.info("exp:"+express+ " "+ JSON.toJSONString(qlGlobalContext) + " "+JSON.toJSONString(qlOptions)); Object result = expressRunner.execute(express, qlGlobalContext, qlOptions); return result; } catch (Exception e) { From aebe3024bb7d16b717e2f20fc40998983768ad6f Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 10 Nov 2024 11:35:41 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/taobao/arthas/core/command/express/QLExpress.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 9e4076bf9c5..81f7f48a9b3 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -58,6 +58,7 @@ private void initConfig() { initOptionsBuilder.debug(qlExpressConfigModel.isDebug()); initOptionsBuilder.useCacheClear(qlExpressConfigModel.isUseCacheClear()); initOptions = initOptionsBuilder.build(); + //4.0设置InitOptions }catch (Throwable t){ //异常不设置options From 7d73a17fd0d2cb27f168982e3033bc4a3076a537 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 10 Nov 2024 11:42:54 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/taobao/arthas/core/command/express/QLExpress.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 81f7f48a9b3..2d289917da4 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -43,7 +43,6 @@ private void initConfig() { QLOptions.Builder qlOptionsBuilder = QLOptions.builder(); if (GlobalOptions.QLExpressConfig.length() > 0) { QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class); - this.qlExpressConfigModel = qlExpressConfigModel; qlOptionsBuilder.cache(qlExpressConfigModel.isCache()); qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer()); qlOptionsBuilder.maxArrLength(qlExpressConfigModel.getMaxArrLength()); @@ -53,12 +52,6 @@ private void initConfig() { } qlOptions = qlOptionsBuilder.build(); - InitOptions.Builder initOptionsBuilder = InitOptions.builder(); - initOptionsBuilder.allowPrivateAccess(qlExpressConfigModel.isAllowPrivateAccess()); - initOptionsBuilder.debug(qlExpressConfigModel.isDebug()); - initOptionsBuilder.useCacheClear(qlExpressConfigModel.isUseCacheClear()); - initOptions = initOptionsBuilder.build(); - //4.0设置InitOptions }catch (Throwable t){ //异常不设置options From 49d9397e1d9461ce3df853a3e1b65490d9692ce8 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 1 Dec 2024 19:19:45 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/command/express/ExpressFactory.java | 2 +- .../core/command/express/OgnlExpress.java | 4 ++ .../core/command/express/QLExpress.java | 40 +++++++++------ .../QLExpressClassLoaderClassResolver.java | 47 ++++++++++++++++++ .../express/QLExpressCustomClassResolver.java | 49 +++++++++++++++++++ .../core/command/express/QLExpressRunner.java | 8 +-- .../core/command/express/QLGlobalContext.java | 39 ++++++++++++--- 7 files changed, 161 insertions(+), 28 deletions(-) create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java create mode 100644 core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index bb1757c7523..714323e2a0c 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -35,7 +35,7 @@ public static Express unpooledExpress(ClassLoader classloader) { classloader = ClassLoader.getSystemClassLoader(); } if (GlobalOptions.ExpressType.equals(ExpressTypeEnum.QLEXPRESS.getExpressType())) { - return new QLExpress(classloader); + return new QLExpress(new QLExpressClassLoaderClassResolver(classloader)); } return new OgnlExpress(new ClassLoaderClassResolver(classloader)); } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java index f29bd31d254..fdc1d58bd19 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java @@ -3,6 +3,7 @@ import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSON; import ognl.ClassResolver; import ognl.MemberAccess; import ognl.Ognl; @@ -33,6 +34,9 @@ public OgnlExpress(ClassResolver classResolver) { @Override public Object get(String express) throws ExpressException { try { + logger.info("Ognl exp:"+express); + logger.info("Ognl context:"+context); + logger.info("Ognl bindObject:"+JSON.toJSONString(bindObject)); return Ognl.getValue(express, context, bindObject); } catch (Exception e) { logger.error("Error during evaluating the expression:", e); diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 2d289917da4..8777832c074 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -3,9 +3,12 @@ import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.alibaba.fastjson2.JSON; +import com.alibaba.qlexpress4.ClassSupplier; import com.alibaba.qlexpress4.Express4Runner; import com.alibaba.qlexpress4.InitOptions; import com.alibaba.qlexpress4.QLOptions; +import com.alibaba.qlexpress4.runtime.ReflectLoader; +import com.alibaba.qlexpress4.security.QLSecurityStrategy; import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.command.model.QLExpressConfigModel; @@ -18,30 +21,25 @@ public class QLExpress implements Express { private static final Logger logger = LoggerFactory.getLogger(QLExpress.class); private Express4Runner expressRunner; private QLGlobalContext qlGlobalContext; - private Object runResult; - - private QLExpressConfigModel qlExpressConfigModel; private QLOptions qlOptions; private InitOptions initOptions; public QLExpress() { - initQLExpress(); - initConfig(); - initContext(); + this(QLExpressCustomClassResolver.customClassResolver); } - public QLExpress(ClassLoader classloader) { - initQLExpress(); + public QLExpress(ClassSupplier classResolver) { + initQLExpress(classResolver); initConfig(); initContext(); } private void initConfig() { try { - QLOptions.Builder qlOptionsBuilder = QLOptions.builder(); if (GlobalOptions.QLExpressConfig.length() > 0) { + QLOptions.Builder qlOptionsBuilder = QLOptions.builder(); QLExpressConfigModel qlExpressConfigModel = JSON.parseObject(GlobalOptions.QLExpressConfig, QLExpressConfigModel.class); qlOptionsBuilder.cache(qlExpressConfigModel.isCache()); qlOptionsBuilder.avoidNullPointer(qlExpressConfigModel.isAvoidNullPointer()); @@ -49,9 +47,10 @@ private void initConfig() { qlOptionsBuilder.polluteUserContext(qlExpressConfigModel.isPolluteUserContext()); qlOptionsBuilder.precise(qlExpressConfigModel.isPrecise()); qlOptionsBuilder.timeoutMillis(qlExpressConfigModel.getTimeoutMillis()); + qlOptions = qlOptionsBuilder.build(); + }else { + qlOptions = QLOptions.DEFAULT_OPTIONS; } - qlOptions = qlOptionsBuilder.build(); - //4.0设置InitOptions }catch (Throwable t){ //异常不设置options @@ -59,19 +58,27 @@ private void initConfig() { } } - private void initQLExpress() { - expressRunner = QLExpressRunner.getInstance(); + private void initQLExpress(ClassSupplier classResolver) { + InitOptions.Builder initOptionsBuilder = InitOptions.builder(); + initOptionsBuilder.securityStrategy(QLSecurityStrategy.open()); + initOptionsBuilder.allowPrivateAccess(true); + initOptionsBuilder.classSupplier(classResolver); + initOptions = initOptionsBuilder.build(); + expressRunner = QLExpressRunner.getInstance(initOptions); } private void initContext() { - qlGlobalContext = new QLGlobalContext(); + ReflectLoader reflectLoader = new ReflectLoader(initOptions.getSecurityStrategy(), initOptions.getExtensionFunctions(), initOptions.allowPrivateAccess()); + qlGlobalContext = new QLGlobalContext(reflectLoader); } @Override public Object get(String express) throws ExpressException { try { - logger.info("exp:"+express+ " "+ JSON.toJSONString(qlGlobalContext) + " "+JSON.toJSONString(qlOptions)); + logger.info("exp:"+express); + qlGlobalContext.getContext().forEach((key, value) -> logger.info("qlGlobalContext:"+key + " type:"+value.getClass().getName() + " value:"+JSON.toJSONString(value))); Object result = expressRunner.execute(express, qlGlobalContext, qlOptions); + logger.info("res:"+JSON.toJSONString(result)); return result; } catch (Exception e) { logger.error("Error during evaluating the expression with QLExpress:", e); @@ -87,18 +94,21 @@ public boolean is(String express) throws ExpressException { @Override public Express bind(Object object) { + logger.info("bind object:"+ JSON.toJSONString(object)); qlGlobalContext.bindObj(object); return this; } @Override public Express bind(String name, Object value) { + logger.info("bind String name, Object value:"+name+ " "+ JSON.toJSONString(value)); qlGlobalContext.put(name, value); return this; } @Override public Express reset() { + logger.info("bind reset"); qlGlobalContext.clear(); return this; } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java new file mode 100644 index 00000000000..19e4a88e121 --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java @@ -0,0 +1,47 @@ +package com.taobao.arthas.core.command.express; + +import com.alibaba.qlexpress4.ClassSupplier; +import ognl.OgnlContext; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author TaoKan + * @Date 2024/12/1 7:07 PM + */ +public class QLExpressClassLoaderClassResolver implements ClassSupplier { + + private ClassLoader classLoader; + + private Map> classes = new ConcurrentHashMap>(101); + + public QLExpressClassLoaderClassResolver(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + @Override + public Class loadCls(String className) { + Class result = null; + + if ((result = classes.get(className)) == null) { + try { + result = classLoader.loadClass(className); + } catch (ClassNotFoundException ex) { + if (className.indexOf('.') == -1) { + try { + result = Class.forName("java.lang." + className); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + classes.put("java.lang." + className, result); + } + } + if (result == null) { + return null; + } + classes.put(className, result); + } + return result; + } +} diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java new file mode 100644 index 00000000000..7e2f4683297 --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java @@ -0,0 +1,49 @@ +package com.taobao.arthas.core.command.express; + +import com.alibaba.qlexpress4.ClassSupplier; +import ognl.OgnlContext; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author TaoKan + * @Date 2024/12/1 7:06 PM + */ +public class QLExpressCustomClassResolver implements ClassSupplier { + + public static final QLExpressCustomClassResolver customClassResolver = new QLExpressCustomClassResolver(); + + private Map> classes = new ConcurrentHashMap>(101); + + private QLExpressCustomClassResolver() { + + } + + @Override + public Class loadCls(String className) { + Class result = null; + + if ((result = classes.get(className)) == null) { + try { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader != null) { + result = classLoader.loadClass(className); + } else { + result = Class.forName(className); + } + } catch (ClassNotFoundException ex) { + if (className.indexOf('.') == -1) { + try { + result = Class.forName("java.lang." + className); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + classes.put("java.lang." + className, result); + } + } + classes.put(className, result); + } + return result; + } +} diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java index 2c6cfee71f6..c9c18f603b8 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressRunner.java @@ -12,18 +12,18 @@ public class QLExpressRunner { private volatile static QLExpressRunner instance = null; private Express4Runner expressRunner; - private QLExpressRunner(){ - expressRunner = new Express4Runner(InitOptions.DEFAULT_OPTIONS); + private QLExpressRunner(InitOptions initOptions){ + expressRunner = new Express4Runner(initOptions); } //对外提供静态方法获取对象 - public static Express4Runner getInstance(){ + public static Express4Runner getInstance(InitOptions initOptions){ //第一次判断,如果instance不为null,不进入抢锁阶段,直接返回实例 if(instance == null){ synchronized (QLExpressRunner.class){ //抢到锁之后再次进行判断是否为null if(instance == null){ - instance = new QLExpressRunner(); + instance = new QLExpressRunner(initOptions); } } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java index 1a510178a4b..e8be2bca59d 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java @@ -1,5 +1,8 @@ package com.taobao.arthas.core.command.express; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSON; import com.alibaba.qlexpress4.exception.PureErrReporter; import com.alibaba.qlexpress4.runtime.ReflectLoader; import com.alibaba.qlexpress4.runtime.Value; @@ -14,18 +17,15 @@ * @Date 2024/9/22 12:39 PM */ public class QLGlobalContext implements ExpressContext { + private static final Logger logger = LoggerFactory.getLogger(QLGlobalContext.class); + private Map context; private Object object; private ReflectLoader reflectLoader; - public QLGlobalContext(Map context, Object bindObject, ReflectLoader reflectLoader) { - this.context = context; - this.object = bindObject; - this.reflectLoader = reflectLoader; - } - - public QLGlobalContext() { + public QLGlobalContext(ReflectLoader reflectLoader) { this.context = new ConcurrentHashMap<>(); + this.reflectLoader = reflectLoader; } public void put(String name, Object value){ @@ -34,16 +34,39 @@ public void put(String name, Object value){ public void clear() { context.clear(); + this.context.put("reflectLoader",reflectLoader); } public void bindObj(Object object) { this.object = object; + context.put("object",object); } @Override public Value get(Map attachments, String variableName) { + logger.info("get variableName:"+variableName+ " "+ (this.object != null) + " "+(this.reflectLoader != null)); + if ((this.reflectLoader != null) && (this.object != null) && !variableName.startsWith("#")) { return this.reflectLoader.loadField(this.object, variableName, true, PureErrReporter.INSTANCE); } - return new MapItemValue(this.context, variableName); + String newVariableName = variableName.replace("#",""); + return new MapItemValue(this.context, newVariableName); + } + + + public Map getContext() { + return context; } + + public void setContext(Map context) { + this.context = context; + } + + public Object getObject() { + return object; + } + + public void setObject(Object object) { + this.object = object; + } + } From 87b71d072dda389885978aea192ca03a9340ec07 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 22 Dec 2024 17:47:32 +0800 Subject: [PATCH 15/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/command/express/ExpressFactory.java | 4 -- .../core/command/express/OgnlExpress.java | 4 -- .../core/command/express/QLExpress.java | 8 +--- .../QLExpressClassLoaderClassResolver.java | 41 +++++++--------- .../express/QLExpressCustomClassResolver.java | 47 +++++++++---------- .../core/command/express/QLGlobalContext.java | 2 - pom.xml | 2 +- 7 files changed, 40 insertions(+), 68 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java index 714323e2a0c..207f7aac848 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/ExpressFactory.java @@ -1,9 +1,6 @@ package com.taobao.arthas.core.command.express; -import com.alibaba.arthas.deps.org.slf4j.Logger; -import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.GlobalOptions; -import com.taobao.arthas.core.command.klass100.OgnlCommand; import com.taobao.arthas.core.command.model.ExpressTypeEnum; @@ -13,7 +10,6 @@ * @author hengyunabc 2018-10-08 */ public class ExpressFactory { - private static final Logger logger = LoggerFactory.getLogger(ExpressFactory.class); private static final ThreadLocal expressRef = ThreadLocal.withInitial(() -> new OgnlExpress()); private static final ThreadLocal expressRefQLExpress = ThreadLocal.withInitial(() -> new QLExpress()); diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java index fdc1d58bd19..f29bd31d254 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java @@ -3,7 +3,6 @@ import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; -import com.alibaba.fastjson2.JSON; import ognl.ClassResolver; import ognl.MemberAccess; import ognl.Ognl; @@ -34,9 +33,6 @@ public OgnlExpress(ClassResolver classResolver) { @Override public Object get(String express) throws ExpressException { try { - logger.info("Ognl exp:"+express); - logger.info("Ognl context:"+context); - logger.info("Ognl bindObject:"+JSON.toJSONString(bindObject)); return Ognl.getValue(express, context, bindObject); } catch (Exception e) { logger.error("Error during evaluating the expression:", e); diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java index 8777832c074..5c4da297397 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpress.java @@ -68,17 +68,14 @@ private void initQLExpress(ClassSupplier classResolver) { } private void initContext() { - ReflectLoader reflectLoader = new ReflectLoader(initOptions.getSecurityStrategy(), initOptions.getExtensionFunctions(), initOptions.allowPrivateAccess()); + ReflectLoader reflectLoader = new ReflectLoader(initOptions.getSecurityStrategy(), initOptions.getExtensionFunctions(), initOptions.isAllowPrivateAccess()); qlGlobalContext = new QLGlobalContext(reflectLoader); } @Override public Object get(String express) throws ExpressException { try { - logger.info("exp:"+express); - qlGlobalContext.getContext().forEach((key, value) -> logger.info("qlGlobalContext:"+key + " type:"+value.getClass().getName() + " value:"+JSON.toJSONString(value))); Object result = expressRunner.execute(express, qlGlobalContext, qlOptions); - logger.info("res:"+JSON.toJSONString(result)); return result; } catch (Exception e) { logger.error("Error during evaluating the expression with QLExpress:", e); @@ -94,21 +91,18 @@ public boolean is(String express) throws ExpressException { @Override public Express bind(Object object) { - logger.info("bind object:"+ JSON.toJSONString(object)); qlGlobalContext.bindObj(object); return this; } @Override public Express bind(String name, Object value) { - logger.info("bind String name, Object value:"+name+ " "+ JSON.toJSONString(value)); qlGlobalContext.put(name, value); return this; } @Override public Express reset() { - logger.info("bind reset"); qlGlobalContext.clear(); return this; } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java index 19e4a88e121..70a469c3b63 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressClassLoaderClassResolver.java @@ -1,9 +1,8 @@ package com.taobao.arthas.core.command.express; import com.alibaba.qlexpress4.ClassSupplier; -import ognl.OgnlContext; - import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; /** @@ -14,34 +13,28 @@ public class QLExpressClassLoaderClassResolver implements ClassSupplier { private ClassLoader classLoader; - private Map> classes = new ConcurrentHashMap>(101); + private final Map>> cache = new ConcurrentHashMap<>(); public QLExpressClassLoaderClassResolver(ClassLoader classLoader) { this.classLoader = classLoader; } - @Override - public Class loadCls(String className) { - Class result = null; - - if ((result = classes.get(className)) == null) { - try { - result = classLoader.loadClass(className); - } catch (ClassNotFoundException ex) { - if (className.indexOf('.') == -1) { - try { - result = Class.forName("java.lang." + className); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - classes.put("java.lang." + className, result); - } + private Optional> loadClsInner(String clsQualifiedName) { + try { + Class aClass = null; + if (classLoader != null) { + aClass = classLoader.loadClass(clsQualifiedName); + }else { + aClass = Class.forName(clsQualifiedName); } - if (result == null) { - return null; - } - classes.put(className, result); + return Optional.of(aClass); + } catch (ClassNotFoundException | NoClassDefFoundError e) { + return Optional.empty(); } - return result; + } + @Override + public Class loadCls(String className) { + Optional> clsOp = cache.computeIfAbsent(className, this::loadClsInner); + return clsOp.orElse(null); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java index 7e2f4683297..9c127fe50e4 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLExpressCustomClassResolver.java @@ -1,9 +1,10 @@ package com.taobao.arthas.core.command.express; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.alibaba.qlexpress4.ClassSupplier; -import ognl.OgnlContext; - import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; /** @@ -14,36 +15,30 @@ public class QLExpressCustomClassResolver implements ClassSupplier { public static final QLExpressCustomClassResolver customClassResolver = new QLExpressCustomClassResolver(); - private Map> classes = new ConcurrentHashMap>(101); + private final Map>> cache = new ConcurrentHashMap<>(); private QLExpressCustomClassResolver() { } - @Override - public Class loadCls(String className) { - Class result = null; - - if ((result = classes.get(className)) == null) { - try { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - if (classLoader != null) { - result = classLoader.loadClass(className); - } else { - result = Class.forName(className); - } - } catch (ClassNotFoundException ex) { - if (className.indexOf('.') == -1) { - try { - result = Class.forName("java.lang." + className); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - classes.put("java.lang." + className, result); - } + private Optional> loadClsInner(String clsQualifiedName) { + try { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Class aClass = null; + if (classLoader != null) { + aClass = classLoader.loadClass(clsQualifiedName); + } else { + aClass = Class.forName(clsQualifiedName); } - classes.put(className, result); + return Optional.of(aClass); + } catch (ClassNotFoundException | NoClassDefFoundError e) { + return Optional.empty(); } - return result; } + @Override + public Class loadCls(String clsQualifiedName) { + Optional> clsOp = cache.computeIfAbsent(clsQualifiedName, this::loadClsInner); + return clsOp.orElse(null); + } + } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java index e8be2bca59d..fa6e46f9054 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/QLGlobalContext.java @@ -43,8 +43,6 @@ public void bindObj(Object object) { } @Override public Value get(Map attachments, String variableName) { - logger.info("get variableName:"+variableName+ " "+ (this.object != null) + " "+(this.reflectLoader != null)); - if ((this.reflectLoader != null) && (this.object != null) && !variableName.startsWith("#")) { return this.reflectLoader.loadField(this.object, variableName, true, PureErrReporter.INSTANCE); } diff --git a/pom.xml b/pom.xml index 0bff6526a3d..4133dd1aa53 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ com.alibaba QLExpress4 - 4.0.0-beta + 4.0.0-beta.1 org.junit From 35899a8f1753154bb696845d3fbfca796122ecbe Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 22 Dec 2024 18:08:00 +0800 Subject: [PATCH 16/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/command/express/QLExpressTest.java | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java deleted file mode 100644 index 6341242ac25..00000000000 --- a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.taobao.arthas.core.command.express; - -import org.junit.Assert; -import org.junit.Test; - -/** - * @Author TaoKan - * @Date 2024/10/7 9:21 PM - */ -public class QLExpressTest { - - @Test - public void testValidQLExpr1() throws ExpressException { - Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); - Assert.assertEquals(unpooledExpress.get("\"test\".length() % 2 == 0 ? \"even length\" : \"odd length\""), - "even length"); - } - - @Test - public void testValidQLExpr2() throws ExpressException { - System.setProperty("ognl.chain.short-circuit", String.valueOf(false)); - Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); - Assert.assertEquals(unpooledExpress.get("4 in {1, 2, 3, 4}"), true); - Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{^ #this % 2 == 0}[$]"), 2); - Assert.assertEquals(unpooledExpress.get("{1, 2, 3, 4}.{? #this % 2 == 0}[$]"), 4); - } - - @Test - public void testValidQLExpr3() throws ExpressException { - Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); - Assert.assertEquals(unpooledExpress.get("#factorial = :[#this <= 1 ? 1 : #this * #factorial(#this - 1)], #factorial(5)"), - 120); - } - - @Test - public void testValidQLExpr4() throws ExpressException { - Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); - System.setProperty("arthas.test1", "arthas"); - System.setProperty("arthas.ognl.test2", "test"); - Assert.assertEquals(unpooledExpress.get("#value1=@System@getProperty(\"arthas.test1\")," + - "#value2=@System@getProperty(\"arthas.ognl.test2\"), {#value1, #value2}").toString(), - "[arthas, test]"); - System.clearProperty("arthas.test1"); - System.clearProperty("arthas.ognl.test2"); - } - - @Test - public void testInvalidQLExpr() { - try { - Express unpooledExpress = ExpressFactory.unpooledExpress(QLExpressTest.class.getClassLoader()); - System.out.println(unpooledExpress.get("#value1=@System.getProperty(\"java.home\")," + - "#value2=@System@getProperty(\"java.runtime.name\"), {#value1, #value2}").toString()); - } catch (Exception e){ - Assert.assertTrue(e.getCause() instanceof ognl.ExpressionSyntaxException); - } - } -} From 5a77e9329266c7894b81ec7bc57142cbf8f19278 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 22 Dec 2024 18:12:14 +0800 Subject: [PATCH 17/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91yarn=20revert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/yarn.lock | 267 +++++-------------------------------------------- 1 file changed, 26 insertions(+), 241 deletions(-) diff --git a/site/yarn.lock b/site/yarn.lock index 7fc4825848d..678a41700fe 100644 --- a/site/yarn.lock +++ b/site/yarn.lock @@ -76,7 +76,7 @@ "@algolia/requester-common" "4.14.2" "@algolia/transporter" "4.14.2" -"@algolia/client-search@4.14.2": +"@algolia/client-search@^4.9.1", "@algolia/client-search@4.14.2": version "4.14.2" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz" integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw== @@ -130,7 +130,7 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz" integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== -"@docsearch/css@3.2.1", "@docsearch/css@^3.2.1": +"@docsearch/css@^3.2.1", "@docsearch/css@3.2.1": version "3.2.1" resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz" integrity sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g== @@ -143,7 +143,7 @@ "@docsearch/react" "3.2.1" preact "^10.0.0" -"@docsearch/react@3.2.1", "@docsearch/react@^3.2.1": +"@docsearch/react@^3.2.1", "@docsearch/react@3.2.1": version "3.2.1" resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz" integrity sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ== @@ -153,16 +153,6 @@ "@docsearch/css" "3.2.1" algoliasearch "^4.0.0" -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== - -"@esbuild/linux-loong64@0.15.5": - version "0.15.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82" - integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A== - "@mdit-vue/plugin-component@^0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-0.10.0.tgz" @@ -220,7 +210,7 @@ "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/shared@0.10.0", "@mdit-vue/shared@^0.10.0": +"@mdit-vue/shared@^0.10.0", "@mdit-vue/shared@0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/shared/-/shared-0.10.0.tgz" integrity sha512-rUyu0NVNbaEg4DUiQenh/fam1MLdkItdzEVScN7vP0UzDWOwmGaKwkhlMmkSTW80H63ZlKst0fPe9LaGHImSZg== @@ -229,7 +219,7 @@ "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/types@0.10.0", "@mdit-vue/types@^0.10.0": +"@mdit-vue/types@^0.10.0", "@mdit-vue/types@0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/types/-/types-0.10.0.tgz" integrity sha512-ROz5zVKt3COpuWUYFnpJh5kIXit9SQeMtimGBlwKJL1xEBNPG3QKD3VZzez5Ng/dBCApianCQhNVZGCza82Myw== @@ -242,7 +232,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -409,7 +399,7 @@ "@vue/compiler-ssr" "3.2.38" "@vue/shared" "3.2.38" -"@vue/shared@3.2.38", "@vue/shared@^3.2.37": +"@vue/shared@^3.2.37", "@vue/shared@3.2.38": version "3.2.38" resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz" integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg== @@ -445,7 +435,7 @@ envinfo "^7.8.1" esbuild "^0.15.5" -"@vuepress/client@2.0.0-beta.51": +"@vuepress/client@^2.0.0-beta.50", "@vuepress/client@2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.51.tgz" integrity sha512-5iQV765kwR6/eIZPMlV5O34DUvHCMjF7zpr91x5i8BEAg7A0jfHvdrwNavAKWiQEU77f4dIBXtWy6nwX+lgmbw== @@ -488,7 +478,7 @@ markdown-it-emoji "^2.0.2" mdurl "^1.0.1" -"@vuepress/plugin-active-header-links@2.0.0-beta.51", "@vuepress/plugin-active-header-links@^2.0.0-beta.51": +"@vuepress/plugin-active-header-links@^2.0.0-beta.51", "@vuepress/plugin-active-header-links@2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.51.tgz" integrity sha512-AV9qLVSD3e9Xnp+2Vu9tegUdzbm9HD2bF6pRC3xEdW8GzRlsHBTfMpFwfsKvkKofk90+4ICkPWY9mY95P4mNSw== @@ -600,7 +590,7 @@ "@vuepress/core" "2.0.0-beta.51" prismjs "^1.28.0" -"@vuepress/plugin-theme-data@2.0.0-beta.51", "@vuepress/plugin-theme-data@^2.0.0-beta.51": +"@vuepress/plugin-theme-data@^2.0.0-beta.51", "@vuepress/plugin-theme-data@2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.51.tgz" integrity sha512-sfsZRhb7zZATqY1+BXkynZZ7HEZnBZEd4iuEyCNpWEnjwa7/qjPSKJyAb/M0a2SLgN2/UcPdM5URMfE1mV/4QQ== @@ -683,7 +673,7 @@ dependencies: vue-demi "*" -algoliasearch@^4.0.0: +algoliasearch@^4.0.0, algoliasearch@^4.9.1: version "4.14.2" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz" integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg== @@ -771,7 +761,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3: +browserslist@^4.21.3, "browserslist@>= 4.21.0": version "4.21.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== @@ -804,7 +794,7 @@ chalk@^5.0.0, chalk@^5.0.1: resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz" integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: +chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -901,206 +891,6 @@ envinfo@^7.8.1: resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8" - integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-android-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193" - integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d" - integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-darwin-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997" - integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a" - integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-freebsd-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd" - integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - -esbuild-linux-32@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32" - integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ== - -esbuild-linux-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" - integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== - -esbuild-linux-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9" - integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg== - -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d" - integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-arm@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5" - integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-mips64le@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981" - integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-ppc64le@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474" - integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-riscv64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896" - integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-linux-s390x@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae" - integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-netbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8" - integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-openbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035" - integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA== - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-sunos-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141" - integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-32@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7" - integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9" - integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - -esbuild-windows-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b" - integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA== - esbuild@^0.14.47: version "0.14.54" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz" @@ -1246,11 +1036,6 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -1446,7 +1231,7 @@ markdown-it-emoji@^2.0.2: resolved "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz" integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ== -markdown-it@^13.0.1: +markdown-it@*, markdown-it@^13.0.1: version "13.0.1" resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz" integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== @@ -1605,7 +1390,7 @@ postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.10, postcss@^8.4.16: +postcss@^8.1.0, postcss@^8.1.10, postcss@^8.4.16: version "8.4.16" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== @@ -1672,13 +1457,6 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -"rollup@>=2.75.6 <2.77.0 || ~2.77.0": - version "2.77.3" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz" - integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== - optionalDependencies: - fsevents "~2.3.2" - rollup@^2.78.1: version "2.78.1" resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz" @@ -1686,6 +1464,13 @@ rollup@^2.78.1: optionalDependencies: fsevents "~2.3.2" +"rollup@>=2.75.6 <2.77.0 || ~2.77.0": + version "2.77.3" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz" + integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== + optionalDependencies: + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -1698,7 +1483,7 @@ safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass@^1.54.5, sass@^1.54.8: +sass@*, sass@^1.54.5, sass@^1.54.8: version "1.54.8" resolved "https://registry.npmjs.org/sass/-/sass-1.54.8.tgz" integrity sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww== @@ -1742,7 +1527,7 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -1831,7 +1616,7 @@ util-deprecate@^1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -vite@~3.0.9: +vite@^3.0.0, vite@~3.0.9: version "3.0.9" resolved "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz" integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw== @@ -1860,7 +1645,7 @@ vue-router@^4.1.4, vue-router@^4.1.5: dependencies: "@vue/devtools-api" "^6.1.4" -vue@^3.2.37, vue@^3.2.38: +"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.37, vue@^3.2.38, vue@3.2.38: version "3.2.38" resolved "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz" integrity sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q== From adb02573cf651bf6aa8df26fb03982daf2e53c27 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sat, 4 Jan 2025 09:45:46 +0800 Subject: [PATCH 18/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91pom=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4133dd1aa53..a42e24b3da6 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ com.alibaba QLExpress4 - 4.0.0-beta.1 + 4.0.0-beta.2 org.junit From 4f3a518a4f0814c2dd204a1f656b31a3a8c27bc6 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sat, 4 Jan 2025 21:04:29 +0800 Subject: [PATCH 19/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 4 ++++ .../com/taobao/arthas/core/GlobalOptions.java | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index feab1651739..430215f176d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -267,6 +267,10 @@ provided true + + ognl + ognl + diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index bc40cbefd53..3620931a8cc 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -1,6 +1,12 @@ package com.taobao.arthas.core; +import java.lang.reflect.Field; + import com.taobao.arthas.common.JavaVersionUtils; +import com.taobao.arthas.common.UnsafeUtils; + +import ognl.OgnlRuntime; + /** * 全局开关 @@ -139,6 +145,20 @@ public class GlobalOptions { ) public static volatile boolean strict = true; + public static void updateOnglStrict(boolean strict) { + try { + Field field = OgnlRuntime.class.getDeclaredField("_useStricterInvocation"); + field.setAccessible(true); + // 获取字段的内存偏移量和基址 + Object staticFieldBase = UnsafeUtils.UNSAFE.staticFieldBase(field); + long staticFieldOffset = UnsafeUtils.UNSAFE.staticFieldOffset(field); + + // 修改字段的值 + UnsafeUtils.UNSAFE.putBoolean(staticFieldBase, staticFieldOffset, strict); + } catch (NoSuchFieldException | SecurityException e) { + // ignore + } + } /** * 是否切换使用表达式ognl/qlexpress开关 From 564c11a9037f52bd86a349525221a804ee66f8c1 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sat, 4 Jan 2025 21:06:54 +0800 Subject: [PATCH 20/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 3620931a8cc..dd452da7eea 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -7,7 +7,6 @@ import ognl.OgnlRuntime; - /** * 全局开关 * Created by vlinux on 15/6/4. @@ -180,4 +179,5 @@ public static void updateOnglStrict(boolean strict) { description = "" ) public static volatile String QLExpressConfig = ""; + } From 23c3df1d4a51c2c220ae60dc7189becd7ff6163f Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sat, 4 Jan 2025 21:52:13 +0800 Subject: [PATCH 21/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index dd452da7eea..231a5bff26d 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -180,4 +180,5 @@ public static void updateOnglStrict(boolean strict) { ) public static volatile String QLExpressConfig = ""; + } From 74a84f829d085203435fd0ea3df351e7d23f3c4f Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sat, 4 Jan 2025 21:56:34 +0800 Subject: [PATCH 22/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 231a5bff26d..58b23f95436 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -158,7 +158,6 @@ public static void updateOnglStrict(boolean strict) { // ignore } } - /** * 是否切换使用表达式ognl/qlexpress开关 */ @@ -179,6 +178,6 @@ public static void updateOnglStrict(boolean strict) { description = "" ) public static volatile String QLExpressConfig = ""; +} -} From 92cff372ed364c929ac0264c4e0e906a48dfabd8 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 12 Jan 2025 17:14:13 +0800 Subject: [PATCH 23/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/taobao/arthas/core/GlobalOptions.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 58b23f95436..9b90765fb5b 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -16,8 +16,6 @@ public class GlobalOptions { + "not allowed to set object properties. " + "Want to set object properties, execute `options strict false`"; - public static final String QLEXPRESS_CONFIG = "qlexpress-config"; - /** * 是否支持系统类
* 这个开关打开之后将能代理到来自JVM的部分类,由于有非常强的安全风险可能会引起系统崩溃
@@ -135,7 +133,8 @@ public class GlobalOptions { public static volatile boolean verbose = false; /** - * 是否打开strict 开关 + * 是否打开strict 开关。更新时注意 ognl 里的配置需要同步修改 + * @see ognl.OgnlRuntime#getUseStricterInvocationValue() */ @Option(level = 1, name = "strict", @@ -143,21 +142,6 @@ public class GlobalOptions { description = STRICT_MESSAGE ) public static volatile boolean strict = true; - - public static void updateOnglStrict(boolean strict) { - try { - Field field = OgnlRuntime.class.getDeclaredField("_useStricterInvocation"); - field.setAccessible(true); - // 获取字段的内存偏移量和基址 - Object staticFieldBase = UnsafeUtils.UNSAFE.staticFieldBase(field); - long staticFieldOffset = UnsafeUtils.UNSAFE.staticFieldOffset(field); - - // 修改字段的值 - UnsafeUtils.UNSAFE.putBoolean(staticFieldBase, staticFieldOffset, strict); - } catch (NoSuchFieldException | SecurityException e) { - // ignore - } - } /** * 是否切换使用表达式ognl/qlexpress开关 */ @@ -178,6 +162,20 @@ public static void updateOnglStrict(boolean strict) { description = "" ) public static volatile String QLExpressConfig = ""; -} + public static void updateOnglStrict(boolean strict) { + try { + Field field = OgnlRuntime.class.getDeclaredField("_useStricterInvocation"); + field.setAccessible(true); + // 获取字段的内存偏移量和基址 + Object staticFieldBase = UnsafeUtils.UNSAFE.staticFieldBase(field); + long staticFieldOffset = UnsafeUtils.UNSAFE.staticFieldOffset(field); + + // 修改字段的值 + UnsafeUtils.UNSAFE.putBoolean(staticFieldBase, staticFieldOffset, strict); + } catch (NoSuchFieldException | SecurityException e) { + // ignore + } + } +} From 63c648ccc33d7432589e5d0a7f6f1d443437b67f Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 12 Jan 2025 17:19:55 +0800 Subject: [PATCH 24/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/taobao/arthas/core/GlobalOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java index 9b90765fb5b..62ae94e288d 100644 --- a/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java +++ b/core/src/main/java/com/taobao/arthas/core/GlobalOptions.java @@ -157,7 +157,7 @@ public class GlobalOptions { * qlexpress使用参数 */ @Option(level = 1, - name = QLEXPRESS_CONFIG, + name = "qlexpress-config", summary = "config init when use qlexpress, with json-simple, for example: {\"precise\": true }", description = "" ) From dac03f5c65654269c1ee27754bb3805b431d3736 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 12 Jan 2025 20:06:51 +0800 Subject: [PATCH 25/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/command/express/FlowAttribute.java | 9 ++++ .../core/command/express/FlowContext.java | 9 ++++ .../core/command/express/QLExpressTest.java | 50 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java 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 new file mode 100644 index 00000000000..1848b650ca1 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/command/express/FlowAttribute.java @@ -0,0 +1,9 @@ +package com.taobao.arthas.core.command.express; + +public class FlowAttribute { + private String bxApp = "aaa"; + + 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 new file mode 100644 index 00000000000..c1991bdbe79 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/command/express/FlowContext.java @@ -0,0 +1,9 @@ +package com.taobao.arthas.core.command.express; + +public class FlowContext { + private FlowAttribute flowAttribute = new FlowAttribute(); + + public FlowAttribute getFlowAttribute() { + return this.flowAttribute ; + } +} diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java new file mode 100644 index 00000000000..b701c276b2a --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/command/express/QLExpressTest.java @@ -0,0 +1,50 @@ +package com.taobao.arthas.core.command.express; + +import com.taobao.arthas.core.GlobalOptions; +import com.taobao.arthas.core.advisor.Advice; +import com.taobao.arthas.core.command.model.ExpressTypeEnum; +import ognl.OgnlException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @Author TaoKan + * @Date 2025/1/12 5:31 PM + */ +public class QLExpressTest { + + private Express express; + + @BeforeEach + public void setUp() throws ExpressException { + FlowContext context = new FlowContext(); + Object[] params = new Object[4]; + params[0] = context; + Advice advice = Advice.newForAfterReturning(null, getClass(), null, null, params, null); + GlobalOptions.ExpressType = ExpressTypeEnum.QLEXPRESS.getExpressType(); + express = ExpressFactory.unpooledExpress(null).bind(advice).bind("cost", 123); + } + + @Test + public void testStringEquals() throws OgnlException, ExpressException { + String conditionExpress = "\"aaa\".equals(params[0].flowAttribute.getBxApp())"; + boolean result = express.is(conditionExpress); + assertTrue(result); + } + + @Test + public void testObjectEquals() throws OgnlException, ExpressException { + String conditionExpress = "params[0].flowAttribute.getBxApp().equals(\"aaa\")"; + boolean result = express.is(conditionExpress); + assertTrue(result); + } + + @Test + public void testEqualSign() throws OgnlException, ExpressException { + String conditionExpress = "\"aaa\" == params[0].flowAttribute.getBxApp()"; + boolean result = express.is(conditionExpress); + assertTrue(result); + } +} From 99f485078c7f675ec069adc7f8c8649cebeff205 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Sun, 12 Jan 2025 20:18:18 +0800 Subject: [PATCH 26/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arthas/core/command/express/OgnlTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java diff --git a/core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java b/core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java new file mode 100644 index 00000000000..b5a8490e2f5 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/command/express/OgnlTest.java @@ -0,0 +1,46 @@ +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 static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * https://github.com/alibaba/arthas/issues/2954 + */ +public class OgnlTest { + + private Express express; + + @BeforeEach + public void setUp() throws OgnlException, ExpressException { + FlowContext context = new FlowContext(); + Object[] params = new Object[4]; + params[0] = context; + Advice advice = Advice.newForAfterReturning(null, getClass(), null, null, params, null); + express = ExpressFactory.unpooledExpress(null).bind(advice).bind("cost", 123); + } + + @Test + public void testStringEquals() throws OgnlException, ExpressException { + String conditionExpress = "\"aaa\".equals(params[0].flowAttribute.getBxApp())"; + boolean result = express.is(conditionExpress); + assertTrue(result); + } + + @Test + public void testObjectEquals() throws OgnlException, ExpressException { + String conditionExpress = "params[0].flowAttribute.getBxApp().equals(\"aaa\")"; + boolean result = express.is(conditionExpress); + assertTrue(result); + } + + @Test + public void testEqualSign() throws OgnlException, ExpressException { + String conditionExpress = "\"aaa\" == params[0].flowAttribute.getBxApp()"; + boolean result = express.is(conditionExpress); + assertTrue(result); + } +} From ded1ca50391a5ae08a0493b559ed1b37d15130f3 Mon Sep 17 00:00:00 2001 From: "taokankan.tk" Date: Wed, 12 Feb 2025 22:14:13 +0800 Subject: [PATCH 27/27] =?UTF-8?q?=E3=80=90=E6=94=AF=E6=8C=81qlexpress?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E3=80=91=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/docs/doc/options.md | 9 ++++++++- site/docs/en/doc/options.md | 10 ++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/site/docs/doc/options.md b/site/docs/doc/options.md index 910ed728181..04f348c2929 100644 --- a/site/docs/doc/options.md +++ b/site/docs/doc/options.md @@ -19,7 +19,8 @@ | print-parent-fields | true | 是否打印在 parent class 里的 filed | | verbose | false | 是否打印更多详细信息 | | strict | true | 是否启用 strict 模式 | - +| express-type | ognl | 是否切换使用表达式ognl/qlexpress开关 | +| qlexpress-config | | qlexpress4的设置参数,更多信息关注https://github.com/alibaba/QLExpress | ## 查看所有的 options ```bash @@ -62,6 +63,12 @@ $ options n e ed to set object properties. Want to set o bject properties, execute `options strict false` + 1 String express-type ognl Option to use ognl/ql Option to use ognl/qlexpress in commands, + express default ognl, can change to qlexpress. + 1 String qlexpress-config `` config init when use config init when use qlexpress, with json + qlexpress, with json -simple, more information about https:// + -simple github.com/alibaba/QLExpress + ``` ## 获取 option 的值 diff --git a/site/docs/en/doc/options.md b/site/docs/en/doc/options.md index 59c38070135..154c1a69e06 100644 --- a/site/docs/en/doc/options.md +++ b/site/docs/en/doc/options.md @@ -7,7 +7,7 @@ Global options ::: | Name | Default Value | Description | -| ---------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ---------------------- | ------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | unsafe | false | whether to enhance to system-level class. Use it with caution since JVM may hang | | dump | false | whether to dump enhanced class to the external files. If it's on, enhanced class will be dumped into `/${application dir}/arthas-class-dump/`, the specific output path will be output in the console | | batch-re-transform | true | whether to re-transform matched classes in batch | @@ -19,7 +19,8 @@ Global options | print-parent-fields | true | This option enables print files in parent class, default value true. | | verbose | false | This option enables print verbose information | | strict | true | whether to enable strict mode | - +| express-type | ognl | Option to use ognl/qlexpress in commands, default ognl, can change to qlexpress | +| qlexpress-config | | Set the parameters for qlexpress4, for more information https://github.com/alibaba/QLExpress | ## View all options ```bash @@ -62,6 +63,11 @@ $ options n e ed to set object properties. Want to set o bject properties, execute `options strict false` + 1 String express-type ognl Option to use ognl/ql Option to use ognl/qlexpress in commands, + express default ognl, can change to qlexpress. + 1 String qlexpress-config `` config init when use config init when use qlexpress, with json + qlexpress, with json -simple, more information about https:// + -simple github.com/alibaba/QLExpress ``` ## Get special option value