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 2008/04/15 15:17:47 UTC
svn commit: r648236 - in /incubator/sling/trunk/jcr/resource: ./
src/main/java/org/apache/sling/jcr/resource/
src/main/java/org/apache/sling/jcr/resource/internal/
src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/
src/main/java/org/apach...
Author: cziegeler
Date: Tue Apr 15 06:17:44 2008
New Revision: 648236
URL: http://svn.apache.org/viewvc?rev=648236&view=rev
Log:
SLING-381: Support multiple JcrResourceTypeProviders (incl junit tests)
Added:
incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImplTest.java (with props)
Modified:
incubator/sling/trunk/jcr/resource/pom.xml
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceTypeProvider.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceIterator.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java
incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/starresource/StarResource.java
Modified: incubator/sling/trunk/jcr/resource/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/pom.xml?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/pom.xml (original)
+++ incubator/sling/trunk/jcr/resource/pom.xml Tue Apr 15 06:17:44 2008
@@ -187,10 +187,16 @@
<artifactId>commons-collections</artifactId>
</dependency>
+ <!-- Testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.jmock</groupId>
+ <artifactId>jmock-junit4</artifactId>
+ </dependency>
+
<dependency>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>jackrabbit-core</artifactId>
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceTypeProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceTypeProvider.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceTypeProvider.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceTypeProvider.java Tue Apr 15 06:17:44 2008
@@ -21,13 +21,16 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
-/** Provide a resourceType for JCR Nodes which do not have
- * a sling:resourceType property.
- */
+/**
+ * Provide a resource type for repository nodes which do not have
+ * a sling:resourceType property.
+ */
public interface JcrResourceTypeProvider {
-
- /** Return the default resource type to use for Node n, when
- * n has not sling:resourceType property
+
+ /**
+ * Return the resource type to use for the node.
+ * @param n The node.
+ * @return The resource type to use or null.
*/
String getResourceTypeForNode(Node n) throws RepositoryException;
}
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java Tue Apr 15 06:17:44 2008
@@ -82,7 +82,7 @@
if (result == null) {
if(StarResource.appliesTo(request)) {
- result = new StarResource(this, pathInfo, rootProvider.getDefaultResourceTypeProvider());
+ result = new StarResource(this, pathInfo, rootProvider.getResourceTypeProviders());
} else {
result = new NonExistingResource(this, pathInfo);
}
@@ -186,7 +186,7 @@
try {
QueryResult res = JcrResourceUtil.query(getSession(), query,
language);
- return new JcrNodeResourceIterator(this, res.getNodes(), rootProvider.getDefaultResourceTypeProvider());
+ return new JcrNodeResourceIterator(this, res.getNodes(), rootProvider.getResourceTypeProviders());
} catch (javax.jcr.query.InvalidQueryException iqe) {
throw new QuerySyntaxException(iqe.getMessage(), query, language,
iqe);
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java Tue Apr 15 06:17:44 2008
@@ -19,8 +19,11 @@
package org.apache.sling.jcr.resource.internal;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.Dictionary;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -32,14 +35,14 @@
import org.apache.sling.api.resource.ResourceProvider;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.api.SlingRepository;
-import org.apache.sling.jcr.resource.JcrResourceTypeProvider;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;
+import org.apache.sling.jcr.resource.JcrResourceTypeProvider;
import org.apache.sling.jcr.resource.internal.helper.Mapping;
import org.apache.sling.jcr.resource.internal.helper.ResourceProviderEntry;
import org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderEntry;
import org.apache.sling.osgi.commons.OsgiUtil;
import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleListener;
+import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.event.Event;
@@ -68,6 +71,10 @@
* @scr.reference name="ResourceProvider"
* interface="org.apache.sling.api.resource.ResourceProvider"
* cardinality="0..n" policy="dynamic"
+ * @scr.reference name="JcrResourceTypeProvider"
+ * interface="JcrResourceTypeProvider"
+ * cardinality="0..n" policy="dynamic"
+
*/
public class JcrResourceResolverFactoryImpl implements
JcrResourceResolverFactory {
@@ -118,18 +125,24 @@
* @scr.reference cardinality="0..1" policy="dynamic"
*/
private EventAdmin eventAdmin;
-
- /** The (optional) default resource type provider
- *
- * @scr.reference cardinality="0..1" policy="dynamic"
+
+ /** The (optional) resource type providers.
*/
- private JcrResourceTypeProvider defaultResourceTypeProvider;
+ protected final List<JcrResourceTypeProviderEntry> jcrResourceTypeProviders = new ArrayList<JcrResourceTypeProviderEntry>();
- // list of ResourceProvider services bound before activation of the
- // component
- private List<ServiceReference> delayedResourceProviders = new LinkedList<ServiceReference>();
+ /**
+ * List of ResourceProvider services bound before activation of the
+ * component.
+ */
+ private final List<ServiceReference> delayedResourceProviders = new LinkedList<ServiceReference>();
- private ComponentContext componentContext;
+ /**
+ * List of JcrResourceTypeProvider services bound before activation of the
+ * component.
+ */
+ protected List<ServiceReference> delayedJcrResourceTypeProviders = new LinkedList<ServiceReference>();
+
+ protected ComponentContext componentContext;
/**
* This services ServiceReference for use in
@@ -163,10 +176,25 @@
*/
public ResourceResolver getResourceResolver(Session session) {
JcrResourceProviderEntry sessionRoot = new JcrResourceProviderEntry(
- session, rootProviderEntry.getEntries(), defaultResourceTypeProvider);
+ session, rootProviderEntry.getEntries(), getJcrResourceTypeProvider());
return new JcrResourceResolver(sessionRoot, this);
}
+ protected JcrResourceTypeProvider[] getJcrResourceTypeProvider() {
+ JcrResourceTypeProvider[] providers = null;
+ synchronized ( this.jcrResourceTypeProviders ) {
+ if ( this.jcrResourceTypeProviders.size() > 0 ) {
+ providers = new JcrResourceTypeProvider[this.jcrResourceTypeProviders.size()];
+ int index = 0;
+ final Iterator<JcrResourceTypeProviderEntry> i = this.jcrResourceTypeProviders.iterator();
+ while ( i.hasNext() ) {
+ providers[index] = i.next().provider;
+ }
+ }
+ }
+ return providers;
+ }
+
// ---------- EventAdmin Event Dispatching ---------------------------------
/**
@@ -303,6 +331,46 @@
bindResourceProvider(reference);
}
delayedResourceProviders.clear();
+ this.processDelayedJcrResourceTypeProviders();
+ }
+
+ protected void processDelayedJcrResourceTypeProviders() {
+ synchronized ( this.jcrResourceTypeProviders ) {
+ for(ServiceReference reference : delayedJcrResourceTypeProviders ) {
+ this.addJcrResourceTypeProvider(reference);
+ }
+ delayedJcrResourceTypeProviders.clear();
+ }
+ }
+
+ protected void addJcrResourceTypeProvider(final ServiceReference reference) {
+ final Long id = (Long)reference.getProperty(Constants.SERVICE_ID);
+ long ranking = -1;
+ if ( reference.getProperty(Constants.SERVICE_RANKING) != null ) {
+ ranking = (Long)reference.getProperty(Constants.SERVICE_RANKING);
+ }
+ this.jcrResourceTypeProviders.add(new JcrResourceTypeProviderEntry(id,
+ ranking,
+ (JcrResourceTypeProvider)this.componentContext.locateService("ResourceTypeProvider", reference)));
+ Collections.sort(this.jcrResourceTypeProviders, new Comparator<JcrResourceTypeProviderEntry>() {
+
+ public int compare(JcrResourceTypeProviderEntry o1,
+ JcrResourceTypeProviderEntry o2) {
+ if ( o1.ranking < o2.ranking ) {
+ return 1;
+ } else if ( o1.ranking > o2.ranking ) {
+ return -1;
+ } else {
+ if ( o1.serviceId < o2.serviceId ) {
+ return -1;
+ } else if ( o1.serviceId > o2.serviceId ) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+ });
+
}
/** Deativates this component, called by SCR to take out of service */
@@ -348,6 +416,30 @@
}
}
+ protected void bindJcrResourceTypeProvider(ServiceReference reference) {
+ synchronized ( this.jcrResourceTypeProviders ) {
+ if (componentContext == null) {
+ delayedJcrResourceTypeProviders.add(reference);
+ } else {
+ this.addJcrResourceTypeProvider(reference);
+ }
+ }
+ }
+
+ protected void unbindJcrResourceTypeProvider(ServiceReference reference) {
+ synchronized ( this.jcrResourceTypeProviders ) {
+ delayedJcrResourceTypeProviders.remove(reference);
+ final long id = (Long)reference.getProperty(Constants.SERVICE_ID);
+ final Iterator<JcrResourceTypeProviderEntry> i = this.jcrResourceTypeProviders.iterator();
+ while ( i.hasNext() ) {
+ final JcrResourceTypeProviderEntry current = i.next();
+ if ( current.serviceId == id ) {
+ i.remove();
+ }
+ }
+ }
+ }
+
// ---------- internal helper ----------------------------------------------
/** Returns the JCR repository used by this factory */
@@ -355,4 +447,17 @@
return repository;
}
+ protected static final class JcrResourceTypeProviderEntry {
+ final long serviceId;
+ final long ranking;
+ final JcrResourceTypeProvider provider;
+
+ public JcrResourceTypeProviderEntry(final long id,
+ final long ranking,
+ final JcrResourceTypeProvider p) {
+ this.serviceId = id;
+ this.ranking = ranking;
+ this.provider = p;
+ }
+ }
}
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java Tue Apr 15 06:17:44 2008
@@ -45,15 +45,16 @@
private final ResourceMetadata metadata;
private String resourceSuperType;
-
- protected final JcrResourceTypeProvider defaultResourceTypeProvider;
-
- protected JcrItemResource(ResourceResolver resourceResolver,
- String path, JcrResourceTypeProvider defaultResourceTypeProvider) {
+
+ protected final JcrResourceTypeProvider[] resourceTypeProviders;
+
+ protected JcrItemResource(ResourceResolver resourceResolver,
+ String path,
+ JcrResourceTypeProvider[] resourceTypeProviders) {
this.resourceResolver = resourceResolver;
this.path = path;
- this.defaultResourceTypeProvider = defaultResourceTypeProvider;
+ this.resourceTypeProviders = resourceTypeProviders;
metadata = new ResourceMetadata();
metadata.setResolutionPath(path);
@@ -114,9 +115,13 @@
if (node.hasProperty(SLING_RESOURCE_TYPE_PROPERTY)) {
result = node.getProperty(SLING_RESOURCE_TYPE_PROPERTY).getValue().getString();
}
-
- if (result == null && defaultResourceTypeProvider != null) {
- result = defaultResourceTypeProvider.getResourceTypeForNode(node);
+
+ if (result == null && this.resourceTypeProviders != null) {
+ int index = 0;
+ while ( result == null && index < this.resourceTypeProviders.length ) {
+ result = this.resourceTypeProviders[index].getResourceTypeForNode(node);
+ index++;
+ }
}
if (result == null || result.length() == 0) {
@@ -125,7 +130,7 @@
return result;
}
-
+
/**
* Returns an iterator over the child resources or <code>null</code> if
* there are none.
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java Tue Apr 15 06:17:44 2008
@@ -53,9 +53,11 @@
private final String resourceType;
- JcrNodeResource(ResourceResolver resourceResolver, Node node, JcrResourceTypeProvider defaultResourceTypeProvider)
+ JcrNodeResource(ResourceResolver resourceResolver,
+ Node node,
+ JcrResourceTypeProvider[] resourceTypeProviders)
throws RepositoryException {
- super(resourceResolver, node.getPath(), defaultResourceTypeProvider);
+ super(resourceResolver, node.getPath(), resourceTypeProviders);
this.node = node;
resourceType = getResourceTypeForNode(node);
@@ -110,7 +112,7 @@
: node;
Property data;
-
+
// if the node has a jcr:data property, use that property
if (content.hasProperty(JCR_DATA)) {
data = content.getProperty(JCR_DATA);
@@ -139,7 +141,7 @@
// for all resources that do need to provide the stream
long length = data.getLength();
InputStream stream = data.getStream();
-
+
getResourceMetadata().setContentLength(length);
return stream;
}
@@ -171,7 +173,7 @@
try {
if (getNode().hasNodes()) {
return new JcrNodeResourceIterator(getResourceResolver(),
- getNode().getNodes(), defaultResourceTypeProvider);
+ getNode().getNodes(), this.resourceTypeProviders);
}
} catch (RepositoryException re) {
log.error("listChildren: Cannot get children of " + this, re);
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceIterator.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceIterator.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceIterator.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceIterator.java Tue Apr 15 06:17:44 2008
@@ -48,18 +48,18 @@
/** The prefetched next iterator entry, null at the end of iterating */
private Resource nextResult;
-
- private final JcrResourceTypeProvider defaultResourceTypeProvider;
+
+ private final JcrResourceTypeProvider[] resourceTypeProviders;
/**
* Creates an instance using the given resource manager and the nodes
* provided as a node iterator.
*/
public JcrNodeResourceIterator(ResourceResolver resourceResolver,
- NodeIterator nodes, JcrResourceTypeProvider defaultResourceTypeProvider) {
+ NodeIterator nodes, JcrResourceTypeProvider[] resourceTypeProviders) {
this.resourceResolver = resourceResolver;
this.nodes = nodes;
- this.defaultResourceTypeProvider = defaultResourceTypeProvider;
+ this.resourceTypeProviders = resourceTypeProviders;
this.nextResult = seek();
}
@@ -88,7 +88,7 @@
private Resource seek() {
while (nodes.hasNext()) {
try {
- return new JcrNodeResource(resourceResolver, nodes.nextNode(), defaultResourceTypeProvider);
+ return new JcrNodeResource(resourceResolver, nodes.nextNode(), resourceTypeProviders);
} catch (Throwable t) {
log.error(
"seek: Problem creating Resource for next node, skipping",
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java Tue Apr 15 06:17:44 2008
@@ -45,9 +45,12 @@
private final String resourceType;
- public JcrPropertyResource(ResourceResolver resourceResolver, String path,
- Property property, JcrResourceTypeProvider defaultResourceTypeProvider) throws RepositoryException {
- super(resourceResolver, path, defaultResourceTypeProvider);
+ public JcrPropertyResource(ResourceResolver resourceResolver,
+ String path,
+ Property property,
+ JcrResourceTypeProvider[] resourceTypeProviders)
+ throws RepositoryException {
+ super(resourceResolver, path, resourceTypeProviders);
this.property = property;
this.resourceType = getResourceTypeForNode(property.getParent())
+ "/" + property.getName();
@@ -69,35 +72,35 @@
try {
if (type == String.class) {
return (AdapterType) getProperty().getString();
-
+
} else if (type == Boolean.class) {
return (AdapterType) new Boolean(getProperty().getBoolean());
-
+
} else if (type == Long.class) {
return (AdapterType) new Long(getProperty().getLong());
-
+
} else if (type == Double.class) {
return (AdapterType) new Double(getProperty().getDouble());
-
+
} else if (type == Calendar.class) {
return (AdapterType) getProperty().getDate();
-
+
} else if (type == Value.class) {
return (AdapterType) getProperty().getValue();
-
+
} else if (type == Node.class
&& getProperty().getType() == PropertyType.REFERENCE) {
return (AdapterType) getProperty().getNode();
-
+
} else if (type == InputStream.class) {
return (AdapterType) getInputStream();
}
-
+
} catch (ValueFormatException vfe) {
log.info("adaptTo: Problem accessing the property value of {}: {}",
getPath(), vfe.getMessage());
log.debug("adaptTo: Cause", vfe);
-
+
} catch (RepositoryException re) {
log.info("adaptTo: Problem accessing the property " + getPath(), re);
}
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java Tue Apr 15 06:17:44 2008
@@ -47,11 +47,11 @@
private final Logger log = LoggerFactory.getLogger(getClass());
private final Session session;
- private final JcrResourceTypeProvider defaultResourceTypeProvider;
+ private final JcrResourceTypeProvider[] resourceTypeProviders;
- public JcrResourceProvider(Session session, JcrResourceTypeProvider defaultResourceTypeProvider) {
+ public JcrResourceProvider(Session session, JcrResourceTypeProvider[] resourceTypeProviders) {
this.session = session;
- this.defaultResourceTypeProvider = defaultResourceTypeProvider;
+ this.resourceTypeProviders = resourceTypeProviders;
}
// ---------- ResourceProvider interface ----------------------------------
@@ -78,16 +78,16 @@
}
public Iterator<Resource> listChildren(Resource parent) {
-
+
JcrItemResource parentItemResource;
-
+
// short cut for known JCR resources
if (parent instanceof JcrItemResource) {
-
+
parentItemResource = (JcrItemResource) parent;
} else {
-
+
// try to get the JcrItemResource for the parent path to list
// children
try {
@@ -96,7 +96,7 @@
} catch (RepositoryException re) {
parentItemResource = null;
}
-
+
}
// return children if there is a parent item resource, else null
@@ -130,14 +130,14 @@
log.debug(
"createResource: Found JCR Node Resource at path '{}'",
path);
- return new JcrNodeResource(resourceResolver, (Node) item, defaultResourceTypeProvider);
+ return new JcrNodeResource(resourceResolver, (Node) item, resourceTypeProviders);
}
log.debug(
"createResource: Found JCR Property Resource at path '{}'",
path);
return new JcrPropertyResource(resourceResolver, path,
- (Property) item, defaultResourceTypeProvider);
+ (Property) item, resourceTypeProviders);
}
log.debug("createResource: No JCR Item exists at path '{}'", path);
@@ -155,7 +155,7 @@
* <code>false</code> is returned ignoring access control.
*/
public boolean itemExists(String path) {
-
+
try {
return getSession().itemExists(path);
} catch (RepositoryException re) {
@@ -163,6 +163,6 @@
path, re.toString());
return false;
}
-
+
}
}
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java Tue Apr 15 06:17:44 2008
@@ -26,22 +26,23 @@
public class JcrResourceProviderEntry extends ResourceProviderEntry {
private final Session session;
-
- private final JcrResourceTypeProvider defaultResourceTypeProvider;
+
+ private final JcrResourceTypeProvider[] resourceTypeProviders;
public JcrResourceProviderEntry(Session session,
- ResourceProviderEntry[] entries, JcrResourceTypeProvider defaultResourceTypeProvider) {
- super("/", new JcrResourceProvider(session, defaultResourceTypeProvider), entries);
+ ResourceProviderEntry[] entries,
+ JcrResourceTypeProvider[] resourceTypeProviders) {
+ super("/", new JcrResourceProvider(session, resourceTypeProviders), entries);
this.session = session;
- this.defaultResourceTypeProvider = defaultResourceTypeProvider;
+ this.resourceTypeProviders = resourceTypeProviders;
}
public Session getSession() {
return session;
}
-
- public JcrResourceTypeProvider getDefaultResourceTypeProvider() {
- return defaultResourceTypeProvider;
+
+ public JcrResourceTypeProvider[] getResourceTypeProviders() {
+ return resourceTypeProviders;
}
}
Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/starresource/StarResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/starresource/StarResource.java?rev=648236&r1=648235&r2=648236&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/starresource/StarResource.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/starresource/StarResource.java Tue Apr 15 06:17:44 2008
@@ -32,18 +32,18 @@
* to *.something (SLING-344)
*/
public class StarResource extends SyntheticResource {
-
+
public final static String PATH_PATTERN = "/*.";
public final static String PATH_CLEAN_SUFFIX = "/*";
public final static String DEFAULT_RESOURCE_TYPE = "sling:syntheticStarResource";
-
+
@SuppressWarnings("serial")
static class SyntheticStarResourceException extends SlingException {
SyntheticStarResourceException(String reason, Throwable cause) {
super(reason, cause);
}
}
-
+
/** True if a StarResource should be used for the given request, if
* a real Resource was not found */
public static boolean appliesTo(HttpServletRequest request) {
@@ -59,16 +59,20 @@
public static boolean isStarResource(Resource res) {
return res.getPath().endsWith(PATH_CLEAN_SUFFIX);
}
-
- public StarResource(ResourceResolver resourceResolver, String path, JcrResourceTypeProvider drtp) throws SlingException {
+
+ public StarResource(ResourceResolver resourceResolver, String path, JcrResourceTypeProvider[] jcrProviders) throws SlingException {
super(resourceResolver, convertPath(path), null);
-
+
// The only way we can set a meaningful resource type is via the drtp
final Node n = new FakeNode(getPath());
String resourceType = null;
- if(drtp != null) {
+ if (jcrProviders != null) {
try {
- resourceType = drtp.getResourceTypeForNode(n);
+ int index = 0;
+ while ( resourceType == null && index < jcrProviders.length ) {
+ resourceType = jcrProviders[index].getResourceTypeForNode(n);
+ index++;
+ }
} catch(RepositoryException re) {
throw new SyntheticStarResourceException("getResourceTypeForNode failed", re);
}
@@ -89,7 +93,7 @@
}
return null;
}
-
+
/** Cleanup our path, for example /foo/*.html becomes /foo/* */
protected static String convertPath(String path) {
final int index = path.indexOf(PATH_PATTERN);
@@ -98,5 +102,5 @@
}
return path;
}
-
+
}
Added: incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImplTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImplTest.java?rev=648236&view=auto
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImplTest.java (added)
+++ incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImplTest.java Tue Apr 15 06:17:44 2008
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.jcr.resource.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import junit.framework.Assert;
+
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JMock;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.junit.runner.RunWith;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * Tests for the <code>JcrResourceResolverFactoryImpl</code>
+ */
+@RunWith(JMock.class)
+public class JcrResourceResolverFactoryImplTest {
+
+ protected Mockery context;
+
+ protected JcrResourceResolverFactoryImpl factory = new JcrResourceResolverFactoryImpl();
+
+ public JcrResourceResolverFactoryImplTest() {
+ this.context = new JUnit4Mockery();
+ }
+
+ protected Mockery getMockery() {
+ return this.context;
+ }
+
+ @org.junit.Test public void testJcrResourceTypeProviders() {
+ // component context is null, so everything is added to the delayed list
+ assertTrue(factory.delayedJcrResourceTypeProviders.isEmpty());
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(7, 1L, null));
+ assertFalse(factory.delayedJcrResourceTypeProviders.isEmpty());
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(8, 5L, null));
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(3, 2L, 100L));
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(5, 3L, 50L));
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(6, 4L, 50L));
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(2, 6L, 150L));
+ // lets set up the compnent context
+ final ComponentContext componentContext = this.getMockery().mock(ComponentContext.class);
+ this.getMockery().checking(new Expectations() {{
+ allowing(componentContext).locateService(with(any(String.class)), with(any(ServiceReference.class)));
+ will(returnValue(null));
+ }});
+ assertTrue(factory.jcrResourceTypeProviders.isEmpty());
+ factory.componentContext = componentContext;
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(4, 7L, 80L));
+ assertFalse(factory.jcrResourceTypeProviders.isEmpty());
+ factory.processDelayedJcrResourceTypeProviders();
+ factory.bindJcrResourceTypeProvider(new ServiceReferenceImpl(1, 8L, 180L));
+ assertTrue(factory.delayedJcrResourceTypeProviders.isEmpty());
+ assertFalse(factory.jcrResourceTypeProviders.isEmpty());
+ Assert.assertEquals(factory.jcrResourceTypeProviders.size(), 8);
+ final long[] ids = {8,6,2,7,3,4,1,5};
+ for(int i=0;i<8;i++) {
+ Assert.assertEquals(factory.jcrResourceTypeProviders.get(i).serviceId, ids[i]);
+ }
+ Assert.assertEquals(factory.getJcrResourceTypeProvider().length, 8);
+ }
+
+ /**
+ * Mock implementation of a service reference.
+ */
+ protected final class ServiceReferenceImpl implements ServiceReference {
+
+ protected final Long serviceId;
+ protected final Long ranking;
+ protected final int order;
+
+ public ServiceReferenceImpl(int order, Long serviceId, Long ranking) {
+ this.serviceId = serviceId;
+ this.ranking = ranking;
+ this.order = order;
+ }
+
+ public Bundle getBundle() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Object getProperty(String key) {
+ if ( Constants.SERVICE_ID.equals(key) ) {
+ return this.serviceId;
+ } else if ( Constants.SERVICE_RANKING.equals(key) ) {
+ return this.ranking;
+ }
+ return null;
+ }
+
+ public String[] getPropertyKeys() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Bundle[] getUsingBundles() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean isAssignableTo(Bundle bundle, String className) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+ }
+
+}
Propchange: incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImplTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImplTest.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url