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()); } }