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/09/09 16:40:05 UTC

svn commit: r693474 - in /incubator/sling/trunk/servlets/resolver/src: main/java/org/apache/sling/servlets/resolver/ main/java/org/apache/sling/servlets/resolver/resource/ test/java/org/apache/sling/servlets/resolver/resource/

Author: fmeschbe
Date: Tue Sep  9 07:40:03 2008
New Revision: 693474

URL: http://svn.apache.org/viewvc?rev=693474&view=rev
Log:
SLING-652 Be more lenient to failed servlet service acquiry:
   * First check the service properties
   * Catch service acquisition problems to fail gracefully

Modified:
    incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/SlingServletResolver.java
    incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProvider.java
    incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderFactory.java
    incubator/sling/trunk/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderCreateTest.java

Modified: incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/SlingServletResolver.java?rev=693474&r1=693473&r2=693474&view=diff
==============================================================================
--- incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/SlingServletResolver.java (original)
+++ incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/SlingServletResolver.java Tue Sep  9 07:40:03 2008
@@ -564,6 +564,7 @@
     private boolean createServlet(ServletContext servletContext,
             ServiceReference reference) {
 
+        // check for a name, this is required
         String name = AbstractServiceReferenceConfig.getName(reference);
         if (name == null) {
             log.error(
@@ -572,24 +573,32 @@
             return false;
         }
 
-        Servlet servlet = (Servlet) context.locateService(REF_SERVLET,
-            reference);
-        if (servlet == null) {
-            log.error(
-                "bindServlet: Servlet service not available from reference {}",
-                reference);
+        // check for Sling properties in the service registration
+        ServletResourceProvider provider = servletResourceProviderFactory.create(reference);
+        if (provider == null) {
+            // this is expected if the servlet is not destined for Sling
             return false;
         }
 
-        ServletResourceProvider provider = servletResourceProviderFactory.create(
-            reference, servlet);
-        if (provider == null) {
+        // only now try to access the servlet service, this may still fail
+        Servlet servlet = null;
+        try {
+            servlet = (Servlet) context.locateService(REF_SERVLET,reference);
+        } catch (Throwable t) {
+            log.warn("bindServlet: Failed getting the service for reference "
+                + reference, t);
+        }
+        if (servlet == null) {
             log.error(
-                "createServlet: Cannot register servlet {} without path or resource type configuration",
-                name);
+                "bindServlet: Servlet service not available from reference {}",
+                reference);
             return false;
         }
 
+        // assign the servlet to the provider
+        provider.setServlet(servlet);
+        
+        // initialize now
         try {
             servlet.init(new SlingServletConfig(servletContext, reference, name));
             log.debug("bindServlet: Servlet {} added", name);

Modified: incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProvider.java?rev=693474&r1=693473&r2=693474&view=diff
==============================================================================
--- incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProvider.java (original)
+++ incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProvider.java Tue Sep  9 07:40:03 2008
@@ -30,22 +30,26 @@
 
 public class ServletResourceProvider implements ResourceProvider {
 
-    private final Servlet servlet;
+    private Servlet servlet;
 
     private Set<String> resourcePaths;
 
-    ServletResourceProvider(Set<String> resourcePaths, Servlet servlet) {
-        this.servlet = servlet;
+    ServletResourceProvider(Set<String> resourcePaths) {
         this.resourcePaths = resourcePaths;
     }
 
+    public void setServlet(Servlet servlet) {
+        this.servlet = servlet;
+    }
+    
     public Resource getResource(ResourceResolver resourceResolver,
             HttpServletRequest request, String path) {
         return getResource(resourceResolver, path);
     }
 
     public Resource getResource(ResourceResolver resourceResolver, String path) {
-        if (resourcePaths.contains(path)) {
+        // only return a resource if the servlet has been assigned
+        if (servlet != null && resourcePaths.contains(path)) {
             return new ServletResource(resourceResolver, servlet, path);
         }
 

Modified: incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderFactory.java?rev=693474&r1=693473&r2=693474&view=diff
==============================================================================
--- incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderFactory.java (original)
+++ incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderFactory.java Tue Sep  9 07:40:03 2008
@@ -27,8 +27,6 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.servlet.Servlet;
-
 import org.apache.sling.api.servlets.HttpConstants;
 import org.apache.sling.commons.osgi.OsgiUtil;
 import org.apache.sling.jcr.resource.JcrResourceUtil;
@@ -80,7 +78,7 @@
         this.servletRoot = servletRoot;
     }
 
-    public ServletResourceProvider create(ServiceReference ref, Servlet servlet) {
+    public ServletResourceProvider create(ServiceReference ref) {
 
         Set<String> pathSet = new HashSet<String>();
 
@@ -104,7 +102,7 @@
                 getServiceIdentifier(ref), pathSet);
         }
         
-        return new ServletResourceProvider(pathSet, servlet);
+        return new ServletResourceProvider(pathSet);
     }
 
     private void addByPath(Set<String> pathSet, ServiceReference ref) {

Modified: incubator/sling/trunk/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderCreateTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderCreateTest.java?rev=693474&r1=693473&r2=693474&view=diff
==============================================================================
--- incubator/sling/trunk/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderCreateTest.java (original)
+++ incubator/sling/trunk/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/resource/ServletResourceProviderCreateTest.java Tue Sep  9 07:40:03 2008
@@ -56,9 +56,9 @@
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES,
             RES_TYPE);
         // msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "*");
-
-        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
+        ServletResourceProvider srp = factory.create(msr);
         assertNotNull(srp);
+        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getSerlvetPaths();
         assertNotNull(paths);
@@ -84,8 +84,9 @@
             RES_TYPE);
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "GET");
 
-        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
+        ServletResourceProvider srp = factory.create(msr);
         assertNotNull(srp);
+        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getSerlvetPaths();
         assertNotNull(paths);
@@ -110,8 +111,9 @@
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS,
             new String[] { "GET", "POST", "PUT" });
 
-        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
+        ServletResourceProvider srp = factory.create(msr);
         assertNotNull(srp);
+        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getSerlvetPaths();
         assertNotNull(paths);
@@ -139,8 +141,9 @@
             RES_TYPE);
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "*");
 
-        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
+        ServletResourceProvider srp = factory.create(msr);
         assertNotNull(srp);
+        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getSerlvetPaths();
         assertNotNull(paths);