You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by je...@apache.org on 2018/06/08 17:12:53 UTC

[sling-whiteboard] branch master updated: removed individual stream() option and added a listChildren

This is an automated email from the ASF dual-hosted git repository.

jeb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 1e6cb5d  removed individual stream() option and added a listChildren
1e6cb5d is described below

commit 1e6cb5d08c233d642df923bd55c352fe56ea257e
Author: Jason E Bailey <je...@apache.org>
AuthorDate: Fri Jun 8 13:12:42 2018 -0400

    removed individual stream() option and added a listChildren
---
 .../sling/resource/filter/ResourceStream.java      | 77 +++++++++++++---------
 .../resource/filter/ResourceFilterArgTest.java     |  2 +-
 .../resource/filter/ResourceFilterDateTest.java    |  2 +-
 .../resource/filter/ResourceFilterLogicTest.java   |  2 +-
 .../sling/resource/filter/ResourceFilterTest.java  |  4 +-
 5 files changed, 50 insertions(+), 37 deletions(-)

diff --git a/resource-filter/src/main/java/org/apache/sling/resource/filter/ResourceStream.java b/resource-filter/src/main/java/org/apache/sling/resource/filter/ResourceStream.java
index e50fc7a..2a6f865 100644
--- a/resource-filter/src/main/java/org/apache/sling/resource/filter/ResourceStream.java
+++ b/resource-filter/src/main/java/org/apache/sling/resource/filter/ResourceStream.java
@@ -14,9 +14,9 @@
 package org.apache.sling.resource.filter;
 
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import java.util.Stack;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
@@ -29,63 +29,76 @@ import org.apache.sling.api.resource.Resource;
  *
  */
 public class ResourceStream {
-    
+
     private Resource resource;
 
     public ResourceStream(Resource resource) {
-       this.resource = resource;
+        this.resource = resource;
     }
 
     /**
-     * Provides a stream of resources starting from the current resource and
-     * traversing through its subtree, the path of descent is controlled by the 
-     * branch selector
+     * Provides a depth first {@code Stream<Resource>} traversal of the resource
+     * tree starting with the current resource. The traversal is controlled by the
+     * provided predicate which determines if a given child is traversed. If no
+     * children matches the predicate, the traversal for that branch ends
      * 
-     * @return self closing {@code Stream<Resource>} of unknown size.
+     * @param branchSelector
+     *            used to determine whether a given child resource is traversed
+     * @return {@code Stream<Resource>} of unknown size.
      */
     public Stream<Resource> stream(Predicate<Resource> branchSelector) {
         final Resource resource = this.resource;
         return StreamSupport.stream(Spliterators.spliteratorUnknownSize(new Iterator<Resource>() {
 
-            private final LinkedList<Resource> resourcesToCheck = new LinkedList<>();
+            private final Stack<Iterator<Resource>> resources = new Stack<Iterator<Resource>>();
+            private Resource current;
+            private Iterator<Resource> iterator;
 
             {
-                resourcesToCheck.addFirst(resource);
+                resources.push(resource.getChildren().iterator());
+                current = resource;
             }
 
-            Resource current;
-
             @Override
             public boolean hasNext() {
-                if (resourcesToCheck.isEmpty()) {
-                    return false;
-                }
-
-                current = resourcesToCheck.removeFirst();
-                int index = 0;
-                for (Resource child : current.getChildren()) {
-                    if (branchSelector.test(child)) {
-                        resourcesToCheck.add(index++, child);
-                    }
+                if (current == null) {
+                    return seek();
                 }
-
                 return true;
             }
 
             @Override
             public Resource next() {
-                return current;
+                Resource next = current;
+                current = null;
+                return next;
+            }
+
+            private boolean seek() {
+                while (true) {
+                    if (resources.isEmpty()) {
+                        return false;
+                    }
+                    iterator = resources.peek();
+                    if (!iterator.hasNext()) {
+                        resources.pop();
+                    } else {
+                        current = iterator.next();
+                        if (branchSelector.test(current)) {
+                            resources.push(current.getChildren().iterator());
+                            break;
+                        }
+                    }
+                }
+                return true;
             }
+
         }, Spliterator.ORDERED | Spliterator.IMMUTABLE), false);
     }
-    
-    /**
-     * Provides a stream of resources starting from the current resource and
-     * traversing through its subtree
-     * 
-     * @return self closing {@code Stream<Resource>} of unknown size.
-     */
-    public Stream<Resource> stream(){
-        return stream(resource -> true);
+
+    public Stream<Resource> listChildren(Predicate<Resource> childSelector) {
+        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(resource.listChildren(),
+                Spliterator.ORDERED | Spliterator.IMMUTABLE), false).filter(childSelector);
     }
+
 }
diff --git a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
index 468e78d..c1189bd 100644
--- a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
+++ b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
@@ -65,7 +65,7 @@ public class ResourceFilterArgTest {
 
     private List<Resource> handle(String startPath, ResourceFilter filter) {
         Resource resource = context.resourceResolver().getResource(startPath);
-        return new ResourceStream(resource).stream().filter(filter).collect(Collectors.toList());
+        return new ResourceStream(resource).stream(r -> true).filter(filter).collect(Collectors.toList());
     }
 
 
diff --git a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
index 3d26c50..7937fba 100644
--- a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
+++ b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
@@ -96,6 +96,6 @@ public class ResourceFilterDateTest {
 	
 	private List<Resource> handle(String path, String filter) throws ParseException {
 		Resource resource = context.resourceResolver().getResource(path);
-		return new ResourceFilterStream(resource).stream().filter(new ResourceFilter(filter)).collect(Collectors.toList());
+		return new ResourceFilterStream(resource).stream(r -> true).filter(new ResourceFilter(filter)).collect(Collectors.toList());
 	}
 }
diff --git a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
index 7b0fd97..470c15a 100644
--- a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
+++ b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
@@ -62,6 +62,6 @@ public class ResourceFilterLogicTest {
 	
 	private List<Resource> handle(String path, String filter) throws ParseException {
 		Resource resource = context.resourceResolver().getResource(path);
-		return new ResourceFilterStream(resource).stream().filter(new ResourceFilter(filter)).collect(Collectors.toList());
+		return new ResourceFilterStream(resource).stream(r -> true).filter(new ResourceFilter(filter)).collect(Collectors.toList());
 	}
 }
diff --git a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
index afbae5d..f57f7a2 100644
--- a/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
+++ b/resource-filter/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
@@ -115,7 +115,7 @@ public class ResourceFilterTest {
 	public void testNullPropertyAndLimit() throws ParseException {
 		String query = "[jcr:content/foo] == null ";
 		Resource resource = context.resourceResolver().getResource(START_PATH);
-		List<Resource> found = new ResourceStream(resource).stream().filter(new ResourceFilter(query)).limit(3).collect(Collectors.toList());
+		List<Resource> found = new ResourceStream(resource).stream(r -> true).filter(new ResourceFilter(query)).limit(3).collect(Collectors.toList());
 		assertEquals(3, found.size());
 	}
 
@@ -261,6 +261,6 @@ public class ResourceFilterTest {
 	private List<Resource> handle(String path, String filter) throws ParseException {
 		Resource resource = context.resourceResolver().getResource(path);
 		Predicate<Resource> f = new ResourceFilter(filter);
-		return new ResourceStream(resource).stream().filter(f).collect(Collectors.toList());
+		return new ResourceStream(resource).stream(r -> true).filter(f).collect(Collectors.toList());
 	}
 }

-- 
To stop receiving notification emails like this one, please contact
jeb@apache.org.