X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Facr%2FJcrContentProvider.java;h=bc4aa5be418b33c966e87e95eb2a955bd2670996;hb=7382be4e1bb5eaa5e7660e6b2d4c307ec4936442;hp=38bcd569212e6b7d371591f01b5b325d1decdf33;hpb=40e89f491fb2aad2e1219b28106588ea365198a0;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java index 38bcd56..bc4aa5b 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java @@ -6,14 +6,21 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Objects; +import java.util.Spliterator; +import java.util.function.Consumer; import java.util.function.Function; +import javax.jcr.Node; +import javax.jcr.NodeIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.query.Query; +import javax.jcr.query.QueryResult; import javax.xml.namespace.NamespaceContext; import org.argeo.api.acr.Content; +import org.argeo.api.acr.search.BasicSearch; import org.argeo.api.acr.spi.ContentProvider; import org.argeo.api.acr.spi.ProvidedContent; import org.argeo.api.acr.spi.ProvidedSession; @@ -133,4 +140,63 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { } } + /* + * SEARCH + */ + + @Override + public Spliterator search(ProvidedSession session, BasicSearch search, String relPath) { + try { + Session jcrSession = getJcrSession(session, jcrWorkspace); + BasicSearchToQom jcrBasicSearch = new BasicSearchToQom(jcrSession, search, relPath); + Query query = jcrBasicSearch.createQuery(); + QueryResult queryResult = query.execute(); + return new QueryResultSpliterator(session, queryResult.getNodes()); + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + + class QueryResultSpliterator implements Spliterator { + private ProvidedSession providedSession; + private NodeIterator nodeIterator; + + public QueryResultSpliterator(ProvidedSession providedSession, NodeIterator nodeIterator) { + super(); + this.providedSession = providedSession; + this.nodeIterator = nodeIterator; + } + + @Override + public boolean tryAdvance(Consumer action) { + if (!nodeIterator.hasNext()) + return false; + try { + Node node = nodeIterator.nextNode(); + // TODO optimise by reusing the Node + JcrContent jcrContent = new JcrContent(providedSession, JcrContentProvider.this, jcrWorkspace, + node.getPath()); + action.accept(jcrContent); + return true; + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + + @Override + public Spliterator trySplit() { + return null; + } + + @Override + public long estimateSize() { + return nodeIterator.getSize(); + } + + @Override + public int characteristics() { + return NONNULL | SIZED; + } + + } }