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: [email protected]
For additional commands, e-mail: [email protected]