Author: markt Date: Mon Jul 15 19:26:07 2013 New Revision: 1503433 URL: http://svn.apache.org/r1503433 Log: EL 3.0 collections operations. Implement sorted.
Modified: tomcat/trunk/java/org/apache/el/stream/Stream.java tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java 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=1503433&r1=1503432&r2=1503433&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/stream/Stream.java (original) +++ tomcat/trunk/java/org/apache/el/stream/Stream.java Mon Jul 15 19:26:07 2013 @@ -17,6 +17,8 @@ package org.apache.el.stream; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -29,10 +31,10 @@ import org.apache.el.lang.ELSupport; public class Stream { - private final Iterator<?> iterator; + private final Iterator<Object> iterator; - public Stream(Iterator<?> iterator) { + public Stream(Iterator<Object > iterator) { this.iterator = iterator; } @@ -117,6 +119,67 @@ public class Stream { } + public Stream sorted() { + Iterator<Object> downStream = new OpIterator() { + + private Iterator<Object> sorted = null; + + @Override + protected void findNext() { + if (sorted == null) { + sort(); + } + if (sorted.hasNext()) { + next = sorted.next(); + foundNext = true; + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private final void sort() { + List list = new ArrayList<>(); + while (iterator.hasNext()) { + list.add(iterator.next()); + } + Collections.sort(list); + sorted = list.iterator(); + } + }; + return new Stream(downStream); + } + + + public Stream sorted(final LambdaExpression le) { + Iterator<Object> downStream = new OpIterator() { + + private Iterator<Object> sorted = null; + + @Override + protected void findNext() { + if (sorted == null) { + sort(le); + } + if (sorted.hasNext()) { + next = sorted.next(); + foundNext = true; + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private final void sort(LambdaExpression le) { + List list = new ArrayList<>(); + Comparator<Object> c = new LambdaExpressionComparator(le); + while (iterator.hasNext()) { + list.add(iterator.next()); + } + Collections.sort(list, c); + sorted = list.iterator(); + } + }; + return new Stream(downStream); + } + + public Iterator<?> iterator() { return iterator; } @@ -131,6 +194,23 @@ public class Stream { } + private static class LambdaExpressionComparator + implements Comparator<Object>{ + + private final LambdaExpression le; + + public LambdaExpressionComparator(LambdaExpression le) { + this.le = le; + } + + @Override + public int compare(Object o1, Object o2) { + return ELSupport.coerceToNumber( + le.invoke(o1, o2), Integer.class).intValue(); + } + } + + private abstract static class OpIterator implements Iterator<Object> { protected boolean foundNext = false; protected Object next; Modified: tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java?rev=1503433&r1=1503432&r2=1503433&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java (original) +++ tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java Mon Jul 15 19:26:07 2013 @@ -68,7 +68,9 @@ public class StreamELResolverImpl extend return new Stream(new ArrayIterator(base)); } else if (base instanceof Collection) { context.setPropertyResolved(true); - return new Stream(((Collection<?>) base).iterator()); + @SuppressWarnings("unchecked") + Collection<Object> collection = (Collection<Object>) base; + return new Stream(collection.iterator()); } } 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=1503433&r1=1503432&r2=1503433&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java (original) +++ tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Mon Jul 15 19:26:07 2013 @@ -180,4 +180,35 @@ public class TestCollectionOperations { Assert.assertEquals(expected, result); } + + @Test + public void testSorted01() { + ELProcessor processor = new ELProcessor(); + Object result = processor.getValue( + "['c', 'd', 'b', 'a'].stream().sorted().toList()", + List.class); + List<String> expected = new ArrayList<>(4); + expected.add("a"); + expected.add("b"); + expected.add("c"); + expected.add("d"); + + Assert.assertEquals(expected, result); + } + + + @Test + public void testSortedLambdaExpression01() { + ELProcessor processor = new ELProcessor(); + Object result = processor.getValue( + "['c', 'd', 'b', 'a'].stream().sorted((x,y)->x.compareTo(y)*-1).toList()", + List.class); + List<String> expected = new ArrayList<>(4); + expected.add("d"); + expected.add("c"); + expected.add("b"); + expected.add("a"); + + Assert.assertEquals(expected, result); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org