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

Reply via email to