You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2008/02/15 11:52:05 UTC

svn commit: r628008 - in /incubator/sling/trunk: api/src/main/java/org/apache/sling/api/resource/ jcr/resource/src/main/java/org/apache/sling/jcr/resource/ jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/ jcr/resource/src/main/java/or...

Author: fmeschbe
Date: Fri Feb 15 02:52:02 2008
New Revision: 628008

URL: http://svn.apache.org/viewvc?rev=628008&view=rev
Log:
SLING-246 replace Resource.getResourceProvider() by Resource.getResourceResolver()
and adapt uses and test cases

Added:
    incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java
Modified:
    incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/NonExistingResource.java
    incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/Resource.java
    incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceProvider.java
    incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceWrapper.java
    incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java
    incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/SyntheticResource.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/helper/ResourceProviderEntry.java
    incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResource.java
    incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceIterator.java
    incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceProvider.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/test/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntryTest.java
    incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java
    incubator/sling/trunk/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/IncludeTagHandler.java
    incubator/sling/trunk/sling/core/src/test/java/org/apache/sling/core/impl/request/SlingRequestPathInfoTest.java
    incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResource.java
    incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResourceProvider.java

Modified: incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/NonExistingResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/NonExistingResource.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/NonExistingResource.java (original)
+++ incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/NonExistingResource.java Fri Feb 15 02:52:02 2008
@@ -23,11 +23,15 @@
  */
 public final class NonExistingResource implements Resource {
 
+    private final ResourceResolver resourceResolver;
+
     private final String resourceURI;
 
     private final ResourceMetadata resourceMetadata;
 
-    public NonExistingResource(String resourceURI) {
+    public NonExistingResource(ResourceResolver resourceResolver,
+            String resourceURI) {
+        this.resourceResolver = resourceResolver;
         this.resourceURI = resourceURI;
 
         resourceMetadata = new ResourceMetadata();
@@ -46,12 +50,8 @@
         return resourceMetadata;
     }
 
-    /**
-     * Returns <code>null</code> because this resource instance is not
-     * reflected by a real resource by any provider.
-     */
-    public ResourceProvider getResourceProvider() {
-        return null;
+    public ResourceResolver getResourceResolver() {
+        return resourceResolver;
     }
 
     /**

Modified: incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/Resource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/Resource.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/Resource.java (original)
+++ incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/Resource.java Fri Feb 15 02:52:02 2008
@@ -69,8 +69,9 @@
     ResourceMetadata getResourceMetadata();
 
     /**
-     * Returns the ResourceProvider from which this resource has been retrieved.
+     * Returns the {@link ResourceResolver} from which this resource has been
+     * retrieved.
      */
-    ResourceProvider getResourceProvider();
+    ResourceResolver getResourceResolver();
 
 }

Modified: incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceProvider.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceProvider.java (original)
+++ incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceProvider.java Fri Feb 15 02:52:02 2008
@@ -59,28 +59,35 @@
      * is support for a JSR-311 style resource provider to support the
      * parametrized URL patterns.
      * 
+     * @param resourceResolver The {@link ResourceResolver} to which the
+     *            returned {@link Resource} is attached.
      * @return <code>null</code> If this provider does not have a resource for
      *         the path.
      * @throws SlingException may be thrown in case of any problem creating the
      *             <code>Resource</code> instance.
      */
-    Resource getResource(HttpServletRequest request, String path);
+    Resource getResource(ResourceResolver resourceResolver,
+            HttpServletRequest request, String path);
 
     /**
      * Returns a resource from this resource provider or <code>null</code> if
      * the resource provider cannot find it. The path should have one of the
      * {@link #getRoots()} strings as its prefix.
      * 
+     * @param resourceResolver The {@link ResourceResolver} to which the
+     *            returned {@link Resource} is attached.
      * @return <code>null</code> If this provider does not have a resource for
      *         the path.
      * @throws SlingException may be thrown in case of any problem creating the
      *             <code>Resource</code> instance.
      */
-    Resource getResource(String path);
+    Resource getResource(ResourceResolver resourceResolver, String path);
 
     /**
      * Returns an <code>Iterator</code> of {@link Resource} objects loaded
-     * from the children of the given <code>Resource</code>.
+     * from the children of the given <code>Resource</code>. The returned
+     * {@link Resource} instances are attached to the same
+     * {@link ResourceResolver} as the given <code>parent</code> resource.
      * <p>
      * This method is only called for resource providers whose root path list
      * contains an entry which is a prefix for the path of the parent resource.

Modified: incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceWrapper.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceWrapper.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceWrapper.java (original)
+++ incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/ResourceWrapper.java Fri Feb 15 02:52:02 2008
@@ -52,8 +52,8 @@
         return resource.getResourceMetadata();
     }
 
-    public ResourceProvider getResourceProvider() {
-        return resource.getResourceProvider();
+    public ResourceResolver getResourceResolver() {
+        return resource.getResourceResolver();
     }
 
     public String getResourceType() {

Modified: incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java (original)
+++ incubator/sling/trunk/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java Fri Feb 15 02:52:02 2008
@@ -25,6 +25,9 @@
  */
 public class SyntheticResource implements Resource {
 
+    /** The resoure resolver to which this resource is related */
+    private final ResourceResolver resourceResolver;
+
     /** The path of the synthetic resource */
     private final String path;
 
@@ -38,7 +41,9 @@
      * Creates a synthetic resource with the given <code>path</code> and
      * <code>resourceType</code>.
      */
-    public SyntheticResource(String path, String resourceType) {
+    public SyntheticResource(ResourceResolver resourceResolver, String path,
+            String resourceType) {
+        this.resourceResolver = resourceResolver;
         this.path = path;
         this.resourceType = resourceType;
         this.resourceMetadata = new ResourceMetadata();
@@ -62,11 +67,11 @@
     }
 
     /**
-     * Returns <code>null</code> because synthetic resources have no actual
-     * data and are not provided by any {@link ResourceProvider}.
+     * Returns the {@link ResourceResolver} with which this synthetic resource
+     * is related or <code>null</code> if none.
      */
-    public ResourceProvider getResourceProvider() {
-        return null;
+    public ResourceResolver getResourceResolver() {
+        return resourceResolver;
     }
 
     /**

Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/SyntheticResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/SyntheticResource.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/SyntheticResource.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/SyntheticResource.java Fri Feb 15 02:52:02 2008
@@ -20,7 +20,7 @@
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
-import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 
 /**
  * The <code>SyntheticResource</code> class is a simple implementation of the
@@ -70,7 +70,7 @@
     }
 
     /** synthetic resources have no provider */
-    public ResourceProvider getResourceProvider() {
+    public ResourceResolver getResourceResolver() {
         return null;
     }
     

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=628008&r1=628007&r2=628008&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 Fri Feb 15 02:52:02 2008
@@ -87,7 +87,7 @@
         Resource result = resolve(pathInfo);
 
         if (result == null) {
-            result = new NonExistingResource(pathInfo);
+            result = new NonExistingResource(this, pathInfo);
         }
 
         return result;
@@ -221,8 +221,7 @@
         try {
             QueryResult res = JcrResourceUtil.query(getSession(), query,
                 language);
-            return new JcrNodeResourceIterator(
-                rootProvider.getResourceProvider(), res.getNodes());
+            return new JcrNodeResourceIterator(this, res.getNodes());
         } catch (javax.jcr.query.InvalidQueryException iqe) {
             throw new QuerySyntaxException(iqe.getMessage(), query, language,
                 iqe);
@@ -345,7 +344,7 @@
      */
     protected Resource getResourceInternal(String path) {
 
-        Resource resource = rootProvider.getResource(path);
+        Resource resource = rootProvider.getResource(this, path);
         if (resource != null) {
             resource.getResourceMetadata().setResolutionPath(path);
             return resource;

Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntry.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntry.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntry.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntry.java Fri Feb 15 02:52:02 2008
@@ -24,6 +24,7 @@
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 
 /**
  * The <code>ResourceProviderEntry</code> class represents a node in the tree
@@ -109,8 +110,8 @@
      * @throws SlingException if an error occurrs trying to access an existing
      *             resource.
      */
-    public Resource getResource(String path) {
-        return getResource(path, path);
+    public Resource getResource(ResourceResolver resourceResolver, String path) {
+        return getResource(resourceResolver, path, path);
     }
 
     /**
@@ -131,9 +132,10 @@
      * @throws SlingException if an error occurrs trying to access an existing
      *             resource.
      */
-    private Resource getResource(String path, String fullPath) {
+    private Resource getResource(ResourceResolver resourceResolver,
+            String path, String fullPath) {
         if (path.equals(this.path)) {
-            return getResourceProvider().getResource(fullPath);
+            return getResourceProvider().getResource(resourceResolver, fullPath);
         } else if (path.startsWith(this.prefix)) {
             if (entries != null) {
 
@@ -141,7 +143,8 @@
                 path = path.substring(this.prefix.length());
 
                 for (ResourceProviderEntry entry : entries) {
-                    Resource test = entry.getResource(path, fullPath);
+                    Resource test = entry.getResource(resourceResolver, path,
+                        fullPath);
                     if (test != null) {
                         return test;
                     }
@@ -149,7 +152,7 @@
             }
 
             // no more specific provider, return mine
-            return getResourceProvider().getResource(fullPath);
+            return getResourceProvider().getResource(resourceResolver, fullPath);
         }
 
         // no match for my prefix, return null

Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResource.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResource.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResource.java Fri Feb 15 02:52:02 2008
@@ -28,7 +28,7 @@
 import org.apache.sling.adapter.SlingAdaptable;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
-import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.jcr.resource.internal.helper.Descendable;
 import org.osgi.framework.Bundle;
 import org.slf4j.Logger;
@@ -41,7 +41,7 @@
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final ResourceProvider resourceProvider;
+    private final ResourceResolver resourceResolver;
     
     private final Bundle bundle;
 
@@ -53,12 +53,12 @@
 
     private final ResourceMetadata metadata;
 
-    public static BundleResource getResource(ResourceProvider resourceProvider, Bundle bundle, String path) {
+    public static BundleResource getResource(ResourceResolver resourceResolver, Bundle bundle, String path) {
 
         // if the entry has no trailing slash, try to with a trailing
         // slash in case the entry would be a folder
         if (!path.endsWith("/")) {
-            BundleResource br = getResource(resourceProvider, bundle, path + "/");
+            BundleResource br = getResource(resourceResolver, bundle, path + "/");
             if (br != null) {
                 return br;
             }
@@ -67,15 +67,15 @@
         // has trailing slash or not a folder, try path itself
         URL entry = bundle.getEntry(path);
         if (entry != null) {
-            return new BundleResource(resourceProvider, bundle, path);
+            return new BundleResource(resourceResolver, bundle, path);
         }
 
         // the bundle does not contain the path
         return null;
     }
 
-    public BundleResource(ResourceProvider resourceProvider, Bundle bundle, String path) {
-        this.resourceProvider = resourceProvider;
+    public BundleResource(ResourceResolver resourceResolver, Bundle bundle, String path) {
+        this.resourceResolver = resourceResolver;
         this.bundle = bundle;
         this.path = path.endsWith("/")
                 ? path.substring(0, path.length() - 1)
@@ -100,8 +100,8 @@
         return metadata;
     }
 
-    public ResourceProvider getResourceProvider() {
-        return resourceProvider;
+    public ResourceResolver getResourceResolver() {
+        return resourceResolver;
     }
     
     @SuppressWarnings("unchecked")
@@ -170,7 +170,7 @@
         if (!isFile()) {
             URL descendent = bundle.getEntry(path + relPath);
             if (descendent != null) {
-                new BundleResource(resourceProvider, bundle, descendent.getPath());
+                new BundleResource(resourceResolver, bundle, descendent.getPath());
             }
         }
 

Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceIterator.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceIterator.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceIterator.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceIterator.java Fri Feb 15 02:52:02 2008
@@ -23,7 +23,7 @@
 import java.util.NoSuchElementException;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.osgi.framework.Bundle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,8 +38,8 @@
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    /** The bundle resource provider */
-    private ResourceProvider resourceProvider;
+    /** The bundle resource resolver */
+    private ResourceResolver resourceResolver;
     
     /** Bundle providing the entry resources */
     private Bundle bundle;
@@ -62,7 +62,7 @@
         if (parent.isFile()) {
 
             // if the parent is a file, the iterator is empty
-            this.resourceProvider = null;
+            this.resourceResolver = null;
             this.bundle = null;
             this.entries = null;
             this.prefixLength = 0;
@@ -72,7 +72,7 @@
             // trailing slash to enumerate children
             String parentPath = parent.getPath() + "/";
 
-            this.resourceProvider = parent.getResourceProvider();
+            this.resourceResolver = parent.getResourceResolver();
             this.bundle = parent.getBundle();
             // unchecked cast
             this.entries = parent.getBundle().getEntryPaths(parentPath);
@@ -121,7 +121,7 @@
             int slash = entry.indexOf('/', prefixLength);
             if (slash < 0 || slash == entry.length() - 1) {
                 log.debug("seek: Using entry {}", entry);
-                return new BundleResource(resourceProvider, bundle, entry);
+                return new BundleResource(resourceResolver, bundle, entry);
             }
 
             log.debug("seek: Ignoring entry {}", entry);

Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceProvider.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceProvider.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/bundle/BundleResourceProvider.java Fri Feb 15 02:52:02 2008
@@ -28,6 +28,7 @@
 import org.apache.sling.api.SlingException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.osgi.framework.Bundle;
 
 public class BundleResourceProvider implements ResourceProvider {
@@ -62,8 +63,9 @@
         return roots;
     }
 
-    public Resource getResource(HttpServletRequest request, String path) {
-        return getResource(path);
+    public Resource getResource(ResourceResolver resourceResolver,
+            HttpServletRequest request, String path) {
+        return getResource(resourceResolver, path);
     }
 
     /**
@@ -71,8 +73,8 @@
      * bundle of this provider. The JcrResourceResolver is ignored by this
      * implementation.
      */
-    public Resource getResource(String path) {
-        return BundleResource.getResource(this, bundle, path);
+    public Resource getResource(ResourceResolver resourceResolver, String path) {
+        return BundleResource.getResource(resourceResolver, bundle, path);
     }
 
     public Iterator<Resource> listChildren(Resource parent)

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=628008&r1=628007&r2=628008&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 Fri Feb 15 02:52:02 2008
@@ -39,7 +39,7 @@
 import org.apache.sling.adapter.SlingAdaptable;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
-import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.jcr.resource.internal.helper.Descendable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,7 +51,7 @@
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final ResourceProvider resourceProvider;
+    private final ResourceResolver resourceResolver;
 
     private final Node node;
 
@@ -61,9 +61,9 @@
 
     private final ResourceMetadata metadata;
 
-    JcrNodeResource(ResourceProvider resourceProvider, Node node)
+    JcrNodeResource(ResourceResolver resourceResolver, Node node)
             throws RepositoryException {
-        this.resourceProvider = resourceProvider;
+        this.resourceResolver = resourceResolver;
         this.node = node;
         this.path = node.getPath();
         metadata = new ResourceMetadata();
@@ -105,8 +105,8 @@
             + ", path=" + getPath();
     }
 
-    public ResourceProvider getResourceProvider() {
-        return resourceProvider;
+    public ResourceResolver getResourceResolver() {
+        return resourceResolver;
     }
 
     Node getNode() {
@@ -177,10 +177,10 @@
     public Resource getDescendent(String relPath) {
         try {
             if (node.hasNode(relPath)) {
-                return new JcrNodeResource(resourceProvider,
+                return new JcrNodeResource(resourceResolver,
                     node.getNode(relPath));
             } else if (node.hasProperty(relPath)) {
-                return new JcrPropertyResource(resourceProvider, getPath()
+                return new JcrPropertyResource(resourceResolver, getPath()
                     + "/" + relPath, node.getProperty(relPath));
             }
 

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=628008&r1=628007&r2=628008&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 Fri Feb 15 02:52:02 2008
@@ -25,7 +25,7 @@
 import javax.jcr.RepositoryException;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,8 +40,8 @@
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    /** resource manager used to create resources from nodes */
-    private ResourceProvider resourceProvider;
+    /** resource resolver used to create resources from nodes */
+    private ResourceResolver resourceResolver;
 
     /** underlying node iterator to be used for resources */
     private NodeIterator nodes;
@@ -57,20 +57,20 @@
         try {
             NodeIterator nodes = parent.getNode().getNodes();
 
-            this.resourceProvider = parent.getResourceProvider();
+            this.resourceResolver = parent.getResourceResolver();
             this.nodes = nodes;
             this.nextResult = seek();
         } catch (RepositoryException re) {
             log.error("<init>: Cannot get children of resource " + parent, re);
-            this.resourceProvider = null;
+            this.resourceResolver = null;
             this.nodes = null;
             this.nextResult = null;
         }
     }
 
-    public JcrNodeResourceIterator(ResourceProvider resourceProvider,
+    public JcrNodeResourceIterator(ResourceResolver resourceResolver,
             NodeIterator nodes) {
-        this.resourceProvider = resourceProvider;
+        this.resourceResolver = resourceResolver;
         this.nodes = nodes;
         this.nextResult = seek();
     }
@@ -100,7 +100,7 @@
     private Resource seek() {
         while (nodes.hasNext()) {
             try {
-                return new JcrNodeResource(resourceProvider, nodes.nextNode());
+                return new JcrNodeResource(resourceResolver, nodes.nextNode());
             } 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=628008&r1=628007&r2=628008&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 Fri Feb 15 02:52:02 2008
@@ -28,11 +28,11 @@
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
-import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 
 public class JcrPropertyResource implements Resource {
 
-    private final ResourceProvider resourceProvider;
+    private final ResourceResolver resourceResolver;
 
     private final String path;
 
@@ -42,9 +42,9 @@
 
     private final ResourceMetadata metadata;
 
-    public JcrPropertyResource(ResourceProvider resourceProvider, String path,
+    public JcrPropertyResource(ResourceResolver resourceResolver, String path,
             Property property) throws RepositoryException {
-        this.resourceProvider = resourceProvider;
+        this.resourceResolver = resourceResolver;
         this.path = path;
         this.property = property;
         this.resourceType = JcrNodeResource.getResourceTypeForNode(property.getParent())
@@ -65,8 +65,8 @@
         return resourceType;
     }
 
-    public ResourceProvider getResourceProvider() {
-        return resourceProvider;
+    public ResourceResolver getResourceResolver() {
+        return resourceResolver;
     }
 
     @SuppressWarnings("unchecked")

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=628008&r1=628007&r2=628008&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 Fri Feb 15 02:52:02 2008
@@ -32,6 +32,7 @@
 import org.apache.sling.api.SlingException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl;
 import org.apache.sling.jcr.resource.internal.helper.Descendable;
 import org.slf4j.Logger;
@@ -66,15 +67,16 @@
         return new String[] { "/" };
     }
 
-    public Resource getResource(HttpServletRequest request, String path)
-            throws SlingException {
-        return getResource(path);
+    public Resource getResource(ResourceResolver resourceResolver,
+            HttpServletRequest request, String path) throws SlingException {
+        return getResource(resourceResolver, path);
     }
 
-    public Resource getResource(String path) throws SlingException {
+    public Resource getResource(ResourceResolver resourceResolver, String path)
+            throws SlingException {
 
         try {
-            return createResource(path);
+            return createResource(resourceResolver, path);
         } catch (RepositoryException re) {
             throw new SlingException("Problem retrieving node based resource "
                 + path, re);
@@ -88,7 +90,7 @@
         }
 
         try {
-            parent = getResource(parent.getPath());
+            parent = getResource(parent.getResourceResolver(), parent.getPath());
             if (parent instanceof Descendable) {
                 return ((Descendable) parent).listChildren();
             }
@@ -121,20 +123,22 @@
      * @throws AccessControlException If the item really exists but this content
      *             manager's session has no read access to it.
      */
-    private Resource createResource(String path) throws RepositoryException {
+    private Resource createResource(ResourceResolver resourceResolver,
+            String path) throws RepositoryException {
         if (itemExists(path)) {
             Item item = getSession().getItem(path);
             if (item.isNode()) {
                 log.debug(
                     "createResource: Found JCR Node Resource at path '{}'",
                     path);
-                return new JcrNodeResource(this, (Node) item);
+                return new JcrNodeResource(resourceResolver, (Node) item);
             }
 
             log.debug(
                 "createResource: Found JCR Property Resource at path '{}'",
                 path);
-            return new JcrPropertyResource(this, path, (Property) item);
+            return new JcrPropertyResource(resourceResolver, path,
+                (Property) item);
         }
 
         log.debug("createResource: No JCR Item exists at path '{}'", path);

Modified: incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntryTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntryTest.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntryTest.java (original)
+++ incubator/sling/trunk/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/helper/ResourceProviderEntryTest.java Fri Feb 15 02:52:02 2008
@@ -19,6 +19,7 @@
 package org.apache.sling.jcr.resource.internal.helper;
 
 import java.util.Iterator;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -27,6 +28,7 @@
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 
 public class ResourceProviderEntryTest extends TestCase {
 
@@ -48,12 +50,13 @@
     }
 
     public void testRootProvider() {
-        assertNull(root.getResource("relpath"));
-        assertEquals(root, root.getResource("/"));
-        assertEquals(root, root.getResource("/rootel"));
-        assertEquals(root, root.getResource("/rootel/child"));
-        assertEquals(root, root.getResource("/apps/sling/sample/html.js"));
-        assertEquals(root, root.getResource("/apps/sling/microsling/html.js"));
+        assertNull(root.getResource(null, "relpath"));
+        assertEquals(root, root.getResource(null, "/"));
+        assertEquals(root, root.getResource(null, "/rootel"));
+        assertEquals(root, root.getResource(null, "/rootel/child"));
+        assertEquals(root, root.getResource(null, "/apps/sling/sample/html.js"));
+        assertEquals(root, root.getResource(null,
+            "/apps/sling/microsling/html.js"));
     }
 
     public void testAdd1Provider() {
@@ -61,15 +64,15 @@
         ResourceProvider first = new TestResourceProvider(firstPath);
         root.addResourceProvider(firstPath, first);
 
-        assertEquals(root, root.getResource("/"));
-        assertEquals(first, root.getResource("/rootel"));
-        assertEquals(first, root.getResource("/rootel/html.js"));
-        assertEquals(first, root.getResource("/rootel/child"));
-        assertEquals(first, root.getResource("/rootel/child/html.js"));
-        assertEquals(rootProvider,
-            root.getResource("/apps/sling/sample/html.js"));
-        assertEquals(rootProvider,
-            root.getResource("/apps/sling/microsling/html.js"));
+        assertEquals(root, root.getResource(null, "/"));
+        assertEquals(first, root.getResource(null, "/rootel"));
+        assertEquals(first, root.getResource(null, "/rootel/html.js"));
+        assertEquals(first, root.getResource(null, "/rootel/child"));
+        assertEquals(first, root.getResource(null, "/rootel/child/html.js"));
+        assertEquals(rootProvider, root.getResource(null,
+            "/apps/sling/sample/html.js"));
+        assertEquals(rootProvider, root.getResource(null,
+            "/apps/sling/microsling/html.js"));
     }
 
     public void testAdd3Providers() {
@@ -85,14 +88,15 @@
         root.addResourceProvider(secondPath, second);
         root.addResourceProvider(thirdPath, third);
 
-        assertEquals(rootProvider, root.getResource("/"));
-        assertEquals(first, root.getResource("/rootel"));
-        assertEquals(first, root.getResource("/rootel/html.js"));
-        assertEquals(second, root.getResource("/rootel/child"));
-        assertEquals(second, root.getResource("/rootel/child/html.js"));
-        assertEquals(third, root.getResource("/apps/sling/sample/html.js"));
-        assertEquals(rootProvider,
-            root.getResource("/apps/sling/microsling/html.js"));
+        assertEquals(rootProvider, root.getResource(null, "/"));
+        assertEquals(first, root.getResource(null, "/rootel"));
+        assertEquals(first, root.getResource(null, "/rootel/html.js"));
+        assertEquals(second, root.getResource(null, "/rootel/child"));
+        assertEquals(second, root.getResource(null, "/rootel/child/html.js"));
+        assertEquals(third,
+            root.getResource(null, "/apps/sling/sample/html.js"));
+        assertEquals(rootProvider, root.getResource(null,
+            "/apps/sling/microsling/html.js"));
     }
 
     public void testAdd3ProvidersReverse() {
@@ -108,14 +112,15 @@
         root.addResourceProvider(secondPath, second);
         root.addResourceProvider(firstPath, first);
 
-        assertEquals(rootProvider, root.getResource("/"));
-        assertEquals(first, root.getResource("/rootel"));
-        assertEquals(first, root.getResource("/rootel/html.js"));
-        assertEquals(second, root.getResource("/rootel/child"));
-        assertEquals(second, root.getResource("/rootel/child/html.js"));
-        assertEquals(third, root.getResource("/apps/sling/sample/html.js"));
-        assertEquals(rootProvider,
-            root.getResource("/apps/sling/microsling/html.js"));
+        assertEquals(rootProvider, root.getResource(null, "/"));
+        assertEquals(first, root.getResource(null, "/rootel"));
+        assertEquals(first, root.getResource(null, "/rootel/html.js"));
+        assertEquals(second, root.getResource(null, "/rootel/child"));
+        assertEquals(second, root.getResource(null, "/rootel/child/html.js"));
+        assertEquals(third,
+            root.getResource(null, "/apps/sling/sample/html.js"));
+        assertEquals(rootProvider, root.getResource(null,
+            "/apps/sling/microsling/html.js"));
     }
 
     public void testRemoveProviders() {
@@ -131,32 +136,38 @@
         root.addResourceProvider(secondPath, second);
         root.addResourceProvider(thirdPath, third);
 
-        assertEquals(rootProvider, root.getResource("/"));
-        assertEquals(first, root.getResource("/rootel/html.js"));
-        assertEquals(second, root.getResource("/rootel/child/html.js"));
+        assertEquals(rootProvider, root.getResource(null, "/"));
+        assertEquals(first, root.getResource(null, "/rootel/html.js"));
+        assertEquals(second, root.getResource(null, "/rootel/child/html.js"));
 
         root.removeResourceProvider(firstPath);
 
-        assertEquals(rootProvider, root.getResource("/"));
-        assertEquals(rootProvider, root.getResource("/rootel/html.js"));
-        assertEquals(second, root.getResource("/rootel/child/html.js"));
+        assertEquals(rootProvider, root.getResource(null, "/"));
+        assertEquals(rootProvider, root.getResource(null, "/rootel/html.js"));
+        assertEquals(second, root.getResource(null, "/rootel/child/html.js"));
 
         root.addResourceProvider(firstPath, first);
 
-        assertEquals(rootProvider, root.getResource("/"));
-        assertEquals(first, root.getResource("/rootel/html.js"));
-        assertEquals(second, root.getResource("/rootel/child/html.js"));
+        assertEquals(rootProvider, root.getResource(null, "/"));
+        assertEquals(first, root.getResource(null, "/rootel/html.js"));
+        assertEquals(second, root.getResource(null, "/rootel/child/html.js"));
     }
 
     protected void assertEquals(ResourceProvider resProvider, Resource res) {
-        assertEquals(resProvider, res.getResourceProvider());
+        assertEquals(resProvider, res.getResourceResolver());
     }
-    
-    protected void assertEquals(ResourceProviderEntry resProviderEntry, Resource res) {
-        assertEquals(resProviderEntry.getResourceProvider(), res.getResourceProvider());
+
+    protected void assertEquals(ResourceProviderEntry resProviderEntry,
+            Resource res) {
+        assertEquals(resProviderEntry.getResourceProvider(),
+            res.getResourceResolver());
     }
 
-    private static class TestResourceProvider implements ResourceProvider {
+    // The test provider implements the ResourceResolver interface and sets
+    // itself on the returned resource. This way the assertEquals methods above
+    // may identify whether a resource has been returned from the expected
+    // ResourceProvider
+    private static class TestResourceProvider implements ResourceProvider, ResourceResolver {
 
         private final String[] roots;
 
@@ -164,11 +175,12 @@
             roots = new String[] { root };
         }
 
-        public Resource getResource(HttpServletRequest request, String path) {
-            return null;
+        public Resource getResource(ResourceResolver resolver,
+                HttpServletRequest request, String path) {
+            return getResource(resolver, path);
         }
 
-        public Resource getResource(String path) {
+        public Resource getResource(ResourceResolver resolver, String path) {
             return new TestResource(path, this);
         }
 
@@ -179,18 +191,57 @@
         public Iterator<Resource> listChildren(Resource parent) {
             return null;
         }
+
+        // just dummy implementation to mark our resources for the tests
+        public Iterator<Resource> findResources(String query, String language) {
+            return null;
+        }
+
+        public Resource getResource(String path) {
+            return null;
+        }
+
+        public Resource getResource(Resource base, String path) {
+            return null;
+        }
+
+        public String[] getSearchPath() {
+            return null;
+        }
+
+        public String map(String resourcePath) {
+            return null;
+        }
+
+        public Iterator<Map<String, Object>> queryResources(String query,
+                String language) {
+            return null;
+        }
+
+        public Resource resolve(HttpServletRequest request) {
+            return null;
+        }
+
+        public Resource resolve(String absPath) {
+            return null;
+        }
+
+        public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+            return null;
+        }
     }
-    
+
     private static class TestResource implements Resource {
 
         private final String path;
-        private final ResourceProvider resourceProvider;
 
-        public TestResource(String path, ResourceProvider resourceProvider) {
+        private final ResourceResolver resourceResolver;
+
+        public TestResource(String path, ResourceResolver resourceResolver) {
             this.path = path;
-            this.resourceProvider = resourceProvider;
+            this.resourceResolver = resourceResolver;
         }
-        
+
         public String getPath() {
             return path;
         }
@@ -199,8 +250,8 @@
             return null;
         }
 
-        public ResourceProvider getResourceProvider() {
-            return resourceProvider;
+        public ResourceResolver getResourceResolver() {
+            return resourceResolver;
         }
 
         public String getResourceType() {
@@ -210,6 +261,6 @@
         public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
             return null;
         }
-        
+
     }
 }

Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java (original)
+++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java Fri Feb 15 02:52:02 2008
@@ -23,9 +23,12 @@
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.scripting.javascript.helper.SlingWrapper;
 import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
 import org.mozilla.javascript.ScriptRuntime;
+import org.mozilla.javascript.Scriptable;
 import org.mozilla.javascript.ScriptableObject;
 import org.mozilla.javascript.Undefined;
+import org.mozilla.javascript.Wrapper;
 
 /**
  * Resource in JavaScript has following signature: [Object] getData(); [Object]
@@ -60,17 +63,11 @@
     }
 
     public Object jsFunction_getObject() {
-        Object object = resource.adaptTo(Object.class);
-        return (object != null) ? object : Undefined.instance;
+        return toJS(resource.adaptTo(Object.class));
     }
 
     public Object jsFunction_getNode() {
-        Node node = resource.adaptTo(Node.class);
-        Object result = Undefined.instance;
-        if(node != null) {
-            result = ScriptRuntime.toObject(this,node);
-        }
-        return result;
+        return toJS(resource.adaptTo(Node.class));
     }
 
     /** alias for getNode */
@@ -86,20 +83,20 @@
         return this.jsFunction_getResourceType();
     }
 
-    public Object jsFunction_getPath() {
-        return Context.javaToJS(resource.getPath(), this);
+    public String jsFunction_getPath() {
+        return resource.getPath();
     }
 
-    public Object jsGet_path() {
+    public String jsGet_path() {
         return this.jsFunction_getPath();
     }
 
     public Object jsFunction_getMetadata() {
-        return resource.getResourceMetadata();
+        return toJS(resource.getResourceMetadata());
     }
 
     public Object jsGet_meta() {
-        return resource.getResourceMetadata();
+        return jsFunction_getMetadata();
     }
     
     // TODO a wrapper would be more convenient than an Iterator,
@@ -107,7 +104,54 @@
     // proper wrapping of its elements: javascript constructor
     // not found when scope = ScriptableItemMap
     public Iterator<Resource> jsGet_children() {
-        return resource.getResourceProvider().listChildren(resource);
+        return resource.getResourceResolver().listChildren(resource);
+    }
+    
+    public Object jsFunction_getResourceResolver() {
+        return toJS(resource.getResourceResolver());
+    }
+    
+    public Object jsGet_resourceResolver() {
+        return jsFunction_getResourceResolver();
+    }
+
+    public static Object jsFunction_adaptTo(Context cx, Scriptable thisObj,
+            Object[] args, Function funObj) {
+
+        // get and unwrap the argument
+        Object arg = (args.length > 0) ? args[0] : null;
+        while (arg instanceof Wrapper) {
+            arg = ((Wrapper) arg).unwrap();
+        }
+        
+        // try to get the Class object for the argument
+        Class<?> adapter = null;
+        if (arg instanceof Class) {
+            
+            adapter = (Class<?>) arg;
+            
+        } else if (arg != null && arg != Undefined.instance) {
+            
+            // try loading the class from the String
+            String className = ScriptRuntime.toString(arg);
+            try {
+                ClassLoader loader = Thread.currentThread().getContextClassLoader();
+                if (loader == null) {
+                    loader = thisObj.getClass().getClassLoader();
+                }
+                adapter = Class.forName(className, true, loader);
+            } catch (Exception e) {
+                // TODO: log exception
+            }
+            
+        }
+        
+        if (adapter != null) {
+            ScriptableResource sr = (ScriptableResource) thisObj;
+            return sr.toJS(sr.resource.adaptTo(adapter));
+        }
+        
+        return Undefined.instance;
     }
 
     @Override
@@ -126,4 +170,13 @@
         return resource;
     }
 
+    //---------- Internal helper ----------------------------------------------
+    
+    private Object toJS(Object javaObject) {
+        if (javaObject == null) {
+            return Undefined.instance;
+        }
+        
+        return ScriptRuntime.toObject(this, javaObject);
+    }
 }

Added: incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java?rev=628008&view=auto
==============================================================================
--- incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java (added)
+++ incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableResourceTest.java Fri Feb 15 02:52:02 2008
@@ -0,0 +1,144 @@
+/*
+ * 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.scripting.wrapper;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.scripting.RepositoryScriptingTestBase;
+import org.apache.sling.scripting.ScriptEngineHelper;
+import org.mozilla.javascript.Undefined;
+import org.mozilla.javascript.Wrapper;
+
+public class ScriptableResourceTest extends RepositoryScriptingTestBase {
+
+    private Node node;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        node = getNewNode();
+    }
+
+    public void testDefaultValuePath() throws Exception {
+        final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
+        data.put("resource", new TestResource(node));
+
+        // the path of the resource
+        assertEquals(node.getPath(), script.evalToString("out.print(resource)",
+            data));
+        assertEquals(node.getPath(), script.eval("resource.path", data));
+        assertEquals(node.getPath(), script.eval("resource.getPath()", data));
+    }
+
+    public void testNode() throws Exception {
+        final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
+        data.put("resource", new TestResource(node));
+
+        // the path of the resource
+        assertEquals(node, script.eval("resource.node", data));
+        assertEquals(node, script.eval("resource.getNode()", data));
+    }
+
+    public void testAdaptToNode() throws Exception {
+        final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
+        data.put("resource", new TestResource(node));
+
+        // the node to which the resource adapts
+        assertEquals(node, script.eval("resource.adaptTo('javax.jcr.Node')",
+            data));
+        assertEquals(node, script.eval(
+            "resource.adaptTo(Packages.javax.jcr.Node)", data));
+    }
+
+    public void testAdaptToNothing() throws Exception {
+        final ScriptEngineHelper.Data data = new ScriptEngineHelper.Data();
+        data.put("resource", new TestResource(node));
+
+        // the node to which the resource adapts
+        assertEquals(Undefined.instance,
+            script.eval("resource.adaptTo()", data));
+        assertEquals(Undefined.instance, script.eval("resource.adaptTo(null)",
+            data));
+        assertEquals(Undefined.instance, script.eval(
+            "resource.adaptTo(undefined)", data));
+        assertEquals(Undefined.instance, script.eval(
+            "resource.adaptTo(Packages.java.util.Date)", data));
+    }
+
+    private void assertEquals(Node expected, Object actual) {
+        while (actual instanceof Wrapper) {
+            actual = ((Wrapper) actual).unwrap();
+        }
+
+        super.assertEquals(expected, actual);
+    }
+
+    private static class TestResource implements Resource {
+
+        private final Node node;
+
+        private final String path;
+
+        private final String resourceType;
+
+        private final ResourceMetadata metadata;
+
+        TestResource(Node node) throws RepositoryException {
+            this.node = node;
+            this.path = node.getPath();
+            this.resourceType = node.getPrimaryNodeType().getName();
+            this.metadata = new ResourceMetadata();
+            this.metadata.setResolutionPath(this.path);
+        }
+
+        public String getPath() {
+            return path;
+        }
+
+        public ResourceMetadata getResourceMetadata() {
+            return metadata;
+        }
+
+        public ResourceResolver getResourceResolver() {
+            // none, don't care
+            return null;
+        }
+
+        public String getResourceType() {
+            return resourceType;
+        }
+
+        @SuppressWarnings("unchecked")
+        public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+            if (type == Node.class || type == Item.class) {
+                return (AdapterType) node;
+            }
+
+            return null;
+        }
+
+    }
+
+}

Modified: incubator/sling/trunk/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/IncludeTagHandler.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/IncludeTagHandler.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/IncludeTagHandler.java (original)
+++ incubator/sling/trunk/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/IncludeTagHandler.java Fri Feb 15 02:52:02 2008
@@ -94,7 +94,8 @@
                 Resource tmp = request.getResourceResolver().resolve(path);
                 if (tmp == null && resourceType != null) {
                     opts = null; // not needed
-                    resource = new SyntheticResource(path, resourceType);
+                    resource = new SyntheticResource(
+                        request.getResourceResolver(), path, resourceType);
                 }
             }
         }

Modified: incubator/sling/trunk/sling/core/src/test/java/org/apache/sling/core/impl/request/SlingRequestPathInfoTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/sling/core/src/test/java/org/apache/sling/core/impl/request/SlingRequestPathInfoTest.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/sling/core/src/test/java/org/apache/sling/core/impl/request/SlingRequestPathInfoTest.java (original)
+++ incubator/sling/trunk/sling/core/src/test/java/org/apache/sling/core/impl/request/SlingRequestPathInfoTest.java Fri Feb 15 02:52:02 2008
@@ -21,7 +21,7 @@
 import org.apache.sling.api.request.RequestPathInfo;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
-import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 
 /** Test the SlingRequestPathInfo class */
 public class SlingRequestPathInfoTest extends TestCase {
@@ -287,7 +287,7 @@
             return metadata;
         }
 
-        public ResourceProvider getResourceProvider() {
+        public ResourceResolver getResourceResolver() {
             return null;
         }
         

Modified: incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResource.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResource.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResource.java (original)
+++ incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResource.java Fri Feb 15 02:52:02 2008
@@ -24,10 +24,11 @@
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 
-public class ServletResource extends SlingAdaptable implements Resource {
+class ServletResource extends SlingAdaptable implements Resource {
 
-    private final ResourceProvider resourceProvider;
+    private final ResourceResolver resourceResolver;
 
     private final Servlet servlet;
 
@@ -35,9 +36,9 @@
 
     private final ResourceMetadata metadata;
 
-    public ServletResource(ResourceProvider resourceProvider, Servlet servlet,
+    ServletResource(ResourceResolver resourceResolver, Servlet servlet,
             String path) {
-        this.resourceProvider = resourceProvider;
+        this.resourceResolver = resourceResolver;
         this.servlet = servlet;
         this.path = path;
 
@@ -49,8 +50,8 @@
         return metadata;
     }
 
-    public ResourceProvider getResourceProvider() {
-        return resourceProvider;
+    public ResourceResolver getResourceResolver() {
+        return resourceResolver;
     }
 
     public String getResourceType() {

Modified: incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResourceProvider.java?rev=628008&r1=628007&r2=628008&view=diff
==============================================================================
--- incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResourceProvider.java (original)
+++ incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/resource/ServletResourceProvider.java Fri Feb 15 02:52:02 2008
@@ -25,23 +25,29 @@
 import static org.apache.sling.servlet.resolver.ServletResolverConstants.SLING_SERVLET_SELECTORS;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
 
 import javax.servlet.Servlet;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.osgi.commons.OsgiUtil;
 import org.apache.sling.servlet.resolver.helper.PathSupport;
 import org.osgi.framework.ServiceReference;
 
 public class ServletResourceProvider implements ResourceProvider {
 
-    private Map<String, ServletResource> servletMap;
+    private final Servlet servlet;
+
+    private Set<String> resourcePaths;
 
     public static ServletResourceProvider create(ServiceReference ref,
             Servlet servlet, String servletRoot) {
@@ -49,7 +55,7 @@
         // check whether explicit paths are set
         String[] paths = OsgiUtil.toStringArray(ref.getProperty(SLING_SERVLET_PATHS));
         if (paths != null && paths.length > 0) {
-            for (int i=0; i < paths.length; i++) {
+            for (int i = 0; i < paths.length; i++) {
                 if (!paths[i].startsWith("/")) {
                     paths[i] = servletRoot + paths[i];
                 }
@@ -68,29 +74,29 @@
         // check for selectors
         String[] selectors = OsgiUtil.toStringArray(ref.getProperty(SLING_SERVLET_SELECTORS));
         if (selectors == null) {
-            selectors = new String[]{ null };
+            selectors = new String[] { null };
         }
-        
+
         // we have types and expect extensions and/or methods
         String[] extensions = OsgiUtil.toStringArray(ref.getProperty(SLING_SERVLET_EXTENSIONS));
         String[] methods = OsgiUtil.toStringArray(ref.getProperty(SLING_SERVLET_METHODS));
-//        if ((extensions == null || extensions.length == 0)
-//            && (methods == null || methods.length == 0)) {
-//            // TODO: should log, why we ignore this servlet
-//            return null;
-//        }
+        // if ((extensions == null || extensions.length == 0)
+        // && (methods == null || methods.length == 0)) {
+        // // TODO: should log, why we ignore this servlet
+        // return null;
+        // }
 
         List<String> pathList = new ArrayList<String>();
         for (String type : types) {
-            
+
             // ensure namespace prefixes are converted to slashes
             type = PathSupport.toPath(type);
-            
+
             // make absolute if relative
             if (!type.startsWith("/")) {
                 type = servletRoot + type;
             }
-            
+
             // ensure trailing slash for full path building
             if (!type.endsWith("/")) {
                 type += "/";
@@ -98,14 +104,14 @@
 
             // add entries for each selector combined with each ext and method
             for (String selector : selectors) {
-                
+
                 String selPath = type;
                 if (selector != null && selector.length() > 0) {
                     selPath += selector.replace('.', '/') + "/";
                 }
 
                 boolean pathAdded = false;
-                
+
                 // create paths with extensions
                 if (extensions != null) {
                     for (String ext : extensions) {
@@ -121,10 +127,10 @@
                         pathAdded = true;
                     }
                 }
-                
+
                 // if neither methods nore extensions were added
                 if (!pathAdded) {
-                    pathList.add(selPath.substring(0, selPath.length()-1));
+                    pathList.add(selPath.substring(0, selPath.length() - 1));
                 }
             }
         }
@@ -134,28 +140,73 @@
     }
 
     private ServletResourceProvider(String[] paths, Servlet servlet) {
-        servletMap = new HashMap<String, ServletResource>();
-        for (String path : paths) {
-            ServletResource res = new ServletResource(this, servlet, path);
-            servletMap.put(path, res);
-        }
+        this.servlet = servlet;
+        this.resourcePaths = new HashSet<String>(Arrays.asList(paths));
     }
 
-    public Resource getResource(HttpServletRequest request, String path) {
-        return getResource(path);
+    public Resource getResource(ResourceResolver resourceResolver,
+            HttpServletRequest request, String path) {
+        return getResource(resourceResolver, path);
     }
 
-    public Resource getResource(String path) {
-        return servletMap.get(path);
-    }
+    public Resource getResource(ResourceResolver resourceResolver, String path) {
+        if (resourcePaths.contains(path)) {
+            return new ServletResource(resourceResolver, servlet, path);
+        }
 
-    public Iterator<Resource> listChildren(Resource parent) {
-        // the resource provider only has exact paths no children
         return null;
     }
 
+    public Iterator<Resource> listChildren(final Resource parent) {
+        return new Iterator<Resource>() {
+
+            private Iterator<String> pathIter;
+
+            private String parentPath;
+
+            private Resource next;
+
+            {
+                pathIter = resourcePaths.iterator();
+                parentPath = parent.getPath() + "/";
+                next = seek();
+            }
+
+            public boolean hasNext() {
+                return next != null;
+            }
+
+            public Resource next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+
+                Resource result = next;
+                next = seek();
+                return result;
+            }
+
+            public void remove() {
+                throw new UnsupportedOperationException("remove");
+            }
+
+            private Resource seek() {
+                while (pathIter.hasNext()) {
+                    String path = pathIter.next();
+                    if (path.startsWith(parentPath)
+                        && path.indexOf('/', parentPath.length()) < 0) {
+                        return new ServletResource(
+                            parent.getResourceResolver(), servlet, path);
+                    }
+                }
+
+                return null;
+            }
+
+        };
+    }
+
     public String[] getSerlvetPaths() {
-        return servletMap.keySet().toArray(
-            new String[servletMap.keySet().size()]);
+        return resourcePaths.toArray(new String[resourcePaths.size()]);
     }
 }