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 2010/04/29 18:19:57 UTC

svn commit: r939362 - in /sling/trunk/bundles/servlets/resolver: ./ src/main/java/org/apache/sling/servlets/resolver/internal/ src/main/java/org/apache/sling/servlets/resolver/internal/helper/ src/test/java/org/apache/sling/servlets/resolver/internal/ ...

Author: cziegeler
Date: Thu Apr 29 16:19:57 2010
New Revision: 939362

URL: http://svn.apache.org/viewvc?rev=939362&view=rev
Log:
SLING-1512 : Make script execution paths configurable

Modified:
    sling/trunk/bundles/servlets/resolver/pom.xml
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
    sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
    sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorGetServletsTest.java
    sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java

Modified: sling/trunk/bundles/servlets/resolver/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/pom.xml?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/pom.xml (original)
+++ sling/trunk/bundles/servlets/resolver/pom.xml Thu Apr 29 16:19:57 2010
@@ -92,7 +92,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.osgi</artifactId>
-            <version>2.0.2-incubator</version>
+            <version>2.0.6</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java Thu Apr 29 16:19:57 2010
@@ -155,11 +155,18 @@ public class SlingServletResolver implem
 
     private static final String REF_SERVLET = "Servlet";
 
+    /**
+     * @scr.property values="/"
+     */
+    public static final String PROP_PATHS = "servletresolver.paths";
+
+    private static final String[] DEFAULT_PATHS = new String[] {"/"};
+
     /** @scr.reference */
     private ServletContext servletContext;
 
     /** @scr.reference */
-    private JcrResourceResolverFactory resourceResolverFactory;
+    private JcrResourceResolverFactory jcrResourceResolverFactory;
 
     /** @scr.reference */
     private SlingRepository repository;
@@ -174,8 +181,6 @@ public class SlingServletResolver implem
 
     private WorkspaceResourceResolver defaultScriptResolver;
 
-    private String[] searchPath;
-
     private Map<ServiceReference, ServiceRegistration> servletsByReference = new HashMap<ServiceReference, ServiceRegistration>();
 
     private List<ServiceReference> pendingServlets = new ArrayList<ServiceReference>();
@@ -193,8 +198,10 @@ public class SlingServletResolver implem
     // a request. This field is set on demand by getDefaultErrorServlet()
     private Servlet fallbackErrorServlet;
 
+    /** The script resolution cache. */
     private Map<AbstractResourceCollector, Servlet> cache;
 
+    /** Registration as event handler. */
     private ServiceRegistration eventHandlerReg;
 
     /**
@@ -216,6 +223,11 @@ public class SlingServletResolver implem
      */
     private boolean useDefaultWorkspace;
 
