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.