aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Brisson <cbrisson@apache.org>2019-04-16 09:22:58 +0000
committerClaude Brisson <cbrisson@apache.org>2019-04-16 09:22:58 +0000
commit8705542a685ae3eb4417a7ba2182a1892efcc6c8 (patch)
tree042901906a62e77512e83a0aa18ba5e2463b4319
parent0b2e0213a25fba6a96613bdbd2e892afd196e838 (diff)
downloadapache-velocity-engine-8705542a685ae3eb4417a7ba2182a1892efcc6c8.tar.gz
[engine] Fix VELOCITY-912 : hyphen in identifiers for subproperties
git-svn-id: https://svn.apache.org/repos/asf/velocity/engine/trunk@1857633 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--velocity-engine-core/src/main/parser/Parser.jjt54
-rw-r--r--velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java5
2 files changed, 40 insertions, 19 deletions
diff --git a/velocity-engine-core/src/main/parser/Parser.jjt b/velocity-engine-core/src/main/parser/Parser.jjt
index 720643d9..6f1626bd 100644
--- a/velocity-engine-core/src/main/parser/Parser.jjt
+++ b/velocity-engine-core/src/main/parser/Parser.jjt
@@ -152,6 +152,12 @@ public class Parser
*/
public boolean strictEscape = false;
+ /**
+ * Set to true if the propoerty
+ * RuntimeConstants.PARSER_HYPHEN_ALLOWED is set to true
+ */
+ public boolean hyphenAllowedInIdentifiers = false;
+
VelocityCharStream velcharstream = null;
private RuntimeServices rsvc = null;
@@ -196,6 +202,9 @@ public class Parser
strictEscape =
rs.getBoolean(RuntimeConstants.RUNTIME_REFERENCES_STRICT_ESCAPE, false);
+ hyphenAllowedInIdentifiers =
+ rs.getBoolean(RuntimeConstants.PARSER_HYPHEN_ALLOWED, false);
+
/*
* and save the RuntimeServices
*/
@@ -675,13 +684,13 @@ TOKEN :
}
/* In all other states, drop the zero-width whitespace */
-<REFERENCE,REFMODIFIER,REFMOD3,REFINDEX,DIRECTIVE,REFMOD2,DEFAULT,REFMOD,IN_TEXTBLOCK,IN_MULTILINE_COMMENT,IN_FORMAL_COMMENT,IN_SINGLE_LINE_COMMENT>
+<REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD3,REFINDEX,DIRECTIVE,REFMOD2,DEFAULT,REFMOD,IN_TEXTBLOCK,IN_MULTILINE_COMMENT,IN_FORMAL_COMMENT,IN_SINGLE_LINE_COMMENT>
SKIP :
{
<BEFORE_EOF: "\u200B">
}
-<REFERENCE, REFMODIFIER, REFMOD3>
+<REFERENCE, REFMODIFIER, OLD_REFMODIFIER, REFMOD3>
TOKEN:
{
<INDEX_LBRACKET: "[">
@@ -756,7 +765,7 @@ TOKEN :
}
}
-<DIRECTIVE,REFMODIFIER>
+<DIRECTIVE,REFMODIFIER,OLD_REFMODIFIER>
TOKEN:
{
<LPAREN: "(">
@@ -769,7 +778,7 @@ TOKEN:
* to REFMOD2 -> Modifier()
*/
- if (curLexState == REFMODIFIER )
+ if (curLexState == REFMODIFIER || curLexState == OLD_REFMODIFIER )
switchTo( REFMOD2 );
}
}
@@ -842,7 +851,7 @@ TOKEN:
* http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-ie.htm#tth_sEc3.12
*
*/
-<DEFAULT, PRE_REFERENCE, PRE_OLD_REFERENCE, REFERENCE, REFMODIFIER, REFMOD2, REFMOD3>
+<DEFAULT, PRE_REFERENCE, PRE_OLD_REFERENCE, REFERENCE, REFMODIFIER, OLD_REFMODIFIER, REFMOD2, REFMOD3>
TOKEN:
{
<SET_DIRECTIVE: ("#set" | "#{set}") (" "|"\t")* "(">
@@ -869,7 +878,7 @@ TOKEN:
* to REFMOD2 -> Modifier()
*/
- if (curLexState == REFMODIFIER )
+ if (curLexState == REFMODIFIER || curLexState == OLD_REFMODIFIER )
switchTo( REFMOD2 );
}
}
@@ -896,7 +905,7 @@ MORE :
stateStackPop();
}
- int preReferenceState = parser.getRuntimeServices().isHyphenAllowedInIdentifiers() ? PRE_OLD_REFERENCE : PRE_REFERENCE;
+ int preReferenceState = parser.hyphenAllowedInIdentifiers ? PRE_OLD_REFERENCE : PRE_REFERENCE;
trace( " $ : going to " + lexStateNames[preReferenceState]);
@@ -923,7 +932,7 @@ MORE :
stateStackPop();
}
- int preReferenceState = parser.getRuntimeServices().isHyphenAllowedInIdentifiers() ? PRE_OLD_REFERENCE : PRE_REFERENCE;
+ int preReferenceState = parser.hyphenAllowedInIdentifiers ? PRE_OLD_REFERENCE : PRE_REFERENCE;
trace( " $ : going to " + lexStateNames[preReferenceState]);
@@ -990,7 +999,7 @@ MORE :
* you are going into DIRECTIVE while in REFERENCE. -gmj
*/
- if (curLexState == REFERENCE || curLexState == PRE_REFERENCE || curLexState == PRE_OLD_REFERENCE || curLexState == REFMODIFIER )
+ if (curLexState == REFERENCE || curLexState == PRE_REFERENCE || curLexState == PRE_OLD_REFERENCE || curLexState == REFMODIFIER || curLexState == OLD_REFMODIFIER )
{
stateStackPop();
}
@@ -1009,7 +1018,7 @@ MORE :
// treat the single line comment case separately
// to avoid ##<EOF> errors
-<DEFAULT,PRE_DIRECTIVE,DIRECTIVE,REFERENCE,PRE_REFERENCE,PRE_OLD_REFERENCE,REFMOD2,REFMOD3,REFMODIFIER>
+<DEFAULT,PRE_DIRECTIVE,DIRECTIVE,REFERENCE,PRE_REFERENCE,PRE_OLD_REFERENCE,REFMOD2,REFMOD3,REFMODIFIER,OLD_REFMODIFIER>
TOKEN :
{
<SINGLE_LINE_COMMENT_START: "##">
@@ -1173,7 +1182,7 @@ TOKEN :
}
}
-<REFERENCE,DIRECTIVE,REFMODIFIER,REFMOD2,REFINDEX,ALT_VAL>
+<REFERENCE,DIRECTIVE,REFMODIFIER,OLD_REFMODIFIER,REFMOD2,REFINDEX,ALT_VAL>
TOKEN:
{
<TRUE: "true">
@@ -1315,6 +1324,7 @@ TOKEN:
* |________________> REFERENCE : state initiated by the identifier. Continues
* | | | until end of the reference, or the . character.
* |_____________ > REFMODIFIER : state switched to when the <DOT> is encountered.
+ * | | (or OLD_REFMODIFIER if '-' is allowed in identifiers)
* | | note that this is a switch, not a push. See notes at bottom.
* |_________ > REFMOD2 : state switch to when the LPAREN is encountered.
* | again, this is a switch, not a push.
@@ -1339,19 +1349,22 @@ TOKEN :
}
}
-<PRE_OLD_REFERENCE>
+<PRE_OLD_REFERENCE,OLD_REFMODIFIER>
TOKEN :
{
<#OLD_ALPHA_CHAR: ["a"-"z", "A"-"Z", "_"] >
| <#OLD_IDENTIFIER_CHAR: [ "a"-"z", "A"-"Z", "0"-"9", "_", "-" ] >
| <OLD_IDENTIFIER: ( <OLD_ALPHA_CHAR> ) (<OLD_IDENTIFIER_CHAR>)* >
{
- switchTo(REFERENCE);
+ if (curLexState == PRE_OLD_REFERENCE)
+ {
+ switchTo(REFERENCE);
+ }
}
}
-<REFERENCE,REFMODIFIER,REFMOD2,REFMOD3>
+<REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD2,REFMOD3>
TOKEN:
{
<DOT: "." <ALPHA_CHAR>>
@@ -1370,13 +1383,15 @@ TOKEN:
matchedToken.image = ".";
- trace("DOT : switching to " + REFMODIFIER);
- switchTo(REFMODIFIER);
+ int refModifierState = parser.hyphenAllowedInIdentifiers ? OLD_REFMODIFIER : REFMODIFIER;
+
+ trace("DOT : switching to " + lexStateNames[refModifierState]);
+ switchTo(refModifierState);
}
}
-<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,REFMOD3>
+<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD3>
TOKEN :
{
<LCURLY: "{">
@@ -1403,7 +1418,7 @@ TOKEN :
}
}
-<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,REFMOD,REFMOD3>
+<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD,REFMOD3>
SPECIAL_TOKEN :
{
<REFERENCE_TERMINATOR: ~[] >
@@ -2471,7 +2486,8 @@ void PrimaryExpression() #void : {}
REFERENCE : Triggered by the <IDENTIFIER>
- REFMODIFIER : Triggered by .<alpha> when in REFERENCE, REFMODIFIER or REFMOD3
+ REFMODIFIER : Triggered by .<alpha> when in REFERENCE, REFMODIFIER or REFMOD3. When '-'
+ is allowed in identifiers, this state is called OLD_REFMODIFIER.
REFMOD2 : Triggered by '(' when in REFMODIFIER
diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java b/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java
index 4ab2b8b2..e1fdce19 100644
--- a/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java
+++ b/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java
@@ -42,4 +42,9 @@ public class HyphenInIdentifiersTestCase extends BaseTestCase
{
assertEvalEquals("6","#set($var-1 = 7)#set($var-2 = $var-1 - 1)$var-2");
}
+
+ public void testHyphenInCollection()
+ {
+ assertEvalEquals("foofoofoo","#set($map = {'name-with-hyphen':'foo'})$map.name-with-hyphen${map.name-with-hyphen}${map.get('name-with-hyphen')}");
+ }
}