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/27 15:39:24 UTC

svn commit: r631604 - in /incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver: SlingServletResolver.java resource/ServletResource.java resource/ServletResourceProvider.java

Author: fmeschbe
Date: Wed Feb 27 06:39:22 2008
New Revision: 631604

URL: http://svn.apache.org/viewvc?rev=631604&view=rev
Log:
SLING-278 Adapt ServletResource to new Resource.getResourceSuperType method and
enhance servlet/script search to include resource super types.

Modified:
    incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/SlingServletResolver.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/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/SlingServletResolver.java?rev=631604&r1=631603&r2=631604&view=diff
==============================================================================
--- incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/SlingServletResolver.java (original)
+++ incubator/sling/trunk/sling/servlet-resolver/src/main/java/org/apache/sling/servlet/resolver/SlingServletResolver.java Wed Feb 27 06:39:22 2008
@@ -49,13 +49,15 @@
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.scripting.SlingScript;
 import org.apache.sling.api.scripting.SlingScriptResolver;
+import org.apache.sling.api.servlets.HttpConstants;
 import org.apache.sling.api.servlets.ServletResolver;
 import org.apache.sling.core.servlets.AbstractServiceReferenceConfig;
 import org.apache.sling.core.servlets.ErrorHandler;
+import org.apache.sling.jcr.resource.JcrResourceUtil;
 import org.apache.sling.osgi.commons.OsgiUtil;
 import org.apache.sling.servlet.resolver.defaults.DefaultErrorHandlerServlet;
 import org.apache.sling.servlet.resolver.defaults.DefaultServlet;
-import org.apache.sling.servlet.resolver.helper.PathSupport;
+import org.apache.sling.servlet.resolver.helper.PathIterator;
 import org.apache.sling.servlet.resolver.helper.SlingServletConfig;
 import org.apache.sling.servlet.resolver.resource.ServletResourceProvider;
 import org.osgi.framework.ServiceReference;
@@ -66,7 +68,7 @@
 
 /**
  * The <code>SlingServletResolver</code> TODO
- *
+ * 
  * @scr.component label="%servletresolver.name"
  *                description="%servletresolver.description"
  * @scr.property name="service.description" value="Sling Servlet Resolver and
@@ -125,32 +127,56 @@
 
         ResourceResolver resolver = request.getResourceResolver();
         String[] path = resolver.getSearchPath();
-        String baseName = PathSupport.getScriptBaseName(request);
+        String baseName = getScriptBaseName(request);
 
         // (1) default script name and according to resource type and selectors
-        Iterator<String> pathIterator = PathSupport.getPathIterator(request,
-            path);
+        PathIterator pathIterator = new PathIterator(
+            request.getResource().getResourceType(),
+            request.getRequestPathInfo().getSelectorString(), path);
         servlet = getServlet(resolver, pathIterator, baseName);
 
         // (2) GET/HEAD and according to resource type and selectors
         if (servlet == null && !baseName.equals(request.getMethod())) {
-            pathIterator = PathSupport.getPathIterator(request, path);
+            pathIterator.reset();
             servlet = getServlet(resolver, pathIterator, request.getMethod());
         }
 
-        // (3) default script name and default servlet name and selectors
+        // (3) Repeate steps (1) and (2) for the super type hierarchy
         if (servlet == null) {
-            pathIterator = PathSupport.getPathIterator(DEFAULT_SERVLET_NAME, path);
-            servlet = getServlet(resolver, pathIterator, baseName);
+            String resourceSuperType = request.getResource().getResourceSuperType();
+            while (resourceSuperType != null && servlet == null) {
+
+                // (3a) default script name and according to resource type and selectors
+                pathIterator.reset(resourceSuperType);
+                servlet = getServlet(resolver, pathIterator, baseName);
+
+                // (3b) GET/HEAD and according to resource type and selectors
+                if (servlet == null && !baseName.equals(request.getMethod())) {
+                    pathIterator.reset();
+                    servlet = getServlet(resolver, pathIterator, request.getMethod());
+                }
+
+                // the next supertype or null
+                if (servlet == null) {
+                    resourceSuperType = JcrResourceUtil.getResourceSuperType(
+                        resolver, resourceSuperType);
+                }
+            }
         }
+        
+        // (4) default script name and default servlet name and selectors
+        if (servlet == null) {
+            pathIterator.reset(DEFAULT_SERVLET_NAME);
+            servlet = getServlet(resolver, pathIterator, baseName);
 
-        // (4) GET/HEAD and default servlet name and selectors
-        if (servlet == null && !baseName.equals(request.getMethod())) {
-            pathIterator = PathSupport.getPathIterator(DEFAULT_SERVLET_NAME, path);
-            servlet = getServlet(resolver, pathIterator, request.getMethod());
+            // (5) GET/HEAD and default servlet name and selectors
+            if (servlet == null && !baseName.equals(request.getMethod())) {
+                pathIterator.reset();
+                servlet = getServlet(resolver, pathIterator, request.getMethod());
+            }
         }
 
-        // (5) last resort, use the core bundle default servlet
+        // (6) last resort, use the core bundle default servlet
         if (servlet == null) {
             servlet = getCoreDefaultServlet();
         }
@@ -209,7 +235,8 @@
     // ---------- ErrorHandler interface --------------------------------------
 
     /**
-     * @see org.apache.sling.core.servlets.ErrorHandler#handleError(int, String, SlingHttpServletRequest, SlingHttpServletResponse)
+     * @see org.apache.sling.core.servlets.ErrorHandler#handleError(int, String,
+     *      SlingHttpServletRequest, SlingHttpServletResponse)
      */
     public void handleError(int status, String message,
             SlingHttpServletRequest request, SlingHttpServletResponse response)
