diff --git a/magnolia-core/src/main/java/info/magnolia/jcr/util/NodeUtil.java b/magnolia-core/src/main/java/info/magnolia/jcr/util/NodeUtil.java index 2565216..7235fd3 100644 --- a/magnolia-core/src/main/java/info/magnolia/jcr/util/NodeUtil.java +++ b/magnolia-core/src/main/java/info/magnolia/jcr/util/NodeUtil.java @@ -48,6 +48,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; +import java.util.NoSuchElementException; import javax.jcr.Node; import javax.jcr.NodeIterator; @@ -57,10 +58,13 @@ import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeManager; +import javax.jcr.query.Row; +import javax.jcr.query.RowIterator; import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.commons.iterator.FilteringNodeIterator; +import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter; import org.apache.jackrabbit.commons.predicate.NodeTypePredicate; import org.apache.jackrabbit.commons.predicate.Predicate; import org.slf4j.Logger; @@ -760,6 +764,30 @@ public class NodeUtil { }; } + /** + * Filters rows of result set from query by provided selector and returns such nodes in the NodeIterator. Example of such query would be + * SELECT page.* FROM [mgnl:page] AS page WHERE page.title like 'something%'. Selector in this query is page + * + * @param iterator RowIterator from the result set of executed query + * @param selector Selector used in the query to identify nodes + * @return NodeIterator containing only nodes identified by the selector + */ + public static NodeIterator filterParentNodeType(RowIterator iterator, final String selector) throws RepositoryException { + return new NodeIteratorAdapter(iterator) { + @Override + public Node nextNode() throws NoSuchElementException { + Row row = (Row) next(); + try { + return row.getNode(selector); + } catch (RepositoryException e) { + // no way to pass a root cause to NSEE + log.debug(e.getMessage(), e); + throw new NoSuchElementException(e.getMessage()); + } + } + }; + } + public static Collection getCollectionFromNodeIterator(NodeIterator iterator){ Collection nodeCollection = new LinkedHashSet(150); while(iterator.hasNext()){