You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/07/21 16:01:53 UTC

svn commit: r1505394 - in /tomcat/trunk: java/org/apache/el/Messages.properties java/org/apache/el/parser/AstValue.java java/org/apache/el/stream/Optional.java test/org/apache/el/stream/TestCollectionOperations.java

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org