Author: markt
Date: Wed Jul 17 13:24:09 2013
New Revision: 1504123
URL: http://svn.apache.org/r1504123
Log:
Further improve handling of nested lambda expressions.
Modified:
tomcat/trunk/java/org/apache/el/Messages.properties
tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java
Modified: tomcat/trunk/java/org/apache/el/Messages.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/Messages.properties?rev=1504123&r1=1504122&r2=1504123&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/Messages.properties (original)
+++ tomcat/trunk/java/org/apache/el/Messages.properties Wed Jul 17 13:24:09 2013
@@ -52,3 +52,4 @@ error.context.null=ELContext was null
# Parser
error.identifier.notjava=The identifier [{0}] is not a valid Java identifier
as required by section 1.19 of the EL specification (Identifier ::= Java
language identifier). This check can be disabled by setting the system property
org.apache.el.parser.SKIP_IDENTIFIER_CHECK to true.
+error.lambda.tooManyMethodParameterSets=There are more sets of method
parameters specified than there are nested lambda expressions
Modified: tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java?rev=1504123&r1=1504122&r2=1504123&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java Wed Jul 17
13:24:09 2013
@@ -25,6 +25,7 @@ import javax.el.LambdaExpression;
import org.apache.el.ValueExpressionImpl;
import org.apache.el.lang.EvaluationContext;
+import org.apache.el.util.MessageFactory;
public class AstLambdaExpression extends SimpleNode {
@@ -35,6 +36,24 @@ public class AstLambdaExpression extends
@Override
public Object getValue(EvaluationContext ctx) throws ELException {
+ // Check that there are not more sets of method parameters than there
+ // are nested lambda expressions
+ int methodParameterSetCount = jjtGetNumChildren() - 2;
+ if (methodParameterSetCount > 0) {
+ // We know this node is an expression
+ methodParameterSetCount--;
+ Node n = this.jjtGetChild(1);
+ while (methodParameterSetCount > 0) {
+ if (n.jjtGetNumChildren() <2 ||
+ !(n.jjtGetChild(0) instanceof AstLambdaParameters)) {
+ throw new ELException(MessageFactory.get(
+ "error.lambda.tooManyMethodParameterSets"));
+ }
+ n = n.jjtGetChild(1);
+ methodParameterSetCount--;
+ }
+ }
+
// First child is always parameters even if there aren't any
AstLambdaParameters formalParametersNode =
(AstLambdaParameters) children[0];
@@ -54,16 +73,22 @@ public class AstLambdaExpression extends
LambdaExpression le = new LambdaExpression(formalParameters, ve);
le.setELContext(ctx);
- if (formalParameters.isEmpty()) {
+ if (formalParameters.isEmpty() && jjtGetNumChildren() == 2) {
// No formal parameters - invoke the expression
return le.invoke(ctx, (Object[]) null);
}
// If there are method parameters, need to invoke the expression with
- // those parameters. If there are multiple method parameters there
- // should be that many nested expressions.
- // If there are more nested expressions that parameters this will
return
- // a LambdaExpression
+ // those parameters. If there are multiple sets of method parameters
+ // there should be at least that many nested expressions.
+ // If there are more nested expressions than sets of method parameters
+ // this may return a LambdaExpression.
+ // If there are more sets of method parameters than nested expressions
+ // an ELException will have been thrown by the check at the start of
+ // this method.
+ // If the inner most expression(s) do not require parameters then a
+ // value will be returned once the outermost expression that does
+ // require a parameter has been evaluated.
Object result = le;
int i = 2;
while (result instanceof LambdaExpression && i < jjtGetNumChildren()) {
@@ -72,10 +97,6 @@ public class AstLambdaExpression extends
i++;
}
- if (i < jjtGetNumChildren()) {
- throw new ELException();
- }
-
return result;
}
}
Modified: tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java?rev=1504123&r1=1504122&r2=1504123&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java
(original)
+++ tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java Wed Jul
17 13:24:09 2013
@@ -16,6 +16,7 @@
*/
package org.apache.el.parser;
+import javax.el.ELException;
import javax.el.ELProcessor;
import org.junit.Assert;
@@ -74,4 +75,53 @@ public class TestAstLambdaExpression {
Integer.class);
Assert.assertEquals(Integer.valueOf(1), result);
}
+
+
+ @Test
+ public void testInvocation01() {
+ ELProcessor processor = new ELProcessor();
+ Object result =
+ processor.getValue("(()->2)()",
+ Integer.class);
+ Assert.assertEquals(Integer.valueOf(2), result);
+ }
+
+
+ @Test
+ public void testNested01() {
+ ELProcessor processor = new ELProcessor();
+ Object result =
+ processor.getValue("(()->y->2-y)()(1)",
+ Integer.class);
+ Assert.assertEquals(Integer.valueOf(1), result);
+ }
+
+
+ @Test
+ public void testNested02() {
+ ELProcessor processor = new ELProcessor();
+ Object result =
+ processor.getValue("(()->y->()->2-y)()(1)()",
+ Integer.class);
+ Assert.assertEquals(Integer.valueOf(1), result);
+ }
+
+
+ @Test(expected=ELException.class)
+ public void testNested03() {
+ ELProcessor processor = new ELProcessor();
+ // More method parameters than there are nested lambda expressions
+ processor.getValue("(()->y->()->2-y)()(1)()()",
+ Integer.class);
+ }
+
+
+ @Test(expected=ELException.class)
+ public void testNested04() {
+ ELProcessor processor = new ELProcessor();
+ Object result =
+ processor.getValue("(()->y->()->x->x-y)()(1)()(2)",
+ Integer.class);
+ Assert.assertEquals(Integer.valueOf(1), result);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]