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

Reply via email to