diff --git a/src/main/java/com/ql/util/express/config/QLExpressRunStrategy.java b/src/main/java/com/ql/util/express/config/QLExpressRunStrategy.java index 9a04bf0cd75d669b750d7584963849f8ee52cd4b..aac61ca52ead064f6e001447e587673535acdf62 100644 --- a/src/main/java/com/ql/util/express/config/QLExpressRunStrategy.java +++ b/src/main/java/com/ql/util/express/config/QLExpressRunStrategy.java @@ -15,12 +15,26 @@ public class QLExpressRunStrategy { /** * 预防空指针 */ + private static boolean avoidNullPointer = false; - + + /** + * 当空对象进行大小比较时,返回false, 例如 1 > null 和 null > 1都返回false + */ + private static boolean compareNullLessMoreAsFalse = false; + + public static boolean isCompareNullLessMoreAsFalse() { + return compareNullLessMoreAsFalse; + } + + public static void setCompareNullLessMoreAsFalse(boolean compareNullLessMoreAsFalse) { + QLExpressRunStrategy.compareNullLessMoreAsFalse = compareNullLessMoreAsFalse; + } + public static boolean isAvoidNullPointer() { return avoidNullPointer; } - + public static void setAvoidNullPointer(boolean avoidNullPointer) { QLExpressRunStrategy.avoidNullPointer = avoidNullPointer; } diff --git a/src/main/java/com/ql/util/express/instruction/op/OperatorEqualsLessMore.java b/src/main/java/com/ql/util/express/instruction/op/OperatorEqualsLessMore.java index 12b19deea5c9cd48f67d1d0611c619329f68c074..f78fa0e7c2cf5fd726539a8feb94abb4e164e2b9 100644 --- a/src/main/java/com/ql/util/express/instruction/op/OperatorEqualsLessMore.java +++ b/src/main/java/com/ql/util/express/instruction/op/OperatorEqualsLessMore.java @@ -3,6 +3,8 @@ package com.ql.util.express.instruction.op; import com.ql.util.express.Operator; import com.ql.util.express.exception.QLException; +import static com.ql.util.express.config.QLExpressRunStrategy.*; + /** * 处理比较操作符号 */ @@ -38,6 +40,9 @@ public class OperatorEqualsLessMore extends Operator { } //进行其他大小比较操作 if (obj1 == null || obj2 == null){ + if (isCompareNullLessMoreAsFalse()) { + return false; + } throw new QLException("空操作数无法进行数字比较操作:left = " + obj1+",right = "+ obj2); } int i = Operator.compareData(obj1, obj2); diff --git a/src/main/java/com/ql/util/express/instruction/op/OperatorField.java b/src/main/java/com/ql/util/express/instruction/op/OperatorField.java index 77917e564ec594b9247c4848e693640436c29956..639fae51765dbd6956fe279015d9a0ce4a71eee7 100644 --- a/src/main/java/com/ql/util/express/instruction/op/OperatorField.java +++ b/src/main/java/com/ql/util/express/instruction/op/OperatorField.java @@ -3,6 +3,7 @@ package com.ql.util.express.instruction.op; import com.ql.util.express.ArraySwap; import com.ql.util.express.InstructionSetContext; import com.ql.util.express.OperateData; +import com.ql.util.express.config.QLExpressRunStrategy; import com.ql.util.express.instruction.OperateDataCacheManager; import com.ql.util.express.instruction.opdata.OperateDataField; @@ -17,7 +18,11 @@ public class OperatorField extends OperatorBase { } public OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception { - Object obj = list.get(0).getObject(parent); + OperateData operateData = list.get(0); + if (operateData == null && QLExpressRunStrategy.isAvoidNullPointer()) { + return null; + } + Object obj = operateData.getObject(parent); return OperateDataCacheManager.fetchOperateDataField(obj,this.filedName); } public String toString(){ diff --git a/src/test/java/com/ql/util/express/bugfix/NullCompareTest.java b/src/test/java/com/ql/util/express/bugfix/NullCompareTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d38ea79d65b423cfc49b0f4541629b22520dd5a6 --- /dev/null +++ b/src/test/java/com/ql/util/express/bugfix/NullCompareTest.java @@ -0,0 +1,56 @@ +package com.ql.util.express.bugfix; + +import com.ql.util.express.DefaultContext; +import com.ql.util.express.ExpressRunner; +import com.ql.util.express.IExpressContext; +import com.ql.util.express.config.QLExpressRunStrategy; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class NullCompareTest { + + @Before + public void before() + { + QLExpressRunStrategy.setCompareNullLessMoreAsFalse(true); + } + @After + public void after() + { + QLExpressRunStrategy.setCompareNullLessMoreAsFalse(false); + } + @Test + public void testNullCompar() throws Exception{ + + ExpressRunner runner = new ExpressRunner(); + String[] explist = new String[]{ + "x < 1", + "y > 1", + "x != 2", + }; + for(String exp:explist) { + IExpressContext context = new DefaultContext(); + System.out.println(exp); + ((DefaultContext) context).put("x",2); + Object result = runner.execute(exp, context, null, true, false); + Assert.assertTrue((Boolean)result==false); + System.out.println(result); + } + + explist = new String[]{ + "x > 1", + "y == null", + "x == 2", + }; + for(String exp:explist) { + IExpressContext context = new DefaultContext(); + System.out.println(exp); + ((DefaultContext) context).put("x",2); + Object result = runner.execute(exp, context, null, true, false); + Assert.assertTrue((Boolean)result==true); + System.out.println(result); + } + } +} diff --git a/src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java b/src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java index fedffc9ed1148f4da3f11569311c26d6414f076c..29455593a38faba100556c19f52e10efdf28fac2 100644 --- a/src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java +++ b/src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java @@ -9,34 +9,12 @@ import java.lang.reflect.Method; public class RecursivelyRunnerTest { - static final String TEST_EXPRESS = "eval('10+10')+eval('20')+eval('30-10')"; - - static final ExpressRunner globalRunner = new ExpressRunner(); - static{ - globalRunner.addFunction("eval",new GlobalEvalOperator()); - } - - - @Test - public void testErrorRecursivelyInvoke() throws Exception{ - - try { - - Object r = globalRunner.execute(TEST_EXPRESS, null, null, true, false); - System.out.println(r); - }catch (Exception e){ -// e.printStackTrace(); - System.out.println("符合预期,嵌套调用同一个ExpressRunner不支持!"); - } - - } - @Test public void testEvalOperator() throws Exception{ ExpressRunner runner = new ExpressRunner(); runner.addFunction("eval",new EvalOperator()); - - Object r = runner.execute(TEST_EXPRESS, null, null, true, false); + String express = "eval('10')+eval('20')+eval('30')"; + Object r = runner.execute(express, null, null, true, false); System.out.println(r); } @@ -53,22 +31,12 @@ public class RecursivelyRunnerTest { runner.addFunctionOfServiceMethod(name, subRunner, name, m.getParameterTypes(), null); } - - Object r = runner.execute(TEST_EXPRESS, null, null, true, false); + String express = "eval('10')+eval('20')+eval('30')"; + Object r = runner.execute(express, null, null, true, false); System.out.println(r); } - public static class GlobalEvalOperator extends Operator{ - - - @Override - public Object executeInner(Object[] list) throws Exception { - Object result = globalRunner.execute((String) list[0], new DefaultContext(), null, true, false); - return result; - } - } - public static class EvalOperator extends Operator{ private ExpressRunner subRun = new ExpressRunner(); diff --git a/src/test/java/com/ql/util/express/test/TimeOutExceptionTest.java b/src/test/java/com/ql/util/express/test/TimeOutExceptionTest.java index f616d2a9b68c67bc90603ae647b5f06b86fe815b..aa6cafe21818684b7ee08e8edf075d7da69e6dc0 100644 --- a/src/test/java/com/ql/util/express/test/TimeOutExceptionTest.java +++ b/src/test/java/com/ql/util/express/test/TimeOutExceptionTest.java @@ -14,7 +14,7 @@ public class TimeOutExceptionTest { private static String[] expressList = new String[]{ "sum=0;for(i=0;i<1000000000;i++){sum=sum+i;}return sum;", - "for(i=1;i<10;i++){System.out.println('loop time:'+i);Thread.sleep(3000);}" + "for(i=1;i<10;i++){System.out.println('loop time:'+i);Thread.sleep(300);}" }; @Test