Author: markt Date: Mon Feb 24 11:18:37 2014 New Revision: 1571245 URL: http://svn.apache.org/r1571245 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56179 Re-generate parser Add some test cases
Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.java tomcat/trunk/test/org/apache/el/parser/TestELParser.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParser.java?rev=1571245&r1=1571244&r2=1571245&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/parser/ELParser.java (original) +++ tomcat/trunk/java/org/apache/el/parser/ELParser.java Mon Feb 24 11:18:37 2014 @@ -222,7 +222,7 @@ public class ELParser/*@bgen(jjtree)*/im * Assignment */ final public void Assignment() throws ParseException { - if (jj_2_2(3)) { + if (jj_2_2(4)) { LambdaExpression(); } else { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1529,7 +1529,7 @@ public class ELParser/*@bgen(jjtree)*/im * For Grouped Operations, Identifiers, and Functions */ final public void NonLiteral() throws ParseException { - if (jj_2_6(3)) { + if (jj_2_6(5)) { LambdaExpressionOrInvocation(); } else { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -2084,7 +2084,7 @@ public class ELParser/*@bgen(jjtree)*/im finally { jj_save(7, xla); } } - private boolean jj_3R_40() { + private boolean jj_3R_41() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(39)) { @@ -2094,47 +2094,53 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_39() { - if (jj_3R_43()) return true; + private boolean jj_3R_30() { + if (jj_3R_22()) return true; + return false; + } + + private boolean jj_3R_40() { + if (jj_3R_44()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_44()) { jj_scanpos = xsp; break; } + if (jj_3R_45()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_106() { - if (jj_3R_35()) return true; + private boolean jj_3R_107() { + if (jj_3R_36()) return true; return false; } - private boolean jj_3R_104() { - if (jj_3R_106()) return true; + private boolean jj_3R_105() { + if (jj_3R_107()) return true; return false; } - private boolean jj_3R_42() { + private boolean jj_3R_43() { if (jj_scan_token(COMMA)) return true; + if (jj_3R_38()) return true; return false; } - private boolean jj_3R_33() { - if (jj_3R_39()) return true; + private boolean jj_3R_34() { + if (jj_3R_40()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_40()) { jj_scanpos = xsp; break; } + if (jj_3R_41()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_36() { + private boolean jj_3R_37() { if (jj_scan_token(COMMA)) return true; return false; } - private boolean jj_3R_34() { + private boolean jj_3R_35() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(41)) { @@ -2144,26 +2150,26 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_98() { + private boolean jj_3R_99() { if (jj_scan_token(START_SET_OR_MAP)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_104()) jj_scanpos = xsp; + if (jj_3R_105()) jj_scanpos = xsp; if (jj_scan_token(RBRACE)) return true; return false; } - private boolean jj_3R_103() { - if (jj_3R_35()) return true; + private boolean jj_3R_104() { + if (jj_3R_36()) return true; return false; } private boolean jj_3R_29() { - if (jj_3R_33()) return true; + if (jj_3R_34()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_34()) { jj_scanpos = xsp; break; } + if (jj_3R_35()) { jj_scanpos = xsp; break; } } return false; } @@ -2175,31 +2181,31 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_97() { + private boolean jj_3R_98() { if (jj_scan_token(LBRACK)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_103()) jj_scanpos = xsp; + if (jj_3R_104()) jj_scanpos = xsp; if (jj_scan_token(RBRACK)) return true; return false; } - private boolean jj_3R_38() { - if (jj_3R_37()) return true; + private boolean jj_3R_39() { + if (jj_3R_38()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_42()) { jj_scanpos = xsp; break; } + if (jj_3R_43()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_30() { - if (jj_3R_35()) return true; + private boolean jj_3R_31() { + if (jj_3R_36()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_36()) { jj_scanpos = xsp; break; } + if (jj_3R_37()) { jj_scanpos = xsp; break; } } return false; } @@ -2223,7 +2229,7 @@ public class ELParser/*@bgen(jjtree)*/im if (jj_scan_token(START_SET_OR_MAP)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_30()) jj_scanpos = xsp; + if (jj_3R_31()) jj_scanpos = xsp; if (jj_scan_token(RBRACE)) return true; return false; } @@ -2248,22 +2254,22 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_32() { + private boolean jj_3R_33() { if (jj_scan_token(LPAREN)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_38()) jj_scanpos = xsp; + if (jj_3R_39()) jj_scanpos = xsp; if (jj_scan_token(RPAREN)) return true; return false; } - private boolean jj_3R_88() { - if (jj_3R_98()) return true; + private boolean jj_3R_89() { + if (jj_3R_99()) return true; return false; } - private boolean jj_3R_87() { - if (jj_3R_97()) return true; + private boolean jj_3R_88() { + if (jj_3R_98()) return true; return false; } @@ -2271,6 +2277,13 @@ public class ELParser/*@bgen(jjtree)*/im if (jj_scan_token(LPAREN)) return true; if (jj_3R_27()) return true; if (jj_scan_token(ARROW)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_4()) { + jj_scanpos = xsp; + if (jj_3R_30()) return true; + } + if (jj_scan_token(RPAREN)) return true; return false; } @@ -2279,19 +2292,19 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_86() { - if (jj_3R_37()) return true; + private boolean jj_3R_87() { + if (jj_3R_38()) return true; return false; } - private boolean jj_3R_85() { - if (jj_3R_96()) return true; + private boolean jj_3R_86() { + if (jj_3R_97()) return true; return false; } - private boolean jj_3R_84() { + private boolean jj_3R_85() { if (jj_scan_token(LPAREN)) return true; - if (jj_3R_35()) return true; + if (jj_3R_36()) return true; return false; } @@ -2300,22 +2313,22 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_76() { + private boolean jj_3R_77() { Token xsp; xsp = jj_scanpos; if (jj_3_6()) { jj_scanpos = xsp; - if (jj_3R_84()) { - jj_scanpos = xsp; if (jj_3R_85()) { jj_scanpos = xsp; if (jj_3R_86()) { jj_scanpos = xsp; + if (jj_3R_87()) { + jj_scanpos = xsp; if (jj_3_8()) { jj_scanpos = xsp; - if (jj_3R_87()) { + if (jj_3R_88()) { jj_scanpos = xsp; - if (jj_3R_88()) return true; + if (jj_3R_89()) return true; } } } @@ -2325,17 +2338,17 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_31() { - if (jj_3R_37()) return true; + private boolean jj_3R_32() { + if (jj_3R_38()) return true; return false; } private boolean jj_3R_27() { Token xsp; xsp = jj_scanpos; - if (jj_3R_31()) { + if (jj_3R_32()) { jj_scanpos = xsp; - if (jj_3R_32()) return true; + if (jj_3R_33()) return true; } return false; } @@ -2346,7 +2359,7 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_105() { + private boolean jj_3R_106() { if (jj_scan_token(LPAREN)) return true; return false; } @@ -2363,12 +2376,12 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_45() { + private boolean jj_3R_46() { if (jj_scan_token(SEMICOLON)) return true; return false; } - private boolean jj_3R_90() { + private boolean jj_3R_91() { if (jj_scan_token(LBRACK)) return true; return false; } @@ -2383,8 +2396,8 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_78() { - if (jj_3R_90()) return true; + private boolean jj_3R_79() { + if (jj_3R_91()) return true; return false; } @@ -2403,131 +2416,131 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_89() { + private boolean jj_3R_90() { if (jj_scan_token(DOT)) return true; return false; } - private boolean jj_3R_41() { + private boolean jj_3R_42() { if (jj_3R_20()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_45()) { jj_scanpos = xsp; break; } + if (jj_3R_46()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_77() { - if (jj_3R_89()) return true; + private boolean jj_3R_78() { + if (jj_3R_90()) return true; return false; } - private boolean jj_3R_74() { + private boolean jj_3R_75() { Token xsp; xsp = jj_scanpos; - if (jj_3R_77()) { + if (jj_3R_78()) { jj_scanpos = xsp; - if (jj_3R_78()) return true; + if (jj_3R_79()) return true; } return false; } - private boolean jj_3R_35() { - if (jj_3R_41()) return true; + private boolean jj_3R_36() { + if (jj_3R_42()) return true; return false; } - private boolean jj_3R_71() { - if (jj_3R_74()) return true; + private boolean jj_3R_72() { + if (jj_3R_75()) return true; return false; } - private boolean jj_3R_73() { - if (jj_3R_76()) return true; + private boolean jj_3R_74() { + if (jj_3R_77()) return true; return false; } - private boolean jj_3R_70() { + private boolean jj_3R_71() { Token xsp; xsp = jj_scanpos; - if (jj_3R_72()) { + if (jj_3R_73()) { jj_scanpos = xsp; - if (jj_3R_73()) return true; + if (jj_3R_74()) return true; } return false; } - private boolean jj_3R_72() { - if (jj_3R_75()) return true; + private boolean jj_3R_73() { + if (jj_3R_76()) return true; return false; } - private boolean jj_3R_69() { - if (jj_3R_70()) return true; + private boolean jj_3R_70() { + if (jj_3R_71()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_71()) { jj_scanpos = xsp; break; } + if (jj_3R_72()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_95() { + private boolean jj_3R_96() { if (jj_scan_token(NULL)) return true; return false; } - private boolean jj_3R_65() { - if (jj_3R_69()) return true; + private boolean jj_3R_66() { + if (jj_3R_70()) return true; return false; } - private boolean jj_3R_64() { + private boolean jj_3R_65() { if (jj_scan_token(EMPTY)) return true; - if (jj_3R_58()) return true; + if (jj_3R_59()) return true; return false; } - private boolean jj_3R_63() { + private boolean jj_3R_64() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(37)) { jj_scanpos = xsp; if (jj_scan_token(38)) return true; } - if (jj_3R_58()) return true; + if (jj_3R_59()) return true; return false; } - private boolean jj_3R_58() { + private boolean jj_3R_59() { Token xsp; xsp = jj_scanpos; - if (jj_3R_62()) { - jj_scanpos = xsp; if (jj_3R_63()) { jj_scanpos = xsp; if (jj_3R_64()) { jj_scanpos = xsp; - if (jj_3R_65()) return true; + if (jj_3R_65()) { + jj_scanpos = xsp; + if (jj_3R_66()) return true; } } } return false; } - private boolean jj_3R_62() { + private boolean jj_3R_63() { if (jj_scan_token(MINUS)) return true; - if (jj_3R_58()) return true; + if (jj_3R_59()) return true; return false; } - private boolean jj_3R_94() { + private boolean jj_3R_95() { if (jj_scan_token(STRING_LITERAL)) return true; return false; } - private boolean jj_3R_68() { + private boolean jj_3R_69() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(51)) { @@ -2537,12 +2550,12 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_93() { + private boolean jj_3R_94() { if (jj_scan_token(INTEGER_LITERAL)) return true; return false; } - private boolean jj_3R_67() { + private boolean jj_3R_68() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(49)) { @@ -2552,95 +2565,100 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_59() { + private boolean jj_3R_60() { Token xsp; xsp = jj_scanpos; - if (jj_3R_66()) { - jj_scanpos = xsp; if (jj_3R_67()) { jj_scanpos = xsp; - if (jj_3R_68()) return true; + if (jj_3R_68()) { + jj_scanpos = xsp; + if (jj_3R_69()) return true; } } return false; } - private boolean jj_3R_66() { + private boolean jj_3R_67() { if (jj_scan_token(MULT)) return true; return false; } - private boolean jj_3R_56() { - if (jj_3R_58()) return true; + private boolean jj_3R_57() { + if (jj_3R_59()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_59()) { jj_scanpos = xsp; break; } + if (jj_3R_60()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_92() { + private boolean jj_3R_93() { if (jj_scan_token(FLOATING_POINT_LITERAL)) return true; return false; } - private boolean jj_3R_61() { + private boolean jj_3R_62() { if (jj_scan_token(MINUS)) return true; return false; } - private boolean jj_3R_100() { + private boolean jj_3R_101() { if (jj_scan_token(FALSE)) return true; return false; } - private boolean jj_3R_57() { + private boolean jj_3R_58() { Token xsp; xsp = jj_scanpos; - if (jj_3R_60()) { + if (jj_3R_61()) { jj_scanpos = xsp; - if (jj_3R_61()) return true; + if (jj_3R_62()) return true; } return false; } - private boolean jj_3R_60() { + private boolean jj_3R_61() { if (jj_scan_token(PLUS)) return true; return false; } - private boolean jj_3R_99() { + private boolean jj_3R_100() { if (jj_scan_token(TRUE)) return true; return false; } - private boolean jj_3R_91() { + private boolean jj_3R_92() { Token xsp; xsp = jj_scanpos; - if (jj_3R_99()) { + if (jj_3R_100()) { jj_scanpos = xsp; - if (jj_3R_100()) return true; + if (jj_3R_101()) return true; } return false; } - private boolean jj_3R_50() { - if (jj_3R_56()) return true; + private boolean jj_3R_51() { + if (jj_3R_57()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_57()) { jj_scanpos = xsp; break; } + if (jj_3R_58()) { jj_scanpos = xsp; break; } } return false; } + private boolean jj_3R_84() { + if (jj_3R_96()) return true; + return false; + } + private boolean jj_3R_83() { if (jj_3R_95()) return true; return false; } - private boolean jj_3R_51() { + private boolean jj_3R_52() { if (jj_scan_token(CONCAT)) return true; return false; } @@ -2655,28 +2673,23 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_80() { - if (jj_3R_92()) return true; - return false; - } - - private boolean jj_3R_101() { + private boolean jj_3R_102() { if (jj_scan_token(COLON)) return true; return false; } - private boolean jj_3R_75() { + private boolean jj_3R_76() { Token xsp; xsp = jj_scanpos; - if (jj_3R_79()) { - jj_scanpos = xsp; if (jj_3R_80()) { jj_scanpos = xsp; if (jj_3R_81()) { jj_scanpos = xsp; if (jj_3R_82()) { jj_scanpos = xsp; - if (jj_3R_83()) return true; + if (jj_3R_83()) { + jj_scanpos = xsp; + if (jj_3R_84()) return true; } } } @@ -2684,27 +2697,27 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_79() { - if (jj_3R_91()) return true; + private boolean jj_3R_80() { + if (jj_3R_92()) return true; return false; } - private boolean jj_3R_46() { - if (jj_3R_50()) return true; + private boolean jj_3R_47() { + if (jj_3R_51()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_51()) { jj_scanpos = xsp; break; } + if (jj_3R_52()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_102() { - if (jj_3R_105()) return true; + private boolean jj_3R_103() { + if (jj_3R_106()) return true; return false; } - private boolean jj_3R_55() { + private boolean jj_3R_56() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(29)) { @@ -2714,7 +2727,7 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_54() { + private boolean jj_3R_55() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(31)) { @@ -2724,7 +2737,7 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_53() { + private boolean jj_3R_54() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(25)) { @@ -2734,23 +2747,23 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_47() { + private boolean jj_3R_48() { Token xsp; xsp = jj_scanpos; - if (jj_3R_52()) { - jj_scanpos = xsp; if (jj_3R_53()) { jj_scanpos = xsp; if (jj_3R_54()) { jj_scanpos = xsp; - if (jj_3R_55()) return true; + if (jj_3R_55()) { + jj_scanpos = xsp; + if (jj_3R_56()) return true; } } } return false; } - private boolean jj_3R_52() { + private boolean jj_3R_53() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(27)) { @@ -2760,30 +2773,30 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_96() { + private boolean jj_3R_97() { if (jj_scan_token(IDENTIFIER)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_101()) jj_scanpos = xsp; - if (jj_3R_102()) return true; + if (jj_3R_102()) jj_scanpos = xsp; + if (jj_3R_103()) return true; while (true) { xsp = jj_scanpos; - if (jj_3R_102()) { jj_scanpos = xsp; break; } + if (jj_3R_103()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_43() { - if (jj_3R_46()) return true; + private boolean jj_3R_44() { + if (jj_3R_47()) return true; Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_47()) { jj_scanpos = xsp; break; } + if (jj_3R_48()) { jj_scanpos = xsp; break; } } return false; } - private boolean jj_3R_49() { + private boolean jj_3R_50() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(35)) { @@ -2793,17 +2806,17 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_44() { + private boolean jj_3R_45() { Token xsp; xsp = jj_scanpos; - if (jj_3R_48()) { + if (jj_3R_49()) { jj_scanpos = xsp; - if (jj_3R_49()) return true; + if (jj_3R_50()) return true; } return false; } - private boolean jj_3R_48() { + private boolean jj_3R_49() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(33)) { @@ -2818,7 +2831,7 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_37() { + private boolean jj_3R_38() { if (jj_scan_token(IDENTIFIER)) return true; return false; } Modified: tomcat/trunk/test/org/apache/el/parser/TestELParser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/parser/TestELParser.java?rev=1571245&r1=1571244&r2=1571245&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/parser/TestELParser.java (original) +++ tomcat/trunk/test/org/apache/el/parser/TestELParser.java Mon Feb 24 11:18:37 2014 @@ -104,6 +104,102 @@ public class TestELParser { } + @Test + public void bug56179a() { + doTestBug56179(0, "test == true"); + } + + @Test + public void bug56179b() { + doTestBug56179(1, "test == true"); + } + + @Test + public void bug56179c() { + doTestBug56179(2, "test == true"); + } + + @Test + public void bug56179d() { + doTestBug56179(3, "test == true"); + } + + @Test + public void bug56179e() { + doTestBug56179(4, "test == true"); + } + + @Test + public void bug56179f() { + doTestBug56179(5, "test == true"); + } + + @Test + public void bug56179g() { + doTestBug56179(0, "(test) == true"); + } + + @Test + public void bug56179h() { + doTestBug56179(1, "(test) == true"); + } + + @Test + public void bug56179i() { + doTestBug56179(2, "(test) == true"); + } + + @Test + public void bug56179j() { + doTestBug56179(3, "(test) == true"); + } + + @Test + public void bug56179k() { + doTestBug56179(4, "(test) == true"); + } + + @Test + public void bug56179l() { + doTestBug56179(5, "(test) == true"); + } + + @Test + public void bug56179m() { + doTestBug56179(5, "((test)) == true"); + } + + @Test + public void bug56179n() { + doTestBug56179(5, "(((test))) == true"); + } + + private void doTestBug56179(int parenthesesCount, String innerExpr) { + ExpressionFactory factory = ExpressionFactory.newInstance(); + ELContext context = new ELContextImpl(factory); + + ValueExpression var = + factory.createValueExpression(Boolean.TRUE, Boolean.class); + context.getVariableMapper().setVariable("test", var); + + StringBuilder expr = new StringBuilder(); + expr.append("${"); + for (int i = 0; i < parenthesesCount; i++) { + expr.append("("); + } + expr.append(innerExpr); + for (int i = 0; i < parenthesesCount; i++) { + expr.append(")"); + } + expr.append("}"); + ValueExpression ve = factory.createValueExpression( + context, expr.toString(), String.class); + + String result = (String) ve.getValue(context); + assertEquals("true", result); + } + + private void testExpression(String expression, String expected) { ExpressionFactory factory = ExpressionFactory.newInstance(); ELContext context = new ELContextImpl(factory); Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1571245&r1=1571244&r2=1571245&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Mon Feb 24 11:18:37 2014 @@ -95,6 +95,10 @@ Change the default compiler source and compiler target versions to 1.7 since Tomcat 8 requires a minimum of Java 7. (markt) </fix> + <fix> + <bug>56179</bug>: Fix parsing of EL expressions that contain unnecessary + parentheses. (markt) + </fix> </changelog> </subsection> <subsection name="WebSocket"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org