This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 1242677516fb4bc2a5b41a92f2bf7b56945b492f Author: Mark Thomas <ma...@apache.org> AuthorDate: Mon Aug 12 19:54:31 2024 +0100 Add support for the Elvis operator --- java/org/apache/el/parser/AstElvis.java | 46 + java/org/apache/el/parser/ELParser.java | 921 +++++++++++---------- java/org/apache/el/parser/ELParser.jjt | 20 +- .../org/apache/el/parser/ELParserTokenManager.java | 3 + .../apache/el/parser/ELParserTreeConstants.java | 77 +- test/org/apache/el/TestELEvaluation.java | 11 + webapps/docs/changelog.xml | 4 + 7 files changed, 616 insertions(+), 466 deletions(-) diff --git a/java/org/apache/el/parser/AstElvis.java b/java/org/apache/el/parser/AstElvis.java new file mode 100644 index 0000000000..eec28fbcf0 --- /dev/null +++ b/java/org/apache/el/parser/AstElvis.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Generated By:JJTree: Do not edit this line. AstElvis.java Version 7.0 */ +/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=Ast,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +package org.apache.el.parser; + +import org.apache.el.lang.EvaluationContext; + +import jakarta.el.ELException; + +public class AstElvis extends SimpleNode { + public AstElvis(int id) { + super(id); + } + + @Override + public Class<?> getType(EvaluationContext ctx) throws ELException { + Object val = this.getValue(ctx); + return (val != null) ? val.getClass() : null; + } + + @Override + public Object getValue(EvaluationContext ctx) throws ELException { + Object obj0 = this.children[0].getValue(ctx); + if (obj0 == null) { + return this.children[1].getValue(ctx); + } else { + return obj0; + } + } +} +/* JavaCC - OriginalChecksum=e0633cc57b29ec4931c19e4a07e0611e (do not edit this line) */ diff --git a/java/org/apache/el/parser/ELParser.java b/java/org/apache/el/parser/ELParser.java index b80fd01b6c..6cf7168afe 100644 --- a/java/org/apache/el/parser/ELParser.java +++ b/java/org/apache/el/parser/ELParser.java @@ -291,7 +291,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar case EMPTY: case MINUS: case IDENTIFIER: { - Choice(); + Ternary(); label_3: while (true) { if (jj_2_1(2)) { ; @@ -374,7 +374,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar case EMPTY: case MINUS: case IDENTIFIER: { - Choice(); + Ternary(); break; } default: @@ -524,7 +524,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar case EMPTY: case MINUS: case IDENTIFIER: { - Choice(); + Ternary(); break; } default: @@ -580,53 +580,107 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar } /* - * Choice For Choice markup a ? b : c, then Or + * Ternary For '?:' '? :', then Or */ - final public void Choice() throws ParseException { + final public void Ternary() throws ParseException { Or(); label_6: while (true) { - if (jj_2_5(3)) { - ; - } else { - break label_6; - } - jj_consume_token(QUESTIONMARK); - Choice(); - jj_consume_token(COLON); - AstChoice jjtn001 = new AstChoice(JJTCHOICE); - boolean jjtc001 = true; - jjtree.openNodeScope(jjtn001); - try { - Choice(); - } catch (Throwable jjte001) { - if (jjtc001) { - jjtree.clearNodeScope(jjtn001); - jjtc001 = false; - } else { - jjtree.popNode(); + switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { + case QUESTIONMARK: { + ; + break; } - if (jjte001 instanceof RuntimeException) { - { - if (true) { - throw (RuntimeException) jjte001; + default: + jj_la1[10] = jj_gen; + break label_6; + } + if (jj_2_5(2)) { + jj_consume_token(QUESTIONMARK); + jj_consume_token(COLON); + AstElvis jjtn001 = new AstElvis(JJTELVIS); + boolean jjtc001 = true; + jjtree.openNodeScope(jjtn001); + try { + Ternary(); + } catch (Throwable jjte001) { + if (jjtc001) { + jjtree.clearNodeScope(jjtn001); + jjtc001 = false; + } else { + jjtree.popNode(); + } + if (jjte001 instanceof RuntimeException) { + { + if (true) { + throw (RuntimeException) jjte001; + } + } + } + if (jjte001 instanceof ParseException) { + { + if (true) { + throw (ParseException) jjte001; + } } } - } - if (jjte001 instanceof ParseException) { { if (true) { - throw (ParseException) jjte001; + throw (Error) jjte001; } } - } - { - if (true) { - throw (Error) jjte001; + } finally { + if (jjtc001) { + jjtree.closeNodeScope(jjtn001, 2); } } - } finally { - if (jjtc001) { - jjtree.closeNodeScope(jjtn001, 3); + } else { + switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { + case QUESTIONMARK: { + jj_consume_token(QUESTIONMARK); + Ternary(); + jj_consume_token(COLON); + AstChoice jjtn002 = new AstChoice(JJTCHOICE); + boolean jjtc002 = true; + jjtree.openNodeScope(jjtn002); + try { + Ternary(); + } catch (Throwable jjte002) { + if (jjtc002) { + jjtree.clearNodeScope(jjtn002); + jjtc002 = false; + } else { + jjtree.popNode(); + } + if (jjte002 instanceof RuntimeException) { + { + if (true) { + throw (RuntimeException) jjte002; + } + } + } + if (jjte002 instanceof ParseException) { + { + if (true) { + throw (ParseException) jjte002; + } + } + } + { + if (true) { + throw (Error) jjte002; + } + } + } finally { + if (jjtc002) { + jjtree.closeNodeScope(jjtn002, 3); + } + } + break; + } + default: + jj_la1[11] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); } } } @@ -645,7 +699,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[10] = jj_gen; + jj_la1[12] = jj_gen; break label_7; } switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -658,7 +712,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[11] = jj_gen; + jj_la1[13] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -714,7 +768,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[12] = jj_gen; + jj_la1[14] = jj_gen; break label_8; } switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -727,7 +781,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[13] = jj_gen; + jj_la1[15] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -785,7 +839,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[14] = jj_gen; + jj_la1[16] = jj_gen; break label_9; } switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -801,7 +855,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[15] = jj_gen; + jj_la1[17] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -855,7 +909,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[16] = jj_gen; + jj_la1[18] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -898,7 +952,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[17] = jj_gen; + jj_la1[19] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -924,7 +978,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[18] = jj_gen; + jj_la1[20] = jj_gen; break label_10; } switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -940,7 +994,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[19] = jj_gen; + jj_la1[21] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -994,7 +1048,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[20] = jj_gen; + jj_la1[22] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1048,7 +1102,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[21] = jj_gen; + jj_la1[23] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1102,7 +1156,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[22] = jj_gen; + jj_la1[24] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1145,7 +1199,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[23] = jj_gen; + jj_la1[25] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1165,7 +1219,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[24] = jj_gen; + jj_la1[26] = jj_gen; break label_11; } jj_consume_token(CONCAT); @@ -1221,7 +1275,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[25] = jj_gen; + jj_la1[27] = jj_gen; break label_12; } switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -1306,7 +1360,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[26] = jj_gen; + jj_la1[28] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1329,7 +1383,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[27] = jj_gen; + jj_la1[29] = jj_gen; break label_13; } switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -1385,7 +1439,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[28] = jj_gen; + jj_la1[30] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1439,7 +1493,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[29] = jj_gen; + jj_la1[31] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1482,7 +1536,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[30] = jj_gen; + jj_la1[32] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1546,7 +1600,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[31] = jj_gen; + jj_la1[33] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1642,7 +1696,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[32] = jj_gen; + jj_la1[34] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1665,7 +1719,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[33] = jj_gen; + jj_la1[35] = jj_gen; break label_14; } ValueSuffix(); @@ -1725,7 +1779,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[34] = jj_gen; + jj_la1[36] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1745,7 +1799,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[35] = jj_gen; + jj_la1[37] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1755,7 +1809,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[36] = jj_gen; + jj_la1[38] = jj_gen; ; } } @@ -1857,7 +1911,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[37] = jj_gen; + jj_la1[39] = jj_gen; break label_15; } jj_consume_token(COMMA); @@ -1866,7 +1920,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[38] = jj_gen; + jj_la1[40] = jj_gen; ; } jj_consume_token(RPAREN); @@ -1918,7 +1972,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[39] = jj_gen; + jj_la1[41] = jj_gen; if (jj_2_7(2147483647)) { Function(); } else { @@ -1928,7 +1982,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[40] = jj_gen; + jj_la1[42] = jj_gen; if (jj_2_8(5)) { SetData(); } else { @@ -1942,7 +1996,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[41] = jj_gen; + jj_la1[43] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1986,7 +2040,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[42] = jj_gen; + jj_la1[44] = jj_gen; break label_16; } jj_consume_token(COMMA); @@ -1995,7 +2049,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[43] = jj_gen; + jj_la1[45] = jj_gen; ; } jj_consume_token(RBRACE); @@ -2061,7 +2115,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[44] = jj_gen; + jj_la1[46] = jj_gen; break label_17; } jj_consume_token(COMMA); @@ -2070,7 +2124,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[45] = jj_gen; + jj_la1[47] = jj_gen; ; } jj_consume_token(RBRACK); @@ -2140,7 +2194,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[46] = jj_gen; + jj_la1[48] = jj_gen; break label_18; } jj_consume_token(COMMA); @@ -2149,7 +2203,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[47] = jj_gen; + jj_la1[49] = jj_gen; ; } jj_consume_token(RBRACE); @@ -2265,7 +2319,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[48] = jj_gen; + jj_la1[50] = jj_gen; ; } if (t1 != null) { @@ -2282,7 +2336,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[49] = jj_gen; + jj_la1[51] = jj_gen; break label_19; } } @@ -2346,7 +2400,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[50] = jj_gen; + jj_la1[52] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2384,7 +2438,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar break; } default: - jj_la1[51] = jj_gen; + jj_la1[53] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2562,91 +2616,41 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar } } - private boolean jj_3R_And_173_17_41() { - Token xsp; - xsp = jj_scanpos; - if (jj_scan_token(39)) { - jj_scanpos = xsp; - if (jj_scan_token(40)) { - return true; - } - } - if (jj_3R_Equality_182_5_40()) { + private boolean jj_3R_LambdaExpressionOrInvocation_144_45_28() { + if (jj_3R_Ternary_155_5_30()) { return true; } return false; } - private boolean jj_3R_LambdaExpressionOrInvocation_144_45_30() { - if (jj_3R_Choice_155_5_22()) { - return true; - } - return false; - } - - private boolean jj_3R_Equality_182_5_40() { - if (jj_3R_Compare_196_5_44()) { - return true; - } - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3R_Equality_184_9_45()) { - jj_scanpos = xsp; - break; - } - } - return false; - } - - private boolean jj_3R_ListData_350_26_109() { - if (jj_scan_token(COMMA)) { - return true; - } - if (jj_3R_Expression_99_5_36()) { - return true; - } - return false; - } - - private boolean jj_3R_MapEntry_368_5_107() { - if (jj_3R_Expression_99_5_36()) { + private boolean jj_3R_MapEntry_374_5_109() { + if (jj_3R_Expression_99_5_33()) { return true; } if (jj_scan_token(COLON)) { return true; } - if (jj_3R_Expression_99_5_36()) { + if (jj_3R_Expression_99_5_33()) { return true; } return false; } - private boolean jj_3R_MapData_362_11_105() { - if (jj_3R_MapEntry_368_5_107()) { + private boolean jj_3R_MapData_368_11_107() { + if (jj_3R_MapEntry_374_5_109()) { return true; } return false; } - private boolean jj_3R_LambdaParameters_132_46_43() { - if (jj_scan_token(COMMA)) { - return true; - } - if (jj_3R_Identifier_377_5_38()) { - return true; - } - return false; - } - - private boolean jj_3R_And_173_5_34() { - if (jj_3R_Equality_182_5_40()) { + private boolean jj_3R_And_179_5_40() { + if (jj_3R_Equality_188_5_45()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_And_173_17_41()) { + if (jj_3R_And_179_17_46()) { jj_scanpos = xsp; break; } @@ -2654,17 +2658,17 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_SetData_343_26_37() { + private boolean jj_3R_SetData_349_26_34() { if (jj_scan_token(COMMA)) { return true; } - if (jj_3R_Expression_99_5_36()) { + if (jj_3R_Expression_99_5_33()) { return true; } return false; } - private boolean jj_3R_Or_164_12_35() { + private boolean jj_3R_Or_170_12_42() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(41)) { @@ -2673,19 +2677,19 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_And_173_5_34()) { + if (jj_3R_And_179_5_40()) { return true; } return false; } - private boolean jj_3R_MapData_361_5_99() { + private boolean jj_3R_MapData_367_5_101() { if (jj_scan_token(START_SET_OR_MAP)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_MapData_362_11_105()) { + if (jj_3R_MapData_368_11_107()) { jj_scanpos = xsp; } if (jj_scan_token(RBRACE)) { @@ -2694,14 +2698,24 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_ListData_350_11_104() { - if (jj_3R_Expression_99_5_36()) { + private boolean jj_3R_LambdaParameters_132_46_41() { + if (jj_scan_token(COMMA)) { + return true; + } + if (jj_3R_Identifier_383_5_36()) { + return true; + } + return false; + } + + private boolean jj_3R_ListData_356_11_106() { + if (jj_3R_Expression_99_5_33()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_ListData_350_26_109()) { + if (jj_3R_ListData_356_26_111()) { jj_scanpos = xsp; break; } @@ -2709,14 +2723,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Or_164_5_29() { - if (jj_3R_And_173_5_34()) { + private boolean jj_3R_Or_170_5_35() { + if (jj_3R_And_179_5_40()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Or_164_12_35()) { + if (jj_3R_Or_170_12_42()) { jj_scanpos = xsp; break; } @@ -2724,42 +2738,42 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3_5() { - if (jj_scan_token(QUESTIONMARK)) { + private boolean jj_3R_ListData_355_5_100() { + if (jj_scan_token(LBRACK)) { return true; } - if (jj_3R_Choice_155_5_22()) { - return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3R_ListData_356_11_106()) { + jj_scanpos = xsp; } - if (jj_scan_token(COLON)) { + if (jj_scan_token(RBRACK)) { return true; } return false; } - private boolean jj_3R_ListData_349_5_98() { - if (jj_scan_token(LBRACK)) { + private boolean jj_3R_Ternary_160_9_43() { + if (jj_scan_token(QUESTIONMARK)) { return true; } - Token xsp; - xsp = jj_scanpos; - if (jj_3R_ListData_350_11_104()) { - jj_scanpos = xsp; + if (jj_3R_Ternary_155_5_30()) { + return true; } - if (jj_scan_token(RBRACK)) { + if (jj_scan_token(COLON)) { return true; } return false; } - private boolean jj_3R_LambdaParameters_132_31_39() { - if (jj_3R_Identifier_377_5_38()) { + private boolean jj_3R_SetData_349_11_29() { + if (jj_3R_Expression_99_5_33()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_LambdaParameters_132_46_43()) { + if (jj_3R_SetData_349_26_34()) { jj_scanpos = xsp; break; } @@ -2767,29 +2781,21 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_SetData_343_11_31() { - if (jj_3R_Expression_99_5_36()) { + private boolean jj_3R_MethodParameters_323_31_113() { + if (jj_scan_token(COMMA)) { return true; } - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3R_SetData_343_26_37()) { - jj_scanpos = xsp; - break; - } - } return false; } - private boolean jj_3R_Choice_155_5_22() { - if (jj_3R_Or_164_5_29()) { + private boolean jj_3R_LambdaParameters_132_31_37() { + if (jj_3R_Identifier_383_5_36()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3_5()) { + if (jj_3R_LambdaParameters_132_46_41()) { jj_scanpos = xsp; break; } @@ -2797,27 +2803,38 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3_3() { - if (jj_3R_LambdaExpression_124_5_21()) { - return true; + private boolean jj_3R_Ternary_157_5_38() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_5()) { + jj_scanpos = xsp; + if (jj_3R_Ternary_160_9_43()) { + return true; + } } return false; } - private boolean jj_3R_MethodParameters_317_31_111() { - if (jj_scan_token(COMMA)) { + private boolean jj_3_5() { + if (jj_scan_token(QUESTIONMARK)) { + return true; + } + if (jj_scan_token(COLON)) { + return true; + } + if (jj_3R_Ternary_155_5_30()) { return true; } return false; } - private boolean jj_3R_SetData_342_5_25() { + private boolean jj_3R_SetData_348_5_24() { if (jj_scan_token(START_SET_OR_MAP)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_SetData_343_11_31()) { + if (jj_3R_SetData_349_11_29()) { jj_scanpos = xsp; } if (jj_scan_token(RBRACE)) { @@ -2826,19 +2843,27 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3_4() { - if (jj_3R_LambdaExpression_124_5_21()) { + private boolean jj_3R_null_334_18_23() { + if (jj_scan_token(IDENTIFIER)) { + return true; + } + if (jj_scan_token(COLON)) { return true; } return false; } - private boolean jj_3R_null_328_18_24() { - if (jj_scan_token(IDENTIFIER)) { + private boolean jj_3R_Ternary_155_5_30() { + if (jj_3R_Or_170_5_35()) { return true; } - if (jj_scan_token(COLON)) { - return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_Ternary_157_5_38()) { + jj_scanpos = xsp; + break; + } } return false; } @@ -2846,7 +2871,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar private boolean jj_3_7() { Token xsp; xsp = jj_scanpos; - if (jj_3R_null_328_18_24()) { + if (jj_3R_null_334_18_23()) { jj_scanpos = xsp; } if (jj_scan_token(IDENTIFIER)) { @@ -2858,52 +2883,42 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_LambdaParameters_132_20_33() { - if (jj_scan_token(LPAREN)) { + private boolean jj_3_3() { + if (jj_3R_LambdaExpression_124_5_21()) { return true; } - Token xsp; - xsp = jj_scanpos; - if (jj_3R_LambdaParameters_132_31_39()) { - jj_scanpos = xsp; - } - if (jj_scan_token(RPAREN)) { + return false; + } + + private boolean jj_3_4() { + if (jj_3R_LambdaExpression_124_5_21()) { return true; } return false; } - private boolean jj_3R_NonLiteral_332_7_89() { - if (jj_3R_MapData_361_5_99()) { + private boolean jj_3R_NonLiteral_338_7_91() { + if (jj_3R_MapData_367_5_101()) { return true; } return false; } - private boolean jj_3R_NonLiteral_331_7_88() { - if (jj_3R_ListData_349_5_98()) { + private boolean jj_3R_NonLiteral_337_7_90() { + if (jj_3R_ListData_355_5_100()) { return true; } return false; } - private boolean jj_3R_LambdaExpressionOrInvocation_141_5_23() { + private boolean jj_3R_LambdaParameters_132_20_32() { if (jj_scan_token(LPAREN)) { return true; } - if (jj_3R_LambdaParameters_132_5_27()) { - return true; - } - if (jj_scan_token(ARROW)) { - return true; - } Token xsp; xsp = jj_scanpos; - if (jj_3_4()) { + if (jj_3R_LambdaParameters_132_31_37()) { jj_scanpos = xsp; - if (jj_3R_LambdaExpressionOrInvocation_144_45_30()) { - return true; - } } if (jj_scan_token(RPAREN)) { return true; @@ -2912,31 +2927,31 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar } private boolean jj_3_8() { - if (jj_3R_SetData_342_5_25()) { + if (jj_3R_SetData_348_5_24()) { return true; } return false; } - private boolean jj_3R_NonLiteral_329_7_87() { - if (jj_3R_Identifier_377_5_38()) { + private boolean jj_3R_NonLiteral_335_7_89() { + if (jj_3R_Identifier_383_5_36()) { return true; } return false; } - private boolean jj_3R_NonLiteral_328_7_86() { - if (jj_3R_Function_390_5_97()) { + private boolean jj_3R_NonLiteral_334_7_88() { + if (jj_3R_Function_396_5_99()) { return true; } return false; } - private boolean jj_3R_NonLiteral_327_7_85() { + private boolean jj_3R_NonLiteral_333_7_87() { if (jj_scan_token(LPAREN)) { return true; } - if (jj_3R_Expression_99_5_36()) { + if (jj_3R_Expression_99_5_33()) { return true; } if (jj_scan_token(RPAREN)) { @@ -2945,14 +2960,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_MethodParameters_317_16_110() { - if (jj_3R_Expression_99_5_36()) { + private boolean jj_3R_MethodParameters_323_16_112() { + if (jj_3R_Expression_99_5_33()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_MethodParameters_317_31_111()) { + if (jj_3R_MethodParameters_323_31_113()) { jj_scanpos = xsp; break; } @@ -2960,29 +2975,29 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_ValueSuffix_291_41_108() { - if (jj_3R_MethodParameters_317_5_106()) { + private boolean jj_3R_ValueSuffix_297_41_110() { + if (jj_3R_MethodParameters_323_5_108()) { return true; } return false; } - private boolean jj_3R_NonLiteral_326_5_77() { + private boolean jj_3R_NonLiteral_332_5_79() { Token xsp; xsp = jj_scanpos; if (jj_3_6()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_327_7_85()) { + if (jj_3R_NonLiteral_333_7_87()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_328_7_86()) { + if (jj_3R_NonLiteral_334_7_88()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_329_7_87()) { + if (jj_3R_NonLiteral_335_7_89()) { jj_scanpos = xsp; if (jj_3_8()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_331_7_88()) { + if (jj_3R_NonLiteral_337_7_90()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_332_7_89()) { + if (jj_3R_NonLiteral_338_7_91()) { return true; } } @@ -2994,49 +3009,44 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3_6() { - if (jj_3R_LambdaExpressionOrInvocation_141_5_23()) { + private boolean jj_3R_LambdaExpressionOrInvocation_141_5_22() { + if (jj_scan_token(LPAREN)) { return true; } - return false; - } - - private boolean jj_3R_LambdaParameters_132_5_32() { - if (jj_3R_Identifier_377_5_38()) { + if (jj_3R_LambdaParameters_132_5_26()) { + return true; + } + if (jj_scan_token(ARROW)) { return true; } - return false; - } - - private boolean jj_3R_LambdaParameters_132_5_27() { Token xsp; xsp = jj_scanpos; - if (jj_3R_LambdaParameters_132_5_32()) { + if (jj_3_4()) { jj_scanpos = xsp; - if (jj_3R_LambdaParameters_132_20_33()) { + if (jj_3R_LambdaExpressionOrInvocation_144_45_28()) { return true; } } + if (jj_scan_token(RPAREN)) { + return true; + } return false; } - private boolean jj_3_1() { - if (jj_scan_token(ASSIGN)) { - return true; - } - if (jj_3R_Assignment_115_5_20()) { + private boolean jj_3_6() { + if (jj_3R_LambdaExpressionOrInvocation_141_5_22()) { return true; } return false; } - private boolean jj_3R_MethodParameters_317_5_106() { + private boolean jj_3R_MethodParameters_323_5_108() { if (jj_scan_token(LPAREN)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_MethodParameters_317_16_110()) { + if (jj_3R_MethodParameters_323_16_112()) { jj_scanpos = xsp; } if (jj_scan_token(RPAREN)) { @@ -3045,26 +3055,27 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_LambdaExpression_124_5_21() { - if (jj_3R_LambdaParameters_132_5_27()) { - return true; - } - if (jj_scan_token(ARROW)) { + private boolean jj_3R_LambdaParameters_132_5_31() { + if (jj_3R_Identifier_383_5_36()) { return true; } + return false; + } + + private boolean jj_3R_LambdaParameters_132_5_26() { Token xsp; xsp = jj_scanpos; - if (jj_3_3()) { + if (jj_3R_LambdaParameters_132_5_31()) { jj_scanpos = xsp; - if (jj_3R_LambdaExpression_124_68_28()) { + if (jj_3R_LambdaParameters_132_20_32()) { return true; } } return false; } - private boolean jj_3R_Semicolon_107_20_46() { - if (jj_scan_token(SEMICOLON)) { + private boolean jj_3_1() { + if (jj_scan_token(ASSIGN)) { return true; } if (jj_3R_Assignment_115_5_20()) { @@ -3073,11 +3084,11 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_BracketSuffix_309_5_91() { + private boolean jj_3R_BracketSuffix_315_5_93() { if (jj_scan_token(LBRACK)) { return true; } - if (jj_3R_Expression_99_5_36()) { + if (jj_3R_Expression_99_5_33()) { return true; } if (jj_scan_token(RBRACK)) { @@ -3086,15 +3097,43 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_ValueSuffix_291_21_79() { - if (jj_3R_BracketSuffix_309_5_91()) { + private boolean jj_3R_LambdaExpression_124_5_21() { + if (jj_3R_LambdaParameters_132_5_26()) { + return true; + } + if (jj_scan_token(ARROW)) { + return true; + } + Token xsp; + xsp = jj_scanpos; + if (jj_3_3()) { + jj_scanpos = xsp; + if (jj_3R_LambdaExpression_124_68_27()) { + return true; + } + } + return false; + } + + private boolean jj_3R_ValueSuffix_297_21_81() { + if (jj_3R_BracketSuffix_315_5_93()) { + return true; + } + return false; + } + + private boolean jj_3R_Semicolon_107_20_44() { + if (jj_scan_token(SEMICOLON)) { + return true; + } + if (jj_3R_Assignment_115_5_20()) { return true; } return false; } - private boolean jj_3R_Assignment_116_5_26() { - if (jj_3R_Choice_155_5_22()) { + private boolean jj_3R_Assignment_116_5_25() { + if (jj_3R_Ternary_155_5_30()) { return true; } Token xsp; @@ -3108,6 +3147,16 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } + private boolean jj_3R_DotSuffix_306_5_92() { + if (jj_scan_token(DOT)) { + return true; + } + if (jj_scan_token(IDENTIFIER)) { + return true; + } + return false; + } + private boolean jj_3_2() { if (jj_3R_LambdaExpression_124_5_21()) { return true; @@ -3120,31 +3169,28 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar xsp = jj_scanpos; if (jj_3_2()) { jj_scanpos = xsp; - if (jj_3R_Assignment_116_5_26()) { + if (jj_3R_Assignment_116_5_25()) { return true; } } return false; } - private boolean jj_3R_DotSuffix_300_5_90() { - if (jj_scan_token(DOT)) { - return true; - } - if (jj_scan_token(IDENTIFIER)) { + private boolean jj_3R_ValueSuffix_297_7_80() { + if (jj_3R_DotSuffix_306_5_92()) { return true; } return false; } - private boolean jj_3R_Semicolon_107_5_42() { + private boolean jj_3R_Semicolon_107_5_39() { if (jj_3R_Assignment_115_5_20()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Semicolon_107_20_46()) { + if (jj_3R_Semicolon_107_20_44()) { jj_scanpos = xsp; break; } @@ -3152,77 +3198,70 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_ValueSuffix_291_7_78() { - if (jj_3R_DotSuffix_300_5_90()) { - return true; - } - return false; - } - - private boolean jj_3R_ValueSuffix_291_5_75() { + private boolean jj_3R_ValueSuffix_297_5_77() { Token xsp; xsp = jj_scanpos; - if (jj_3R_ValueSuffix_291_7_78()) { + if (jj_3R_ValueSuffix_297_7_80()) { jj_scanpos = xsp; - if (jj_3R_ValueSuffix_291_21_79()) { + if (jj_3R_ValueSuffix_297_21_81()) { return true; } } xsp = jj_scanpos; - if (jj_3R_ValueSuffix_291_41_108()) { + if (jj_3R_ValueSuffix_297_41_110()) { jj_scanpos = xsp; } return false; } - private boolean jj_3R_Expression_99_5_36() { - if (jj_3R_Semicolon_107_5_42()) { + private boolean jj_3R_Value_278_21_74() { + if (jj_3R_ValueSuffix_297_5_77()) { return true; } return false; } - private boolean jj_3R_Value_272_21_72() { - if (jj_3R_ValueSuffix_291_5_75()) { + private boolean jj_3R_ValuePrefix_288_7_76() { + if (jj_3R_NonLiteral_332_5_79()) { return true; } return false; } - private boolean jj_3R_ValuePrefix_282_7_74() { - if (jj_3R_NonLiteral_326_5_77()) { + private boolean jj_3R_Expression_99_5_33() { + if (jj_3R_Semicolon_107_5_39()) { return true; } return false; } - private boolean jj_3R_ValuePrefix_281_5_71() { + private boolean jj_3R_ValuePrefix_287_5_75() { + if (jj_3R_Literal_414_5_78()) { + return true; + } + return false; + } + + private boolean jj_3R_ValuePrefix_287_5_73() { Token xsp; xsp = jj_scanpos; - if (jj_3R_ValuePrefix_281_5_73()) { + if (jj_3R_ValuePrefix_287_5_75()) { jj_scanpos = xsp; - if (jj_3R_ValuePrefix_282_7_74()) { + if (jj_3R_ValuePrefix_288_7_76()) { return true; } } return false; } - private boolean jj_3R_ValuePrefix_281_5_73() { - if (jj_3R_Literal_408_5_76()) { - return true; - } - return false; - } - - private boolean jj_3R_Value_272_5_70() { - if (jj_3R_ValuePrefix_281_5_71()) { + private boolean jj_3R_Value_278_5_72() { + if (jj_3R_ValuePrefix_287_5_73()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Value_272_21_72()) { + if (jj_3R_Value_278_21_74()) { jj_scanpos = xsp; break; } @@ -3230,31 +3269,31 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Null_458_5_96() { + private boolean jj_3R_Null_464_5_98() { if (jj_scan_token(NULL)) { return true; } return false; } - private boolean jj_3R_Unary_263_9_66() { - if (jj_3R_Value_272_5_70()) { + private boolean jj_3R_Unary_269_9_68() { + if (jj_3R_Value_278_5_72()) { return true; } return false; } - private boolean jj_3R_Unary_261_9_65() { + private boolean jj_3R_Unary_267_9_67() { if (jj_scan_token(EMPTY)) { return true; } - if (jj_3R_Unary_257_9_59()) { + if (jj_3R_Unary_263_9_61()) { return true; } return false; } - private boolean jj_3R_Unary_259_9_64() { + private boolean jj_3R_Unary_265_9_66() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(37)) { @@ -3263,22 +3302,22 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Unary_257_9_59()) { + if (jj_3R_Unary_263_9_61()) { return true; } return false; } - private boolean jj_3R_Unary_257_9_59() { + private boolean jj_3R_Unary_263_9_61() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Unary_257_9_63()) { + if (jj_3R_Unary_263_9_65()) { jj_scanpos = xsp; - if (jj_3R_Unary_259_9_64()) { + if (jj_3R_Unary_265_9_66()) { jj_scanpos = xsp; - if (jj_3R_Unary_261_9_65()) { + if (jj_3R_Unary_267_9_67()) { jj_scanpos = xsp; - if (jj_3R_Unary_263_9_66()) { + if (jj_3R_Unary_269_9_68()) { return true; } } @@ -3287,24 +3326,24 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Unary_257_9_63() { + private boolean jj_3R_Unary_263_9_65() { if (jj_scan_token(MINUS)) { return true; } - if (jj_3R_Unary_257_9_59()) { + if (jj_3R_Unary_263_9_61()) { return true; } return false; } - private boolean jj_3R_String_449_5_95() { + private boolean jj_3R_String_455_5_97() { if (jj_scan_token(STRING_LITERAL)) { return true; } return false; } - private boolean jj_3R_Multiplication_247_9_69() { + private boolean jj_3R_Multiplication_253_9_71() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(51)) { @@ -3313,20 +3352,20 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Unary_257_9_59()) { + if (jj_3R_Unary_263_9_61()) { return true; } return false; } - private boolean jj_3R_Integer_440_5_94() { + private boolean jj_3R_Integer_446_5_96() { if (jj_scan_token(INTEGER_LITERAL)) { return true; } return false; } - private boolean jj_3R_Multiplication_245_9_68() { + private boolean jj_3R_Multiplication_251_9_70() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(49)) { @@ -3335,20 +3374,20 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Unary_257_9_59()) { + if (jj_3R_Unary_263_9_61()) { return true; } return false; } - private boolean jj_3R_Multiplication_243_9_60() { + private boolean jj_3R_Multiplication_249_9_62() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Multiplication_243_9_67()) { + if (jj_3R_Multiplication_249_9_69()) { jj_scanpos = xsp; - if (jj_3R_Multiplication_245_9_68()) { + if (jj_3R_Multiplication_251_9_70()) { jj_scanpos = xsp; - if (jj_3R_Multiplication_247_9_69()) { + if (jj_3R_Multiplication_253_9_71()) { return true; } } @@ -3356,24 +3395,24 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Multiplication_243_9_67() { + private boolean jj_3R_Multiplication_249_9_69() { if (jj_scan_token(MULT)) { return true; } - if (jj_3R_Unary_257_9_59()) { + if (jj_3R_Unary_263_9_61()) { return true; } return false; } - private boolean jj_3R_Multiplication_241_5_57() { - if (jj_3R_Unary_257_9_59()) { + private boolean jj_3R_Multiplication_247_5_59() { + if (jj_3R_Unary_263_9_61()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Multiplication_243_9_60()) { + if (jj_3R_Multiplication_249_9_62()) { jj_scanpos = xsp; break; } @@ -3381,79 +3420,79 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_FloatingPoint_431_5_93() { + private boolean jj_3R_FloatingPoint_437_5_95() { if (jj_scan_token(FLOATING_POINT_LITERAL)) { return true; } return false; } - private boolean jj_3R_Math_231_9_62() { + private boolean jj_3R_Math_237_9_64() { if (jj_scan_token(MINUS)) { return true; } - if (jj_3R_Multiplication_241_5_57()) { + if (jj_3R_Multiplication_247_5_59()) { return true; } return false; } - private boolean jj_3R_Boolean_423_7_101() { + private boolean jj_3R_Boolean_429_7_103() { if (jj_scan_token(FALSE)) { return true; } return false; } - private boolean jj_3R_Math_229_9_58() { + private boolean jj_3R_Math_235_9_60() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Math_229_9_61()) { + if (jj_3R_Math_235_9_63()) { jj_scanpos = xsp; - if (jj_3R_Math_231_9_62()) { + if (jj_3R_Math_237_9_64()) { return true; } } return false; } - private boolean jj_3R_Math_229_9_61() { + private boolean jj_3R_Math_235_9_63() { if (jj_scan_token(PLUS)) { return true; } - if (jj_3R_Multiplication_241_5_57()) { + if (jj_3R_Multiplication_247_5_59()) { return true; } return false; } - private boolean jj_3R_Boolean_421_5_100() { + private boolean jj_3R_Boolean_427_5_102() { if (jj_scan_token(TRUE)) { return true; } return false; } - private boolean jj_3R_Boolean_421_5_92() { + private boolean jj_3R_Boolean_427_5_94() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Boolean_421_5_100()) { + if (jj_3R_Boolean_427_5_102()) { jj_scanpos = xsp; - if (jj_3R_Boolean_423_7_101()) { + if (jj_3R_Boolean_429_7_103()) { return true; } } return false; } - private boolean jj_3R_Math_227_5_51() { - if (jj_3R_Multiplication_241_5_57()) { + private boolean jj_3R_Math_233_5_53() { + if (jj_3R_Multiplication_247_5_59()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Math_229_9_58()) { + if (jj_3R_Math_235_9_60()) { jj_scanpos = xsp; break; } @@ -3461,45 +3500,45 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Literal_412_7_84() { - if (jj_3R_Null_458_5_96()) { + private boolean jj_3R_Literal_418_7_86() { + if (jj_3R_Null_464_5_98()) { return true; } return false; } - private boolean jj_3R_Literal_411_7_83() { - if (jj_3R_String_449_5_95()) { + private boolean jj_3R_Literal_417_7_85() { + if (jj_3R_String_455_5_97()) { return true; } return false; } - private boolean jj_3R_Concatenation_217_10_52() { + private boolean jj_3R_Concatenation_223_10_54() { if (jj_scan_token(CONCAT)) { return true; } - if (jj_3R_Math_227_5_51()) { + if (jj_3R_Math_233_5_53()) { return true; } return false; } - private boolean jj_3R_Literal_410_7_82() { - if (jj_3R_Integer_440_5_94()) { + private boolean jj_3R_Literal_416_7_84() { + if (jj_3R_Integer_446_5_96()) { return true; } return false; } - private boolean jj_3R_Literal_409_7_81() { - if (jj_3R_FloatingPoint_431_5_93()) { + private boolean jj_3R_Literal_415_7_83() { + if (jj_3R_FloatingPoint_437_5_95()) { return true; } return false; } - private boolean jj_3R_Function_390_24_102() { + private boolean jj_3R_Function_396_24_104() { if (jj_scan_token(COLON)) { return true; } @@ -3509,25 +3548,25 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Literal_408_5_80() { - if (jj_3R_Boolean_421_5_92()) { + private boolean jj_3R_Literal_414_5_82() { + if (jj_3R_Boolean_427_5_94()) { return true; } return false; } - private boolean jj_3R_Literal_408_5_76() { + private boolean jj_3R_Literal_414_5_78() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Literal_408_5_80()) { + if (jj_3R_Literal_414_5_82()) { jj_scanpos = xsp; - if (jj_3R_Literal_409_7_81()) { + if (jj_3R_Literal_415_7_83()) { jj_scanpos = xsp; - if (jj_3R_Literal_410_7_82()) { + if (jj_3R_Literal_416_7_84()) { jj_scanpos = xsp; - if (jj_3R_Literal_411_7_83()) { + if (jj_3R_Literal_417_7_85()) { jj_scanpos = xsp; - if (jj_3R_Literal_412_7_84()) { + if (jj_3R_Literal_418_7_86()) { return true; } } @@ -3537,14 +3576,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Concatenation_215_6_47() { - if (jj_3R_Math_227_5_51()) { + private boolean jj_3R_Concatenation_221_6_49() { + if (jj_3R_Math_233_5_53()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Concatenation_217_10_52()) { + if (jj_3R_Concatenation_223_10_54()) { jj_scanpos = xsp; break; } @@ -3552,14 +3591,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Function_399_7_103() { - if (jj_3R_MethodParameters_317_5_106()) { + private boolean jj_3R_Function_405_7_105() { + if (jj_3R_MethodParameters_323_5_108()) { return true; } return false; } - private boolean jj_3R_Compare_204_9_56() { + private boolean jj_3R_Compare_210_9_58() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(29)) { @@ -3568,13 +3607,13 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_215_6_47()) { + if (jj_3R_Concatenation_221_6_49()) { return true; } return false; } - private boolean jj_3R_Compare_202_9_55() { + private boolean jj_3R_Compare_208_9_57() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(31)) { @@ -3583,13 +3622,13 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_215_6_47()) { + if (jj_3R_Concatenation_221_6_49()) { return true; } return false; } - private boolean jj_3R_Compare_200_9_54() { + private boolean jj_3R_Compare_206_9_56() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(25)) { @@ -3598,22 +3637,22 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_215_6_47()) { + if (jj_3R_Concatenation_221_6_49()) { return true; } return false; } - private boolean jj_3R_Compare_198_9_48() { + private boolean jj_3R_Compare_204_9_50() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Compare_198_9_53()) { + if (jj_3R_Compare_204_9_55()) { jj_scanpos = xsp; - if (jj_3R_Compare_200_9_54()) { + if (jj_3R_Compare_206_9_56()) { jj_scanpos = xsp; - if (jj_3R_Compare_202_9_55()) { + if (jj_3R_Compare_208_9_57()) { jj_scanpos = xsp; - if (jj_3R_Compare_204_9_56()) { + if (jj_3R_Compare_210_9_58()) { return true; } } @@ -3622,7 +3661,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Compare_198_9_53() { + private boolean jj_3R_Compare_204_9_55() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(27)) { @@ -3631,27 +3670,27 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_215_6_47()) { + if (jj_3R_Concatenation_221_6_49()) { return true; } return false; } - private boolean jj_3R_Function_390_5_97() { + private boolean jj_3R_Function_396_5_99() { if (jj_scan_token(IDENTIFIER)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_Function_390_24_102()) { + if (jj_3R_Function_396_24_104()) { jj_scanpos = xsp; } - if (jj_3R_Function_399_7_103()) { + if (jj_3R_Function_405_7_105()) { return true; } while (true) { xsp = jj_scanpos; - if (jj_3R_Function_399_7_103()) { + if (jj_3R_Function_405_7_105()) { jj_scanpos = xsp; break; } @@ -3659,14 +3698,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Compare_196_5_44() { - if (jj_3R_Concatenation_215_6_47()) { + private boolean jj_3R_Compare_202_5_47() { + if (jj_3R_Concatenation_221_6_49()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Compare_198_9_48()) { + if (jj_3R_Compare_204_9_50()) { jj_scanpos = xsp; break; } @@ -3674,7 +3713,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Equality_186_9_50() { + private boolean jj_3R_Equality_192_9_52() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(35)) { @@ -3683,25 +3722,25 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Compare_196_5_44()) { + if (jj_3R_Compare_202_5_47()) { return true; } return false; } - private boolean jj_3R_Equality_184_9_45() { + private boolean jj_3R_Equality_190_9_48() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Equality_184_9_49()) { + if (jj_3R_Equality_190_9_51()) { jj_scanpos = xsp; - if (jj_3R_Equality_186_9_50()) { + if (jj_3R_Equality_192_9_52()) { return true; } } return false; } - private boolean jj_3R_Equality_184_9_49() { + private boolean jj_3R_Equality_190_9_51() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(33)) { @@ -3710,21 +3749,61 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Compare_196_5_44()) { + if (jj_3R_Compare_202_5_47()) { return true; } return false; } - private boolean jj_3R_LambdaExpression_124_68_28() { - if (jj_3R_Choice_155_5_22()) { + private boolean jj_3R_Identifier_383_5_36() { + if (jj_scan_token(IDENTIFIER)) { return true; } return false; } - private boolean jj_3R_Identifier_377_5_38() { - if (jj_scan_token(IDENTIFIER)) { + private boolean jj_3R_And_179_17_46() { + Token xsp; + xsp = jj_scanpos; + if (jj_scan_token(39)) { + jj_scanpos = xsp; + if (jj_scan_token(40)) { + return true; + } + } + if (jj_3R_Equality_188_5_45()) { + return true; + } + return false; + } + + private boolean jj_3R_Equality_188_5_45() { + if (jj_3R_Compare_202_5_47()) { + return true; + } + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_Equality_190_9_48()) { + jj_scanpos = xsp; + break; + } + } + return false; + } + + private boolean jj_3R_LambdaExpression_124_68_27() { + if (jj_3R_Ternary_155_5_30()) { + return true; + } + return false; + } + + private boolean jj_3R_ListData_356_26_111() { + if (jj_scan_token(COMMA)) { + return true; + } + if (jj_3R_Expression_99_5_33()) { return true; } return false; @@ -3741,7 +3820,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar private Token jj_scanpos, jj_lastpos; private int jj_la; private int jj_gen; - final private int[] jj_la1 = new int[52]; + final private int[] jj_la1 = new int[54]; static private int[] jj_la1_0; static private int[] jj_la1_1; static { @@ -3751,17 +3830,17 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar private static void jj_la1_init_0() { jj_la1_0 = new int[] { 0xe, 0xe, 0x800000, 0x15ed00, 0x15ed00, 0x1000000, 0x0, 0x40000, 0x15ed00, 0x40000, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe000000, 0x18000000, 0x6000000, 0x80000000, 0x60000000, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe000000, 0x18000000, 0x6000000, 0x80000000, 0x60000000, 0xfe000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15ed00, 0x120000, 0x15ed00, 0x120000, 0x40000, 0x1000000, 0x15ed00, 0x40000, 0x0, 0x100100, 0x1000000, 0x15ed00, 0x1000000, 0x15ed00, 0x1000000, 0x15ed00, 0x400000, 0x40000, 0x1ec00, 0xc000, }; } private static void jj_la1_init_1() { - jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x1008860, 0x1008860, 0x0, 0x1000000, 0x1000000, 0x1008860, 0x0, 0x600, - 0x600, 0x180, 0x180, 0x1e, 0x6, 0x18, 0x1e, 0x1, 0x0, 0x0, 0x1, 0x0, 0x1, 0x200000, 0xc000, 0xc000, - 0x1e2000, 0x60000, 0x180000, 0x1e2000, 0x60, 0x1008860, 0x0, 0x1000000, 0x0, 0x0, 0x0, 0x1008860, 0x0, - 0x1000000, 0x0, 0x0, 0x1008860, 0x0, 0x1008860, 0x0, 0x1008860, 0x0, 0x0, 0x0, 0x0, }; + jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x1008860, 0x1008860, 0x0, 0x1000000, 0x1000000, 0x1008860, 0x0, 0x10000, + 0x10000, 0x600, 0x600, 0x180, 0x180, 0x1e, 0x6, 0x18, 0x1e, 0x1, 0x0, 0x0, 0x1, 0x0, 0x1, 0x200000, + 0xc000, 0xc000, 0x1e2000, 0x60000, 0x180000, 0x1e2000, 0x60, 0x1008860, 0x0, 0x1000000, 0x0, 0x0, 0x0, + 0x1008860, 0x0, 0x1000000, 0x0, 0x0, 0x1008860, 0x0, 0x1008860, 0x0, 0x1008860, 0x0, 0x0, 0x0, 0x0, }; } final private JJCalls[] jj_2_rtns = new JJCalls[8]; @@ -3784,7 +3863,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 54; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -3809,7 +3888,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 54; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -3824,7 +3903,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 54; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -3848,7 +3927,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 54; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -3862,7 +3941,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 54; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -3877,7 +3956,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 54; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -4041,7 +4120,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 54; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1 << j)) != 0) { diff --git a/java/org/apache/el/parser/ELParser.jjt b/java/org/apache/el/parser/ELParser.jjt index ce9c7fe431..8983f65c9b 100644 --- a/java/org/apache/el/parser/ELParser.jjt +++ b/java/org/apache/el/parser/ELParser.jjt @@ -113,7 +113,7 @@ void Semicolon() : {} void Assignment() : {} { LOOKAHEAD(4) LambdaExpression() | - Choice() ( LOOKAHEAD(2) <ASSIGN> Assignment() #Assign(2) )* + Ternary() ( LOOKAHEAD(2) <ASSIGN> Assignment() #Assign(2) )* } /* @@ -121,7 +121,7 @@ void Assignment() : {} */ void LambdaExpression() #LambdaExpression : {} { - LambdaParameters() <ARROW> ( LOOKAHEAD(3) LambdaExpression() | Choice() ) + LambdaParameters() <ARROW> ( LOOKAHEAD(3) LambdaExpression() | Ternary() ) } /* @@ -141,18 +141,24 @@ void LambdaExpressionOrInvocation() #LambdaExpression : {} <LPAREN> LambdaParameters() <ARROW> - ( LOOKAHEAD(3) LambdaExpression() | Choice() ) + ( LOOKAHEAD(3) LambdaExpression() | Ternary() ) <RPAREN> ( MethodParameters() )* } /* - * Choice - * For Choice markup a ? b : c, then Or + * Ternary + * For '?:' '? :', then Or */ -void Choice() : {} +void Ternary() : {} { - Or() (LOOKAHEAD(3) <QUESTIONMARK> Choice() <COLON> Choice() #Choice(3))* + Or() + ( + LOOKAHEAD(3) + (<QUESTIONMARK><COLON> Ternary() #Elvis(2)) + | + (<QUESTIONMARK> Ternary() <COLON> Ternary() #Choice(3)) + )* } /* diff --git a/java/org/apache/el/parser/ELParserTokenManager.java b/java/org/apache/el/parser/ELParserTokenManager.java index cc51f5a573..a70d4b3e9a 100644 --- a/java/org/apache/el/parser/ELParserTokenManager.java +++ b/java/org/apache/el/parser/ELParserTokenManager.java @@ -2,6 +2,9 @@ /* Generated By:JJTree&JavaCC: Do not edit this line. ELParserTokenManager.java */ package org.apache.el.parser; +import java.io.StringReader; +import jakarta.el.ELException; + /** Token Manager. */ @SuppressWarnings("all") // Ignore warnings in generated code public class ELParserTokenManager implements ELParserConstants { diff --git a/java/org/apache/el/parser/ELParserTreeConstants.java b/java/org/apache/el/parser/ELParserTreeConstants.java index 240eaf2c90..bbb1e2df22 100644 --- a/java/org/apache/el/parser/ELParserTreeConstants.java +++ b/java/org/apache/el/parser/ELParserTreeConstants.java @@ -11,47 +11,48 @@ public interface ELParserTreeConstants { int JJTASSIGN = 6; int JJTLAMBDAEXPRESSION = 7; int JJTLAMBDAPARAMETERS = 8; - int JJTCHOICE = 9; - int JJTOR = 10; - int JJTAND = 11; - int JJTEQUAL = 12; - int JJTNOTEQUAL = 13; - int JJTLESSTHAN = 14; - int JJTGREATERTHAN = 15; - int JJTLESSTHANEQUAL = 16; - int JJTGREATERTHANEQUAL = 17; - int JJTCONCATENATION = 18; - int JJTPLUS = 19; - int JJTMINUS = 20; - int JJTMULT = 21; - int JJTDIV = 22; - int JJTMOD = 23; - int JJTNEGATIVE = 24; - int JJTNOT = 25; - int JJTEMPTY = 26; - int JJTVALUE = 27; - int JJTDOTSUFFIX = 28; - int JJTBRACKETSUFFIX = 29; - int JJTMETHODPARAMETERS = 30; - int JJTSETDATA = 31; - int JJTLISTDATA = 32; - int JJTMAPDATA = 33; - int JJTMAPENTRY = 34; - int JJTIDENTIFIER = 35; - int JJTFUNCTION = 36; - int JJTTRUE = 37; - int JJTFALSE = 38; - int JJTFLOATINGPOINT = 39; - int JJTINTEGER = 40; - int JJTSTRING = 41; - int JJTNULL = 42; + int JJTELVIS = 9; + int JJTCHOICE = 10; + int JJTOR = 11; + int JJTAND = 12; + int JJTEQUAL = 13; + int JJTNOTEQUAL = 14; + int JJTLESSTHAN = 15; + int JJTGREATERTHAN = 16; + int JJTLESSTHANEQUAL = 17; + int JJTGREATERTHANEQUAL = 18; + int JJTCONCATENATION = 19; + int JJTPLUS = 20; + int JJTMINUS = 21; + int JJTMULT = 22; + int JJTDIV = 23; + int JJTMOD = 24; + int JJTNEGATIVE = 25; + int JJTNOT = 26; + int JJTEMPTY = 27; + int JJTVALUE = 28; + int JJTDOTSUFFIX = 29; + int JJTBRACKETSUFFIX = 30; + int JJTMETHODPARAMETERS = 31; + int JJTSETDATA = 32; + int JJTLISTDATA = 33; + int JJTMAPDATA = 34; + int JJTMAPENTRY = 35; + int JJTIDENTIFIER = 36; + int JJTFUNCTION = 37; + int JJTTRUE = 38; + int JJTFALSE = 39; + int JJTFLOATINGPOINT = 40; + int JJTINTEGER = 41; + int JJTSTRING = 42; + int JJTNULL = 43; String[] jjtNodeName = { "CompositeExpression", "LiteralExpression", "DeferredExpression", "DynamicExpression", - "void", "Semicolon", "Assign", "LambdaExpression", "LambdaParameters", "Choice", "Or", "And", "Equal", - "NotEqual", "LessThan", "GreaterThan", "LessThanEqual", "GreaterThanEqual", "Concatenation", "Plus", - "Minus", "Mult", "Div", "Mod", "Negative", "Not", "Empty", "Value", "DotSuffix", "BracketSuffix", + "void", "Semicolon", "Assign", "LambdaExpression", "LambdaParameters", "Elvis", "Choice", "Or", "And", + "Equal", "NotEqual", "LessThan", "GreaterThan", "LessThanEqual", "GreaterThanEqual", "Concatenation", + "Plus", "Minus", "Mult", "Div", "Mod", "Negative", "Not", "Empty", "Value", "DotSuffix", "BracketSuffix", "MethodParameters", "SetData", "ListData", "MapData", "MapEntry", "Identifier", "Function", "True", "False", "FloatingPoint", "Integer", "String", "Null", }; } -/* JavaCC - OriginalChecksum=40650ef76eedbdb11f7d9a6683a802ca (do not edit this line) */ +/* JavaCC - OriginalChecksum=993ae4858a4f3806b4217fe368faaecf (do not edit this line) */ diff --git a/test/org/apache/el/TestELEvaluation.java b/test/org/apache/el/TestELEvaluation.java index 71f08cb818..ada44c4b2c 100644 --- a/test/org/apache/el/TestELEvaluation.java +++ b/test/org/apache/el/TestELEvaluation.java @@ -245,6 +245,17 @@ public class TestELEvaluation { Assert.assertEquals("RUOK", evaluateExpression("${fn:concat2('RU', fn:toArray('O','K'))}")); } + @Test + public void testElvis01() throws Exception { + Assert.assertEquals("OK", evaluateExpression("${'OK'?:'FAIL'}")); + } + + @Test + public void testElvis02() throws Exception { + Assert.assertEquals("OK", evaluateExpression("${null?:'OK'}")); + } + + // ************************************************************************ private String evaluateExpression(String expression) { diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 18b4733a82..8e9fd48547 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -134,6 +134,10 @@ </subsection> <subsection name="Jasper"> <changelog> + <add> + Add support for the new Elvis operator (<code>:?</code>) in Jakarta + Expression language. (markt) + </add> <fix> Switch the <code>TldScanner</code> back to logging detailed scan results at debug level rather than trace level. (markt) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org