You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2015/10/30 15:49:43 UTC

svn commit: r1711486 - in /sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers: stateful/BasicResolveContext.java stateful/CombinedResourceProvider.java tree/PathTree.java

Author: cziegeler
Date: Fri Oct 30 14:49:43 2015
New Revision: 1711486

URL: http://svn.apache.org/viewvc?rev=1711486&view=rev
Log:
SLING-4752 : New resource query API. Implementation stub

Modified:
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/BasicResolveContext.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/CombinedResourceProvider.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/tree/PathTree.java

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/BasicResolveContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/BasicResolveContext.java?rev=1711486&r1=1711485&r2=1711486&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/BasicResolveContext.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/BasicResolveContext.java Fri Oct 30 14:49:43 2015
@@ -23,6 +23,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderStorage;
+import org.apache.sling.resourceresolver.impl.providers.tree.Node;
 import org.apache.sling.spi.resource.provider.ResolverContext;
 import org.apache.sling.spi.resource.provider.ResourceProvider;
 
@@ -81,10 +82,10 @@ public class BasicResolveContext<T> impl
                     final ResourceProviderStorage storage = this.combinedProvider.getResourceProviderStorage();
                     String path = this.parentPath;
                     while ( path != null && this.parentProvider != null ) {
-                        final ResourceProviderHandler handler = storage.getTree().getBestMatchingNode(this.parentPath);
-                        if ( handler != null ) {
+                        final Node<ResourceProviderHandler> node = storage.getTree().getBestMatchingNode(this.parentPath);
+                        if ( node != null ) {
                             try {
-                                final StatefulResourceProvider srp = this.combinedProvider.getStatefulResourceProvider(handler);
+                                final StatefulResourceProvider srp = this.combinedProvider.getStatefulResourceProvider(node.getValue());
                                 if ( srp != null ) {
                                     this.parentProvider = srp.getResourceProvider();
                                     this.parentResolveContext = srp.getContext();

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/CombinedResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/CombinedResourceProvider.java?rev=1711486&r1=1711485&r2=1711486&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/CombinedResourceProvider.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/CombinedResourceProvider.java Fri Oct 30 14:49:43 2015
@@ -48,6 +48,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.resource.query.Query;
+import org.apache.sling.api.resource.query.Query.QueryType;
 import org.apache.sling.api.resource.query.QueryInstructions;
 import org.apache.sling.api.resource.query.Result;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
@@ -375,9 +376,52 @@ public class CombinedResourceProvider {
      * Queries all resource providers and combines the results.
      */
     public Result find(final Query q, final QueryInstructions qi) {
+        final Set<ResourceProviderHandler> providers = new HashSet<ResourceProviderHandler>();
+        collect(providers, q);
+        if ( providers.isEmpty() ) {
+            return new Result() {
+
+                @Override
+                public Iterator<Resource> iterator() {
+                    final Collection<Resource> col = Collections.emptyList();
+                    return col.iterator();
+                }
+
+                @Override
+                public String getContinuationKey() {
+                    return null;
+                }
+            };
+        }
         return new CombinedQueryResult(q, qi);
     }
 
+    private void collect(final Set<ResourceProviderHandler> providers, final Query q) {
+        if ( q.getQueryType() == QueryType.SINGLE ) {
+            if ( q.getPaths().isEmpty() ) {
+                final Node<ResourceProviderHandler> node = storage.getTree().getBestMatchingNode("/");
+                if ( node != null && node.getValue().getResourceProvider().getQueryProvider() != null ) {
+                    if ( providers.add(node.getValue()) && providers.size() > 1 ) {
+                        throw new IllegalArgumentException("More than one provider involved in query.");
+                    }
+                }
+            } else {
+                for(final String p : q.getPaths() ) {
+                    final Node<ResourceProviderHandler> node = storage.getTree().getBestMatchingNode(p);
+                    if ( node != null && node.getValue().getResourceProvider().getQueryProvider() != null ) {
+                        if ( providers.add(node.getValue()) && providers.size() > 1 ) {
+                            throw new IllegalArgumentException("More than one provider involved in query.");
+                        }
+                    }
+                }
+            }
+        } else {
+            for(final Query iq : q.getParts()) {
+                collect(providers, iq);
+            }
+        }
+    }
+
     /**
      * Return the union of query languages supported by the providers.
      */
@@ -440,7 +484,7 @@ public class CombinedResourceProvider {
 
     private StatefulResourceProvider checkSourceAndDest(final String srcAbsPath, final String destAbsPath) throws PersistenceException {
         // check source
-        final Node<ResourceProviderHandler> srcNode = storage.getTree().getNode(srcAbsPath);
+        final Node<ResourceProviderHandler> srcNode = storage.getTree().getBestMatchingNode(srcAbsPath);
         if ( srcNode == null ) {
             throw new PersistenceException("Source resource does not exist.", null, srcAbsPath, null);
         }
@@ -459,7 +503,7 @@ public class CombinedResourceProvider {
         }
 
         // check destination
-        final Node<ResourceProviderHandler> destNode = storage.getTree().getNode(destAbsPath);
+        final Node<ResourceProviderHandler> destNode = storage.getTree().getBestMatchingNode(destAbsPath);
         if ( destNode == null ) {
             throw new PersistenceException("Destination resource does not exist.", null, destAbsPath, null);
         }
@@ -584,8 +628,8 @@ public class CombinedResourceProvider {
      * @throws LoginException
      */
     private @Nonnull StatefulResourceProvider getBestMatchingProvider(final String path) throws LoginException {
-        final ResourceProviderHandler handler = storage.getTree().getBestMatchingNode(path);
-        return handler == null ? EmptyResourceProvider.SINGLETON : authenticator.getStateful(handler, this);
+        final Node<ResourceProviderHandler> node = storage.getTree().getBestMatchingNode(path);
+        return node == null ? EmptyResourceProvider.SINGLETON : authenticator.getStateful(node.getValue(), this);
     }
 
     /**
@@ -594,9 +638,9 @@ public class CombinedResourceProvider {
      * @throws LoginException
      */
     private @CheckForNull StatefulResourceProvider getBestMatchingModifiableProvider(final String path) throws LoginException {
-        final ResourceProviderHandler handler = storage.getTree().getBestMatchingNode(path);
-        if ( handler != null && handler.getInfo().isModifiable() ) {
-            return authenticator.getStateful(handler, this);
+        final Node<ResourceProviderHandler> node = storage.getTree().getBestMatchingNode(path);
+        if ( node != null && node.getValue().getInfo().isModifiable() ) {
+            return authenticator.getStateful(node.getValue(), this);
         }
         return null;
     }

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/tree/PathTree.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/tree/PathTree.java?rev=1711486&r1=1711485&r2=1711486&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/tree/PathTree.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/tree/PathTree.java Fri Oct 30 14:49:43 2015
@@ -48,12 +48,12 @@ public class PathTree<T extends Pathable
         node.setValue(value);
     }
 
-    public T getBestMatchingNode(final String path) {
+    public Node<T> getBestMatchingNode(final String path) {
         if (path == null || path.isEmpty() || path.charAt(0) != '/') {
             return null;
         }
 
-        T result = root.getValue();
+        Node<T> result = root.getValue() != null ? root : null;
 
         Node<T> node = root;
         Iterator<String> it = new PathSegmentIterator(path, 1);
@@ -64,7 +64,7 @@ public class PathTree<T extends Pathable
                 break;
             } else {
                 if (node.getValue() != null) {
-                    result = node.getValue();
+                    result = node;
                 }
             }
         }