Author: markt Date: Fri Jul 19 13:54:19 2013 New Revision: 1504878 URL: http://svn.apache.org/r1504878 Log: Fix passing lambda expressions as parameters.
Modified: tomcat/trunk/java/org/apache/el/parser/AstFunction.java tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Modified: tomcat/trunk/java/org/apache/el/parser/AstFunction.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstFunction.java?rev=1504878&r1=1504877&r2=1504878&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/parser/AstFunction.java (original) +++ tomcat/trunk/java/org/apache/el/parser/AstFunction.java Fri Jul 19 13:54:19 2013 @@ -24,6 +24,8 @@ import java.lang.reflect.Method; import javax.el.ELException; import javax.el.FunctionMapper; import javax.el.LambdaExpression; +import javax.el.ValueExpression; +import javax.el.VariableMapper; import org.apache.el.lang.EvaluationContext; import org.apache.el.util.MessageFactory; @@ -90,10 +92,26 @@ public final class AstFunction extends S Method m = fnMapper.resolveFunction(this.prefix, this.localName); if (m == null && this.prefix.length() == 0) { - // Handle case of lambda expression being set to an EL variable for - // later use - Object obj = - ctx.getELResolver().getValue(ctx, null, this.localName); + // TODO: Do we need to think about precedence of the various ways + // a lambda expression may be obtained from something that + // the parser thinks is a function? + Object obj = null; + if (ctx.isLambdaArgument(this.localName)) { + obj = ctx.getLambdaArgument(this.localName); + } + if (obj == null) { + VariableMapper varMapper = ctx.getVariableMapper(); + if (varMapper != null) { + obj = varMapper.resolveVariable(this.localName); + if (obj instanceof ValueExpression) { + // See if this returns a LambdaEXpression + obj = ((ValueExpression) obj).getValue(ctx); + } + } + } + if (obj == null) { + obj = ctx.getELResolver().getValue(ctx, null, this.localName); + } if (obj instanceof LambdaExpression) { // Build arguments int i = 0; Modified: tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java?rev=1504878&r1=1504877&r2=1504878&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java (original) +++ tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Fri Jul 19 13:54:19 2013 @@ -424,6 +424,18 @@ public class TestCollectionOperations { @Test + public void testMaxLambda02() { + ELProcessor processor = new ELProcessor(); + processor.defineBean("beans", beans); + processor.setVariable("comparison", "v->(x,y)->v(x).compareTo(v(y))"); + + Object result = processor.getValue( + "beans.stream().max(comparison(x->x.name))", + Object.class); + + Assert.assertEquals(bean03, ((Optional) result).get()); + } + @Test public void testMin01() { ELProcessor processor = new ELProcessor(); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org