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