@@ -227,7 +254,7 @@
         String baseName = String.valueOf(status);
 
         // search the servlet by absolute path
-        Iterator<String> pathIterator = PathSupport.getPathIterator(
+        PathIterator pathIterator = new PathIterator(
             ServletResolverConstants.ERROR_HANDLER_PATH, path);
         Servlet servlet = getServlet(resolver, pathIterator, baseName);
         if (servlet == null) {
@@ -264,11 +291,14 @@
         Servlet servlet = null;
         ResourceResolver resolver = request.getResourceResolver();
 
+        PathIterator pathIterator = new PathIterator(
+            ServletResolverConstants.ERROR_HANDLER_PATH, path);
+
         Class<?> tClass = throwable.getClass();
         while (servlet == null && tClass != Object.class) {
             String baseName = tClass.getSimpleName();
-            Iterator<String> pathIterator = PathSupport.getPathIterator(
-                ServletResolverConstants.ERROR_HANDLER_PATH, path);
+
+            pathIterator.reset();
             servlet = getServlet(resolver, pathIterator, baseName);
 
             // go to the base class
@@ -291,7 +321,8 @@
 
     // ---------- internal helper ---------------------------------------------
 
-    private Servlet getServlet(ResourceResolver resolver, Iterator<String> paths, String baseName) {
+    private Servlet getServlet(ResourceResolver resolver,
+            Iterator<String> paths, String baseName) {
         while (paths.hasNext()) {
             String location = paths.next();
             try {
@@ -300,8 +331,8 @@
                     return result;
                 }
             } catch (SlingException se) {
-                log.warn("getServlet: Problem resolving servlet at "
-                    + location + "/" + baseName, se);
+                log.warn("getServlet: Problem resolving servlet at " + location
+                    + "/" + baseName, se);
             }
         }
 
@@ -568,8 +599,9 @@
 
             Servlet servlet = (Servlet) context.locateService(REF_SERVLET,
                 reference);
-            if(servlet == null) {
-                log.error("destroyServlet: Servlet not found for reference {}", reference.toString());
+            if (servlet == null) {
+                log.error("destroyServlet: Servlet not found for reference {}",
+                    reference.toString());
             } else {
                 String name = servlet.getServletConfig().getServletName();
                 log.debug("unbindServlet: Servlet {} removed", name);
@@ -585,4 +617,25 @@
         }
     }
 
+    private static String getScriptBaseName(SlingHttpServletRequest request) {
+        String methodName = request.getMethod();
+        String extension = request.getRequestPathInfo().getExtension();
+
+        if (methodName == null || methodName.length() == 0) {
+
+            throw new IllegalArgumentException(
+                "HTTP Method name must not be empty");
+
+        } else if ((HttpConstants.METHOD_GET.equalsIgnoreCase(methodName) || HttpConstants.METHOD_HEAD.equalsIgnoreCase(methodName))
+            && extension != null && extension.length() > 0) {
+
+            // for GET, we use the request extension
+            return extension;
+
+        } else {
+
+            // for other methods use the method name
+            return methodName;
+        }
+    }
 }

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=631604&r1=631603&r2=631604&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 Wed Feb 27 06:39:22 2008
@@ -58,6 +58,11 @@
         return path;
     }
 
+    /** Servlet Resources have no super type */
+    public String getResourceSuperType() {
+        return null;
+    }
+    
     public String getPath() {
         return path;
     }

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=631604&r1=631603&r2=631604&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 Wed Feb 27 06:39:22 2008
@@ -38,8 +38,8 @@
 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.JcrResourceUtil;
 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 {
@@ -89,7 +89,7 @@
         for (String type : types) {
 
             // ensure namespace prefixes are converted to slashes
-            type = PathSupport.toPath(type);
+            type = JcrResourceUtil.resourceTypeToPath(type);
 
             // make absolute if relative
             if (!type.startsWith("/")) {