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;
}
}
}