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