Author: markt
Date: Mon Jul 15 13:59:51 2013
New Revision: 1503253
URL: http://svn.apache.org/r1503253
Log:
EL 3.0 collections operations.
Implement filter
Modified:
tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
tomcat/trunk/java/org/apache/el/stream/Stream.java
tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java
Modified: tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java?rev=1503253&r1=1503252&r2=1503253&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java Mon Jul 15
13:59:51 2013
@@ -55,6 +55,7 @@ public class AstLambdaExpression extends
ValueExpressionImpl ve = new ValueExpressionImpl("", children[1],
ctx.getFunctionMapper(), ctx.getVariableMapper(), null);
LambdaExpression le = new LambdaExpression(formalParameters, ve);
+ le.setELContext(ctx);
return le;
}
Modified: tomcat/trunk/java/org/apache/el/stream/Stream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/stream/Stream.java?rev=1503253&r1=1503252&r2=1503253&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/stream/Stream.java (original)
+++ tomcat/trunk/java/org/apache/el/stream/Stream.java Mon Jul 15 13:59:51 2013
@@ -19,6 +19,11 @@ package org.apache.el.stream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.NoSuchElementException;
+
+import javax.el.LambdaExpression;
+
+import org.apache.el.lang.ELSupport;
public class Stream {
@@ -28,6 +33,55 @@ public class Stream {
this.iterator = iterator;
}
+ public Stream filter(final LambdaExpression le) {
+ Iterator<Object> filterIterator = new Iterator<Object>() {
+
+ private boolean foundNext = false;
+ private Object next;
+
+ @Override
+ public boolean hasNext() {
+ if (foundNext) {
+ return true;
+ }
+ findNext();
+ return foundNext;
+ }
+
+ @Override
+ public Object next() {
+ if (foundNext) {
+ foundNext = false;
+ return next;
+ }
+ findNext();
+ if (foundNext) {
+ foundNext = false;
+ return next;
+ } else {
+ throw new NoSuchElementException();
+ }
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ private void findNext() {
+ while (iterator.hasNext()) {
+ Object obj = iterator.next();
+ if (ELSupport.coerceToBoolean(
+ le.invoke(obj)).booleanValue()) {
+ next = obj;
+ foundNext = true;
+ break;
+ }
+ }
+ }
+ };
+ return new Stream(filterIterator);
+ }
public List<Object> toList() {
List<Object> result = new ArrayList<>();
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=1503253&r1=1503252&r2=1503253&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java
(original)
+++ tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Mon
Jul 15 13:59:51 2013
@@ -17,6 +17,7 @@
package org.apache.el.stream;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import javax.el.ELProcessor;
@@ -24,8 +25,31 @@ import javax.el.ELProcessor;
import org.junit.Assert;
import org.junit.Test;
+import org.apache.el.TesterBeanA;
+
public class TestCollectionOperations {
+ private static final TesterBeanA bean01 = new TesterBeanA();
+ private static final TesterBeanA bean02 = new TesterBeanA();
+ private static final TesterBeanA bean03 = new TesterBeanA();
+ private static final List<TesterBeanA> beans;
+
+ static {
+ List<TesterBeanA> list = new ArrayList<>();
+
+ bean01.setValLong(1);
+ list.add(bean01);
+
+ bean02.setValLong(2);
+ list.add(bean02);
+
+ bean03.setValLong(3);
+ list.add(bean03);
+
+ beans = Collections.unmodifiableList(list);
+ }
+
+
@Test
public void testToList01() {
ELProcessor processor = new ELProcessor();
@@ -55,4 +79,17 @@ public class TestCollectionOperations {
Assert.assertEquals(expected, result);
}
+
+ @Test
+ public void testFilter01() {
+ ELProcessor processor = new ELProcessor();
+ processor.defineBean("beans", beans);
+ Object result = processor.getValue(
+ "beans.stream().filter(b->b.valLong > 2).toList()",
+ List.class);
+ List<TesterBeanA> expected = new ArrayList<>(1);
+ expected.add(bean03);
+
+ Assert.assertEquals(expected, result);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]