Explorar o código

优化表达式解析

zhou-hao %!s(int64=5) %!d(string=hai) anos
pai
achega
9b5f749a82

+ 15 - 12
hsweb-core/src/main/java/org/hswebframework/web/utils/TemplateParser.java

@@ -41,6 +41,8 @@ public class TemplateParser {
 
     private int len = 0;
 
+    private byte prepareFlag = 0;
+
     public void setParsed(char[] chars, int end) {
         for (int i = 0; i < end; i++) {
             char aChar = chars[i];
@@ -53,7 +55,7 @@ public class TemplateParser {
     }
 
     public void setParsed(char... chars) {
-       setParsed(chars,chars.length);
+        setParsed(chars, chars.length);
     }
 
     private void init() {
@@ -62,11 +64,17 @@ public class TemplateParser {
         newArr = new char[templateArray.length * 2];
     }
 
+    private boolean isPreparing() {
+        return prepareFlag > 0;
+    }
+
     private boolean isPrepare() {
-        for (char c : prepareStartSymbol) {
-            if (c == symbol) {
-                return true;
-            }
+        if (prepareStartSymbol[prepareFlag] == symbol) {
+            prepareFlag++;
+        }
+        if (prepareFlag >= prepareStartSymbol.length) {
+            prepareFlag = 0;
+            return true;
         }
         return false;
     }
@@ -85,7 +93,6 @@ public class TemplateParser {
         return pos < templateArray.length;
     }
 
-
     public String parse(Function<String, String> propertyMapping) {
         init();
         boolean inPrepare = false;
@@ -98,21 +105,17 @@ public class TemplateParser {
                 inPrepare = true;
             } else if (isPrepareEnd()) {
                 inPrepare = false;
-
-
                 setParsed(propertyMapping.apply(new String(expression, 0, expressionPos)).toCharArray());
                 expressionPos = 0;
             } else if (inPrepare) {
                 expression[expressionPos++] = symbol;
-            } else {
+            } else if (!isPreparing()) {
                 setParsed(symbol);
             }
         }
 
-        if (isPrepareEnd()) {
-
+        if (isPrepareEnd() && expressionPos > 0) {
             setParsed(propertyMapping.apply(new String(expression, 0, expressionPos)).toCharArray());
-
         } else {
             setParsed(symbol);
         }

+ 10 - 1
hsweb-core/src/test/java/org/hswebframework/web/utils/ExpressionUtilsTest.java

@@ -22,11 +22,20 @@ public class ExpressionUtilsTest {
 
     @Test
     public void testComplete(){
-
         TemplateParser.parse("${#data[payload][a_name]} ${#data[payload][b_name]} 发生 ${#data[payload][alarm_type_name]}",e->{
             System.out.println(e);
             return e;
         });
+    }
+
+    @Test
+    public void testJson(){
+
+       Assert.assertEquals("{\"name\":\"test\"}",TemplateParser.parse("{\"name\":\"${#name}\"}",e->{
+            System.out.println(e);
+            Assert.assertEquals(e,"#name");
+            return "test";
+        }));
 
     }
 }