+    /**
+     * The allowed execution paths.
+     */
+    private String[] executionPaths;
+
     // ---------- ServletResolver interface -----------------------------------
 
     /**
@@ -328,6 +340,7 @@ public class SlingServletResolver implem
         return servlet;
     }
 
+    /** Internal method to resolve a servlet. */
     private Servlet resolveServlet(final ResourceResolver resolver,
             final Resource resource,
             final String scriptName) {
@@ -336,19 +349,20 @@ public class SlingServletResolver implem
         // first check whether the type of a resource is the absolute
         // path of a servlet (or script)
         if (scriptName.charAt(0) == '/') {
-            final Resource res = resolver.getResource(scriptName);
-            if (res != null) {
-                servlet = res.adaptTo(Servlet.class);
-            }
-            if (servlet != null && log.isDebugEnabled()) {
-                log.debug("Servlet {} found using absolute resource type {}", RequestUtil.getServletName(servlet),
-                                scriptName);
+            if ( this.isPathAllowed(scriptName) ) {
+                final Resource res = resolver.getResource(scriptName);
+                if (res != null) {
+                    servlet = res.adaptTo(Servlet.class);
+                }
+                if (servlet != null && log.isDebugEnabled()) {
+                    log.debug("Servlet {} found using absolute resource type {}", RequestUtil.getServletName(servlet),
+                                    scriptName);
+                }
             }
-        }
+        } else {
 
-        // the resource type is not absolute, so lets go for the deep search
-        if (servlet == null) {
-            final NamedScriptResourceCollector locationUtil = NamedScriptResourceCollector.create(scriptName, resource);
+            // the resource type is not absolute, so lets go for the deep search
+            final NamedScriptResourceCollector locationUtil = NamedScriptResourceCollector.create(scriptName, resource, this.executionPaths);
             servlet = getServlet(locationUtil, null, resolver);
 
             if (log.isDebugEnabled()) {
@@ -360,26 +374,33 @@ public class SlingServletResolver implem
     }
     // ---------- ScriptResolver interface ------------------------------------
 
-    public SlingScript findScript(ResourceResolver resourceResolver, String name) throws SlingException {
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptResolver#findScript(org.apache.sling.api.resource.ResourceResolver, java.lang.String)
+     */
+    public SlingScript findScript(final ResourceResolver resourceResolver, final String name)
+    throws SlingException {
 
         // is the path absolute
         SlingScript script = null;
         if (name.startsWith("/")) {
 
-            Resource resource = resourceResolver.getResource(name);
-            if (resource != null) {
-                script = resource.adaptTo(SlingScript.class);
+            if ( this.isPathAllowed(name) ) {
+                final Resource resource = resourceResolver.getResource(name);
+                if (resource != null) {
+                    script = resource.adaptTo(SlingScript.class);
+                }
             }
-
         } else {
 
             // relative script resolution against search path
-            String[] path = resourceResolver.getSearchPath();
+            final String[] path = resourceResolver.getSearchPath();
             for (int i = 0; script == null && i < path.length; i++) {
-                String scriptPath = path[i] + name;
-                Resource resource = resourceResolver.getResource(scriptPath);
-                if (resource != null) {
-                    script = resource.adaptTo(SlingScript.class);
+                final String scriptPath = path[i] + name;
+                if ( this.isPathAllowed(scriptPath) ) {
+                    final Resource resource = resourceResolver.getResource(scriptPath);
+                    if (resource != null) {
+                        script = resource.adaptTo(SlingScript.class);
+                    }
                 }
             }
 
@@ -425,7 +446,8 @@ public class SlingServletResolver implem
 
             // find a servlet for the status as the method name
             ResourceCollector locationUtil = new ResourceCollector(String.valueOf(status),
-                    ServletResolverConstants.ERROR_HANDLER_PATH, resource, scriptResolver.getWorkspaceName());
+                    ServletResolverConstants.ERROR_HANDLER_PATH, resource, scriptResolver.getWorkspaceName(),
+                    this.executionPaths);
             Servlet servlet = getServlet(locationUtil, request, scriptResolver);
 
             // fall back to default servlet if none
@@ -483,7 +505,8 @@ public class SlingServletResolver implem
             while (servlet == null && tClass != Object.class) {
                 // find a servlet for the simple class name as the method name
                 ResourceCollector locationUtil = new ResourceCollector(tClass.getSimpleName(),
-                        ServletResolverConstants.ERROR_HANDLER_PATH, resource, scriptResolver.getWorkspaceName());
+                        ServletResolverConstants.ERROR_HANDLER_PATH, resource, scriptResolver.getWorkspaceName(),
+                        this.executionPaths);
                 servlet = getServlet(locationUtil, request, scriptResolver);
 
                 // go to the base class
@@ -543,20 +566,19 @@ public class SlingServletResolver implem
         // first check whether the type of a resource is the absolute
         // path of a servlet (or script)
         if (type.charAt(0) == '/') {
-            final Resource res = resolver.getResource(type);
-            if (res != null) {
-                servlet = res.adaptTo(Servlet.class);
-            }
-            if (servlet != null && log.isDebugEnabled()) {
-                log
-                        .debug("Servlet {} found using absolute resource type {}", RequestUtil.getServletName(servlet),
-                                type);
+            if ( this.isPathAllowed(type) ) {
+                final Resource res = resolver.getResource(type);
+                if (res != null) {
+                    servlet = res.adaptTo(Servlet.class);
+                }
+                if (servlet != null && log.isDebugEnabled()) {
+                    log.debug("Servlet {} found using absolute resource type {}", RequestUtil.getServletName(servlet),
+                                    type);
+                }
             }
-        }
-
-        // the resource type is not absolute, so lets go for the deep search
-        if (servlet == null) {
-            final ResourceCollector locationUtil = ResourceCollector.create(request, resolver.getWorkspaceName());
+        } else {
+            // the resource type is not absolute, so lets go for the deep search
+            final ResourceCollector locationUtil = ResourceCollector.create(request, resolver.getWorkspaceName(), this.executionPaths);
             servlet = getServlet(locationUtil, request, resolver);
 
             if (log.isDebugEnabled()) {
@@ -685,7 +707,8 @@ public class SlingServletResolver implem
         final ResourceCollector locationUtil = new ResourceCollector(
             ServletResolverConstants.DEFAULT_ERROR_HANDLER_NAME,
             ServletResolverConstants.ERROR_HANDLER_PATH, resource,
-            scriptResolver.getWorkspaceName());
+            scriptResolver.getWorkspaceName(),
+            this.executionPaths);
         final Servlet servlet = getServlet(locationUtil, request,
             scriptResolver);
         if (servlet != null) {
@@ -760,7 +783,7 @@ public class SlingServletResolver implem
             scriptSession = sessionFromMap;
         }
 
-        scriptResolver = new WorkspaceResourceResolver(this.resourceResolverFactory.getResourceResolver(scriptSession),
+        scriptResolver = new WorkspaceResourceResolver(this.jcrResourceResolverFactory.getResourceResolver(scriptSession),
                 wspName);
         WorkspaceResourceResolver resolverFromMap = scriptResolvers.putIfAbsent(wspName, scriptResolver);
         if (resolverFromMap != null) {
@@ -794,60 +817,88 @@ public class SlingServletResolver implem
 
     // ---------- SCR Integration ----------------------------------------------
 
+    /**
+     * Activate this component.
+     */
     protected void activate(ComponentContext context) {
-
         // from configuration if available
-        Dictionary<?, ?> properties = context.getProperties();
+        final Dictionary<?, ?> properties = context.getProperties();
         Object servletRoot = properties.get(PROP_SERVLET_ROOT);
         if (servletRoot == null) {
             servletRoot = DEFAULT_SERVLET_ROOT;
         }
 
-        Collection<ServiceReference> refs;
+        final Collection<ServiceReference> refs;
         synchronized (this) {
 
             refs = pendingServlets;
             pendingServlets = new ArrayList<ServiceReference>();
 
-            searchPath = this.resourceResolverFactory.getResourceResolver(null).getSearchPath();
-
-            servletResourceProviderFactory = new ServletResourceProviderFactory(servletRoot, searchPath);
-
             // register servlets immediately from now on
             this.context = context;
 
-        }
-
-        this.useDefaultWorkspace = OsgiUtil.toBoolean(properties.get(PROP_USE_DEFAULT_WORKSPACE), DEFAULT_USE_DEFAULT_WORKSPACE);
-        this.useRequestWorkspace = OsgiUtil.toBoolean(properties.get(PROP_USE_REQUEST_WORKSPACE), DEFAULT_USE_REQUEST_WORKSPACE);
+            // workspace handling and resource resolver creation
+            this.useDefaultWorkspace = OsgiUtil.toBoolean(properties.get(PROP_USE_DEFAULT_WORKSPACE), DEFAULT_USE_DEFAULT_WORKSPACE);
+            this.useRequestWorkspace = OsgiUtil.toBoolean(properties.get(PROP_USE_REQUEST_WORKSPACE), DEFAULT_USE_REQUEST_WORKSPACE);
+
+            this.scriptSessions = new ConcurrentHashMap<String, Session>();
+            this.scriptResolvers = new ConcurrentHashMap<String, WorkspaceResourceResolver>();
+
+            String defaultWorkspaceProp = (String) properties.get(PROP_DEFAULT_SCRIPT_WORKSPACE);
+            if ( defaultWorkspaceProp != null && defaultWorkspaceProp.trim().length() == 0 ) {
+                defaultWorkspaceProp = null;
+            }
+            this.defaultScriptSession = createScriptSession(defaultWorkspaceProp);
+
+            // we load the workspaceName out of the session to ensure the value is
+            // non-null
+            this.defaultScriptWorkspaceName = this.defaultScriptSession.getWorkspace().getName();
+            this.defaultScriptResolver = new WorkspaceResourceResolver(jcrResourceResolverFactory
+                    .getResourceResolver(defaultScriptSession), defaultScriptWorkspaceName);
 
-        this.scriptSessions = new ConcurrentHashMap<String, Session>();
-        this.scriptResolvers = new ConcurrentHashMap<String, WorkspaceResourceResolver>();
+            servletResourceProviderFactory = new ServletResourceProviderFactory(servletRoot,
+                    this.defaultScriptResolver.getSearchPath());
+        }
+        createAllServlets(refs);
 
-        String defaultWorkspaceProp = (String) properties.get(PROP_DEFAULT_SCRIPT_WORKSPACE);
-        if ( defaultWorkspaceProp != null && defaultWorkspaceProp.trim().length() == 0 ) {
-            defaultWorkspaceProp = null;
-        }
-        this.defaultScriptSession = createScriptSession(defaultWorkspaceProp);
-
-        // we load the workspaceName out of the session to ensure the value is
-        // non-null
-        this.defaultScriptWorkspaceName = this.defaultScriptSession.getWorkspace().getName();
-        this.defaultScriptResolver = new WorkspaceResourceResolver(resourceResolverFactory
-                .getResourceResolver(defaultScriptSession), defaultScriptWorkspaceName);
+        // execution paths
+        this.executionPaths = OsgiUtil.toStringArray(properties.get(PROP_PATHS), DEFAULT_PATHS);
+        if ( this.executionPaths != null ) {
+            // if we find a string combination that basically allows all paths,
+            // we simply set the array to null
+            if ( this.executionPaths.length == 0 ) {
+                this.executionPaths = null;
+            } else {
+                boolean hasRoot = false;
+                for(int i = 0 ; i < this.executionPaths.length; i++) {
+                    final String path = this.executionPaths[i];
+                    if ( path == null || path.length() == 0 || path.equals("/") ) {
+                        hasRoot = true;
+                    }
+                    if ( !path.endsWith("/") ) {
+                        this.executionPaths[i] = path + '/';
+                    }
+                }
+                if ( hasRoot ) {
+                    this.executionPaths = null;
+                }
+            }
+        }
 
         // create cache - if a cache size is configured
         final int cacheSize = OsgiUtil.toInteger(properties.get(PROP_CACHE_SIZE), DEFAULT_CACHE_SIZE);
         if (cacheSize > 5) {
             this.cache = new ConcurrentHashMap<AbstractResourceCollector, Servlet>(cacheSize);
         }
-        createAllServlets(refs);
 
         // and finally register as event listener
-        this.eventHandlerReg = this.context.getBundleContext().registerService(EventHandler.class.getName(), this,
+        this.eventHandlerReg = context.getBundleContext().registerService(EventHandler.class.getName(), this,
                 properties);
     }
 
+    /**
+     * Deactivate this component.
+     */
     protected void deactivate(ComponentContext context) {
         // unregister event handler
         if (this.eventHandlerReg != null) {
@@ -857,10 +908,12 @@ public class SlingServletResolver implem
 
         // Copy the list of servlets first, to minimize the need for
         // synchronization
-        Collection<ServiceReference> refs;
+        final Collection<ServiceReference> refs;
         synchronized (this) {
             refs = new ArrayList<ServiceReference>(servletsByReference.keySet());
         }
+        // destroy all servlets
+        destroyAllServlets(refs);
 
         // destroy the fallback error handler servlet
         if (fallbackErrorServlet != null) {
@@ -873,8 +926,7 @@ public class SlingServletResolver implem
             }
         }
 
-        // destroy all servlets
-        destroyAllServlets(refs);
+        // close sessions
         if (this.scriptSessions != null && (!this.scriptSessions.isEmpty())) {
             for (Session session : this.scriptSessions.values()) {
                 session.logout();
@@ -958,7 +1010,7 @@ public class SlingServletResolver implem
             return false;
         }
 
-        Dictionary<String, Object> params = new Hashtable<String, Object>();
+        final Dictionary<String, Object> params = new Hashtable<String, Object>();
         params.put(ResourceProvider.ROOTS, provider.getServletPaths());
         params.put(Constants.SERVICE_DESCRIPTION, "ServletResourceProvider for Servlets at "
                 + Arrays.asList(provider.getServletPaths()));
@@ -1025,7 +1077,7 @@ public class SlingServletResolver implem
                 if (path.contains(":")) {
                     path = path.substring(path.indexOf(":") + 1);
                 }
-                final String[] searchPaths = this.searchPath;
+                final String[] searchPaths = this.defaultScriptResolver.getSearchPath();
                 int index = 0;
                 while (!flushCache && index < searchPaths.length) {
                     if (path.startsWith(searchPaths[index])) {
@@ -1060,4 +1112,8 @@ public class SlingServletResolver implem
         }
         return servletName;
     }
+
+    private boolean isPathAllowed(final String path) {
+        return AbstractResourceCollector.isPathAllowed(path, this.executionPaths);
+    }
 }

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java Thu Apr 29 16:19:57 2010
@@ -49,14 +49,18 @@ public abstract class AbstractResourceCo
 
     protected final String resourceSuperType;
 
+    protected final String[] executionPaths;
+
     public AbstractResourceCollector(final String baseResourceType,
             final String resourceType,
             final String resourceSuperType,
-            final String extension) {
+            final String extension,
+            final String[] executionPaths) {
         this.baseResourceType = baseResourceType;
         this.resourceType = resourceType;
         this.resourceSuperType = resourceSuperType;
         this.extension = extension;
+        this.executionPaths = executionPaths;
     }
 
     public final Collection<Resource> getServlets(ResourceResolver resolver) {
@@ -170,4 +174,21 @@ public abstract class AbstractResourceCo
         }
         return s1.equals(s2);
     }
+
+    protected boolean isPathAllowed(final String path) {
+        return isPathAllowed(path, this.executionPaths);
+    }
+
+    public static boolean isPathAllowed(final String path, final String[] executionPaths) {
+        if ( executionPaths == null ) {
+            return true;
+        }
+        for(final String prefix : executionPaths ) {
+            if ( path.startsWith(prefix) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java Thu Apr 29 16:19:57 2010
@@ -36,7 +36,9 @@ public class NamedScriptResourceCollecto
 
     private final String scriptName;
 
-    public static NamedScriptResourceCollector create(final String name, final Resource resource) {
+    public static NamedScriptResourceCollector create(final String name,
+            final Resource resource,
+            final String[] executionPaths) {
         final String resourceType;
         final String resourceSuperType;
         final String baseResourceType;
@@ -62,15 +64,17 @@ public class NamedScriptResourceCollecto
                 resourceType,
                 resourceSuperType,
                 scriptName,
-                extension);
+                extension,
+                executionPaths);
     }
 
     public NamedScriptResourceCollector(final String baseResourceType,
                               final String resourceType,
                               final String resourceSuperType,
                               final String scriptName,
-                              final String extension) {
-        super(baseResourceType, resourceType, resourceSuperType, extension);
+                              final String extension,
+                              final String[] executionPaths) {
+        super(baseResourceType, resourceType, resourceSuperType, extension, executionPaths);
         this.scriptName = scriptName;
         // create the hash code once
         final String key = baseResourceType + ':' + this.scriptName + ':' +
@@ -85,9 +89,11 @@ public class NamedScriptResourceCollecto
         // if extension is set, we first check for an exact script match
         if ( this.extension != null ) {
             final String path = location.getPath() + '/' + this.scriptName;
-            final Resource current = resolver.getResource(path);
-            if ( current != null ) {
-                this.addWeightedResource(resources, current, 0, WeightedResource.WEIGHT_EXTENSION);
+            if ( this.isPathAllowed(path) ) {
+                final Resource current = resolver.getResource(path);
+                if ( current != null ) {
+                    this.addWeightedResource(resources, current, 0, WeightedResource.WEIGHT_EXTENSION);
+                }
             }
         }
         // if the script name denotes a path we have to get the denoted resource
@@ -106,6 +112,9 @@ public class NamedScriptResourceCollecto
         while (children.hasNext()) {
             final Resource child = children.next();
 
+            if ( !this.isPathAllowed(child.getPath()) ) {
+                continue;
+            }
             final String currentScriptName = ResourceUtil.getName(child);
             final int lastDot = currentScriptName.lastIndexOf('.');
             if (lastDot < 0) {
@@ -115,7 +124,6 @@ public class NamedScriptResourceCollecto
 
             if ( currentScriptName.substring(0, lastDot).equals(name) ) {
                 this.addWeightedResource(resources, child, 0, WeightedResource.WEIGHT_PREFIX);
-                continue;
             }
         }
     }

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java Thu Apr 29 16:19:57 2010
@@ -78,8 +78,10 @@ public class ResourceCollector extends A
      * @return The <code>ResourceCollector</code> to find servlets and scripts
      *         suitable for handling the <code>request</code>.
      */
-    public static ResourceCollector create(SlingHttpServletRequest request, String workspaceName) {
-        return new ResourceCollector(request, workspaceName);
+    public static ResourceCollector create(final SlingHttpServletRequest request,
+            final String workspaceName,
+            final String[] executionPaths) {
+        return new ResourceCollector(request, workspaceName, executionPaths);
     }
 
     /**
@@ -95,11 +97,16 @@ public class ResourceCollector extends A
      *            is assumed.
      * @param resource the resource to invoke, the resource type and resource super type are taken from this resource.
      */
-    public ResourceCollector(String methodName, String baseResourceType, Resource resource, String workspaceName) {
+    public ResourceCollector(final String methodName,
+            final String baseResourceType,
+            final Resource resource,
+            final String workspaceName,
+            final String[] executionPaths) {
         super((baseResourceType != null ? baseResourceType : ServletResolverConstants.DEFAULT_SERVLET_NAME),
                 resource.getResourceType(),
                 resource.getResourceSuperType(),
-                null);
+                null,
+                executionPaths);
         this.methodName = methodName;
         this.requestSelectors = new String[0];
         this.numRequestSelectors = 0;
@@ -127,11 +134,14 @@ public class ResourceCollector extends A
      *            {@link org.apache.sling.servlets.resolver.internal.ServletResolverConstants#DEFAULT_SERVLET_NAME}
      *            is assumed.
      */
-    private ResourceCollector(SlingHttpServletRequest request, String workspaceName) {
+    private ResourceCollector(final SlingHttpServletRequest request,
+            final String workspaceName,
+            final String[] executionPaths) {
         super(ServletResolverConstants.DEFAULT_SERVLET_NAME,
                 request.getResource().getResourceType(),
                 request.getResource().getResourceSuperType(),
-                request.getRequestPathInfo().getExtension());
+                request.getRequestPathInfo().getExtension(),
+                executionPaths);
         this.methodName = request.getMethod();
 
         RequestPathInfo requestpaInfo = request.getRequestPathInfo();
@@ -168,6 +178,9 @@ public class ResourceCollector extends A
             while (children.hasNext()) {
                 Resource child = children.next();
 
+                if ( !this.isPathAllowed(child.getPath()) ) {
+                    continue;
+                }
                 String scriptName = ResourceUtil.getName(child);
                 int lastDot = scriptName.lastIndexOf('.');
                 if (lastDot < 0) {
@@ -238,10 +251,12 @@ public class ResourceCollector extends A
         // name nor extensions and selectors
         String path = location.getPath()
             + ServletResourceProviderFactory.SERVLET_PATH_EXTENSION;
-        location = location.getResourceResolver().getResource(path);
-        if (location != null) {
-            addWeightedResource(resources, location, 0,
-                WeightedResource.WEIGHT_LAST_RESSORT);
+        if ( this.isPathAllowed(path) ) {
+            location = location.getResourceResolver().getResource(path);
+            if (location != null) {
+                addWeightedResource(resources, location, 0,
+                    WeightedResource.WEIGHT_LAST_RESSORT);
+            }
         }
     }
 

Modified: sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java Thu Apr 29 16:19:57 2010
@@ -73,7 +73,11 @@ public class SlingServletResolverTest {
     private MockResourceResolver mockResourceResolver;
 
     @Before public void setUp() throws Exception {
-        mockResourceResolver = new MockResourceResolver();
+        mockResourceResolver = new MockResourceResolver() {
+            public void close() {
+                // nothing to do;
+            }
+        };
         mockResourceResolver.setSearchPath("/");
 
         final JcrResourceResolverFactory factory = new JcrResourceResolverFactory() {
@@ -100,7 +104,7 @@ public class SlingServletResolverTest {
         Class<?> resolverClass = servletResolver.getClass().getSuperclass();
 
         // set resource resolver factory
-        final Field resolverField = resolverClass.getDeclaredField("resourceResolverFactory");
+        final Field resolverField = resolverClass.getDeclaredField("jcrResourceResolverFactory");
         resolverField.setAccessible(true);
         resolverField.set(servletResolver, factory);
 

Modified: sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorGetServletsTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorGetServletsTest.java?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorGetServletsTest.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorGetServletsTest.java Thu Apr 29 16:19:57 2010
@@ -154,7 +154,7 @@ public class ResourceCollectorGetServlet
             pathMap.put(name, path);
         }
 
-        ResourceCollector lu = ResourceCollector.create(request, "default");
+        ResourceCollector lu = ResourceCollector.create(request, "default", null);
         Collection<Resource> res = lu.getServlets(request.getResource().getResourceResolver());
         Iterator<Resource> rIter = res.iterator();
 

Modified: sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java?rev=939362&r1=939361&r2=939362&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java Thu Apr 29 16:19:57 2010
@@ -67,7 +67,7 @@ public class ScriptSelectionTest extends
 
         // Create mock request and get scripts from ResourceCollector
         final MockSlingHttpServletRequest req = makeRequest(method, selectors, extension);
-        final ResourceCollector u = ResourceCollector.create(req, "default");
+        final ResourceCollector u = ResourceCollector.create(req, "default", null);
         final Collection<Resource> s = u.getServlets(req.getResource().getResourceResolver());
 
         if(expectedScript == null) {