This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git


The following commit(s) were added to refs/heads/master by this push:
     new 066919b  JEXL-307: commented templates throw NPE due to missing 
expected scope Task #JEXL-307 - Variable redeclaration option
066919b is described below

commit 066919bec45d8d65dcf2f7d8f1ad890efeb4b6e1
Author: henrib <hen...@apache.org>
AuthorDate: Thu Jun 11 16:41:18 2020 +0200

    JEXL-307: commented templates throw NPE due to missing expected scope
    Task #JEXL-307 - Variable redeclaration option
---
 .../commons/jexl3/internal/TemplateEngine.java     |  4 +--
 .../commons/jexl3/internal/TemplateScript.java     | 16 +++++++---
 .../java/org/apache/commons/jexl3/JXLTTest.java    | 36 ++++++++++++++++++++++
 3 files changed, 49 insertions(+), 7 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java 
b/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java
index e8607cf..72a081a 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java
@@ -62,7 +62,7 @@ public final class TemplateEngine extends JxltEngine {
      */
     public TemplateEngine(Engine aJexl, boolean noScript, int cacheSize, char 
immediate, char deferred) {
         this.jexl = aJexl;
-        this.cache = new SoftCache<String, TemplateExpression>(cacheSize);
+        this.cache = new SoftCache<>(cacheSize);
         immediateChar = immediate;
         deferredChar = deferred;
         noscript = noScript;
@@ -127,7 +127,7 @@ public final class TemplateEngine extends JxltEngine {
          */
         private ExpressionBuilder(int size) {
             counts = new int[]{0, 0, 0};
-            expressions = new ArrayList<TemplateExpression>(size <= 0 ? 3 : 
size);
+            expressions = new ArrayList<>(size <= 0 ? 3 : size);
         }
 
         /**
diff --git 
a/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java 
b/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java
index 3d4ae5e..12fa01e 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java
@@ -84,7 +84,7 @@ public final class TemplateScript implements 
JxltEngine.Template {
         this.jxlt = engine;
         this.prefix = directive;
         List<Block> blocks = jxlt.readTemplate(prefix, reader);
-        List<TemplateExpression> uexprs = new ArrayList<TemplateExpression>();
+        List<TemplateExpression> uexprs = new ArrayList<>();
         StringBuilder strb = new StringBuilder();
         int nuexpr = 0;
         int codeStart = -1;
@@ -124,7 +124,7 @@ public final class TemplateScript implements 
JxltEngine.Template {
         script = jxlt.getEngine().parse(info.at(1, 1), false, strb.toString(), 
scope).script();
         // seek the map of expression number to scope so we can parse Unified
         // expression blocks with the appropriate symbols
-        Map<Integer, JexlNode.Info> minfo = new TreeMap<Integer, 
JexlNode.Info>();
+        Map<Integer, JexlNode.Info> minfo = new TreeMap<>();
         collectPrintScope(script.script(), minfo);
         // jexl:print(...) expression counter
         int jpe = 0;
@@ -132,9 +132,15 @@ public final class TemplateScript implements 
JxltEngine.Template {
         for (Block block : blocks) {
             if (block.getType() == BlockType.VERBATIM) {
                 JexlNode.Info ji = minfo.get(jpe);
-                uexprs.add(
-                        jxlt.parseExpression(ji, block.getBody(), scopeOf(ji))
-                );
+                TemplateExpression te;
+                // no node info means this verbatim is surrounded by comments 
markers;
+                // expr at this index is never called
+                if (ji != null) {
+                    te = jxlt.parseExpression(ji, block.getBody(), 
scopeOf(ji));
+                } else {
+                    te = jxlt.new ConstantExpression(block.getBody(), null);
+                }
+                uexprs.add(te);
                 jpe += 1;
             }
         }
diff --git a/src/test/java/org/apache/commons/jexl3/JXLTTest.java 
b/src/test/java/org/apache/commons/jexl3/JXLTTest.java
index f68894b..c154a2e 100644
--- a/src/test/java/org/apache/commons/jexl3/JXLTTest.java
+++ b/src/test/java/org/apache/commons/jexl3/JXLTTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.commons.jexl3;
 
+import java.io.File;
 import org.apache.commons.jexl3.internal.Debugger;
 import org.apache.commons.jexl3.internal.TemplateDebugger;
 import org.apache.commons.logging.Log;
@@ -1129,7 +1130,42 @@ public class JXLTTest extends JexlTestCase {
         } catch (JexlException xany) {
             Assert.assertTrue(xany.getMessage().contains("tab"));
         }
+    }
+    
+    @Test
+    public void testCommentedTemplate0() throws Exception {
+        JexlContext ctxt = new MapContext();
+        JexlEngine jexl = new JexlBuilder().create();
+        JxltEngine jxlt = jexl.createJxltEngine();
+        JxltEngine.Template tmplt;
+        String src = "$$/*\n"
+                + "Hello\n"
+                + "$$*/";
+        tmplt = jxlt.createTemplate(src);
+        Assert.assertNotNull(tmplt);
+        Writer strw = new StringWriter();
+        tmplt.evaluate(ctxt, strw);
+        Assert.assertTrue(strw.toString().isEmpty());
+    }
 
+    @Test
+    public void testCommentedTemplate1() throws Exception {
+        JexlContext ctxt = new MapContext();
+        JexlEngine jexl = new JexlBuilder().create();
+        JxltEngine jxlt = jexl.createJxltEngine();
+        JxltEngine.Template tmplt;
+        String src = "$$/*\n"
+                + "one\n"
+                + "$$*/\n"
+                + "42\n"
+                + "$$/*\n"
+                + "three\n"
+                + "$$*/\n";
+        tmplt = jxlt.createTemplate(src);
+        Assert.assertNotNull(tmplt);
+        Writer strw = new StringWriter();
+        tmplt.evaluate(ctxt, strw);
+        Assert.assertEquals("42\n", strw.toString());
     }
 
 }

Reply via email to