Author: markt Date: Sun Jul 21 14:01:52 2013 New Revision: 1505394 URL: http://svn.apache.org/r1505394 Log: Handle calls to Optional#orElseGet where the LambdaExpression has already been evaluated
Modified: tomcat/trunk/java/org/apache/el/Messages.properties tomcat/trunk/java/org/apache/el/parser/AstValue.java tomcat/trunk/java/org/apache/el/stream/Optional.java tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.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=1505394&r1=1505393&r2=1505394&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/Messages.properties (original) +++ tomcat/trunk/java/org/apache/el/Messages.properties Sun Jul 21 14:01:52 2013 @@ -56,5 +56,6 @@ error.identifier.notjava=The identifier error.lambda.tooManyMethodParameterSets=There are more sets of method parameters specified than there are nested lambda expressions # Stream +stream.compare.notComparable=Stream elements must implement Comparable stream.optional.empty=It is illegal to call get() on an empty optional -stream.compare.notComparable=Stream elements must implement Comparable \ No newline at end of file +stream.optional.paramNotLambda=The parameter for the method [{0}] should be a lambda expression Modified: tomcat/trunk/java/org/apache/el/parser/AstValue.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstValue.java?rev=1505394&r1=1505393&r2=1505394&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/parser/AstValue.java (original) +++ tomcat/trunk/java/org/apache/el/parser/AstValue.java Sun Jul 21 14:01:52 2013 @@ -24,12 +24,14 @@ import java.lang.reflect.Method; import javax.el.ELException; import javax.el.ELResolver; +import javax.el.LambdaExpression; import javax.el.MethodInfo; import javax.el.PropertyNotFoundException; import javax.el.ValueReference; import org.apache.el.lang.ELSupport; import org.apache.el.lang.EvaluationContext; +import org.apache.el.stream.Optional; import org.apache.el.util.MessageFactory; import org.apache.el.util.ReflectionUtil; @@ -142,6 +144,15 @@ public final class AstValue extends Simp (this.children[i+1] instanceof AstMethodParameters)) { AstMethodParameters mps = (AstMethodParameters) this.children[i+1]; + if (base instanceof Optional && "orElseGet".equals(suffix) && + mps.jjtGetNumChildren() == 1) { + Node paramFoOptional = mps.jjtGetChild(0); + if (!(paramFoOptional instanceof AstLambdaExpression || + paramFoOptional instanceof LambdaExpression)) { + throw new ELException(MessageFactory.get( + "stream.optional.paramNotLambda", suffix)); + } + } // This is a method base = resolver.invoke(ctx, base, suffix, null, mps.getParameters(ctx)); Modified: tomcat/trunk/java/org/apache/el/stream/Optional.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/stream/Optional.java?rev=1505394&r1=1505393&r2=1505394&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/stream/Optional.java (original) +++ tomcat/trunk/java/org/apache/el/stream/Optional.java Sun Jul 21 14:01:52 2013 @@ -57,9 +57,18 @@ public class Optional { } - public Object orElseGet(LambdaExpression le) { + public Object orElseGet(Object le) { if (obj == null) { - return le.invoke((Object[]) null); + // EL 3.0 specification says parameter is LambdaExpression but it + // may already have been evaluated. If that is the case, the + // original parameter will have been checked to ensure it was a + // LambdaExpression before it was evaluated. + + if (le instanceof LambdaExpression) { + return ((LambdaExpression) le).invoke((Object[]) null); + } else { + return le; + } } else { return obj; } 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=1505394&r1=1505393&r2=1505394&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java (original) +++ tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Sun Jul 21 14:01:52 2013 @@ -559,6 +559,16 @@ public class TestCollectionOperations { } + @Test(expected=ELException.class) + public void testAverage06() { + ELProcessor processor = new ELProcessor(); + + processor.getValue( + "[].stream().average().orElseGet(10)", + Object.class); + } + + @Test public void testSum01() { ELProcessor processor = new ELProcessor(); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org