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 2017/03/31 10:20:28 UTC

svn commit: r1789652 - in /sling/trunk/bundles/servlets/resolver/src: main/java/org/apache/sling/servlets/resolver/internal/ main/java/org/apache/sling/servlets/resolver/internal/resource/ test/java/org/apache/sling/servlets/resolver/internal/ test/jav...

Author: cziegeler
Date: Fri Mar 31 10:20:28 2017
New Revision: 1789652

URL: http://svn.apache.org/viewvc?rev=1789652&view=rev
Log:
SLING-6762 : Use target filter for servlet references

Modified:
    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/resource/ServletResourceProvider.java
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.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/resource/ServletResourceProviderCreateTest.java

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=1789652&r1=1789651&r2=1789652&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 Fri Mar 31 10:20:28 2017
@@ -184,10 +184,10 @@ public class SlingServletResolver
 
     private final Map<ServiceReference<Servlet>, ServletReg> servletsByReference = new HashMap<>();
 
-    private final List<ServiceReference<Servlet>> pendingServlets = new ArrayList<>();
+    private final List<PendingServlet> pendingServlets = new ArrayList<>();
 
-    /** The component context. */
-    private ComponentContext context;
+    /** The bundle context. */
+    private BundleContext context;
 
     private ServletResourceProviderFactory servletResourceProviderFactory;
 
@@ -794,8 +794,8 @@ public class SlingServletResolver
      * Activate this component.
      */
     @Activate
-    protected void activate(final ComponentContext context, final Config config) throws LoginException {
-        final Collection<ServiceReference<Servlet>> refs;
+    protected void activate(final BundleContext context, final Config config) throws LoginException {
+        final Collection<PendingServlet> refs;
         synchronized (this.pendingServlets) {
 
             refs = new ArrayList<>(pendingServlets);
@@ -855,18 +855,18 @@ public class SlingServletResolver
         props.put("service.description", "Apache Sling Servlet Resolver and Error Handler");
         props.put("service.vendor","The Apache Software Foundation");
 
-        this.eventHandlerReg = context.getBundleContext()
+        this.eventHandlerReg = context
                   .registerService(new String[] {ResourceChangeListener.class.getName(), EventHandler.class.getName()}, this, props);
 
 
-        this.plugin = new ServletResolverWebConsolePlugin(context.getBundleContext());
+        this.plugin = new ServletResolverWebConsolePlugin(context);
         if (this.cacheSize > 0) {
             try {
                 Dictionary<String, String> mbeanProps = new Hashtable<>();
                 mbeanProps.put("jmx.objectname", "org.apache.sling:type=servletResolver,service=SlingServletResolverCache");
 
                 ServletResolverCacheMBeanImpl mbean = new ServletResolverCacheMBeanImpl();
-                mbeanRegistration = context.getBundleContext().registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps);
+                mbeanRegistration = context.registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps);
             } catch (Throwable t) {
                 LOGGER.debug("Unable to register mbean");
             }
@@ -931,22 +931,22 @@ public class SlingServletResolver
 
     @Reference(
             name = REF_SERVLET,
-            service = javax.servlet.Servlet.class,
+            service = Servlet.class,
             cardinality = ReferenceCardinality.MULTIPLE,
             policy = ReferencePolicy.DYNAMIC,
             target="(|(" + ServletResolverConstants.SLING_SERVLET_PATHS + "=*)(" + ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES + "=*))")
-    protected void bindServlet(final ServiceReference<Servlet> reference) {
+    protected void bindServlet(final Servlet servlet, final ServiceReference<Servlet> reference) {
         boolean directCreate = true;
         if (context == null) {
             synchronized ( pendingServlets ) {
                 if (context == null) {
-                    pendingServlets.add(reference);
+                    pendingServlets.add(new PendingServlet(servlet, reference));
                     directCreate = false;
                 }
             }
         }
         if ( directCreate ) {
-            createServlet(reference);
+            createServlet(servlet, reference);
         }
     }
 
@@ -959,41 +959,24 @@ public class SlingServletResolver
 
     // ---------- Servlet Management -------------------------------------------
 
-    private void createAllServlets(final Collection<ServiceReference<Servlet>> pendingServlets) {
-        for (final ServiceReference<Servlet> serviceReference : pendingServlets) {
-            createServlet(serviceReference);
+    private void createAllServlets(final Collection<PendingServlet> pendingServlets) {
+        for (final PendingServlet ps : pendingServlets) {
+            createServlet(ps.servlet, ps.reference);
         }
     }
 
 
-    private boolean createServlet(final ServiceReference<Servlet> reference) {
+    private boolean createServlet(final Servlet servlet, final ServiceReference<Servlet> reference) {
         // check for a name, this is required
         final String name = getName(reference);
 
         // check for Sling properties in the service registration
-        final ServletResourceProvider provider = servletResourceProviderFactory.create(reference);
+        final ServletResourceProvider provider = servletResourceProviderFactory.create(reference, servlet);
         if (provider == null) {
             // this is expected if the servlet is not destined for Sling
             return false;
         }
 
-        // only now try to access the servlet service, this may still fail
-        Throwable exception = null;
-        Servlet servlet = null;
-        try {
-            servlet = context.locateService(REF_SERVLET, reference);
-        } catch (Throwable t) {
-            exception = t;
-        }
-        if (servlet == null) {
-            LOGGER.error("bindServlet: Servlet service not available from reference "
-                      + ServletResourceProviderFactory.getServiceReferenceInfo(reference), exception);
-            return false;
-        }
-
-        // assign the servlet to the provider
-        provider.setServlet(servlet);
-
         // initialize now
         try {
             servlet.init(new SlingServletConfig(servletContext, reference, name));
@@ -1009,7 +992,7 @@ public class SlingServletResolver
         final List<ServiceRegistration<ResourceProvider<Object>>> regs = new ArrayList<>();
         for(final String root : provider.getServletPaths()) {
             @SuppressWarnings("unchecked")
-            final ServiceRegistration<ResourceProvider<Object>> reg = (ServiceRegistration<ResourceProvider<Object>>) context.getBundleContext().registerService(
+            final ServiceRegistration<ResourceProvider<Object>> reg = (ServiceRegistration<ResourceProvider<Object>>) context.registerService(
                 ResourceProvider.class.getName(),
                 provider,
                 createServiceProperties(reference, provider, root));
@@ -1056,7 +1039,11 @@ public class SlingServletResolver
         if (registration != null) {
 
             for(final ServiceRegistration<ResourceProvider<Object>> reg : registration.registrations) {
-                reg.unregister();
+                try {
+                    reg.unregister();
+                } catch ( final IllegalStateException ise) {
+                    // this might happen on shutdown
+                }
             }
             final String name = RequestUtil.getServletName(registration.servlet);
             LOGGER.debug("unbindServlet: Servlet {} removed", name);
@@ -1136,6 +1123,16 @@ public class SlingServletResolver
         }
     }
 
+    private static final class PendingServlet {
+        public final Servlet servlet;
+        public final ServiceReference<Servlet> reference;
+
+        public PendingServlet(final Servlet s, final ServiceReference<Servlet> ref) {
+            this.servlet = s;
+            this.reference = ref;
+        }
+    }
+
     @SuppressWarnings("serial")
     class ServletResolverWebConsolePlugin extends HttpServlet {
         private static final String PARAMETER_URL = "url";

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java Fri Mar 31 10:20:28 2017
@@ -35,18 +35,15 @@ public class ServletResourceProvider ext
 
     private Set<String> resourcePaths;
 
-    ServletResourceProvider(Set<String> resourcePaths) {
-        this.resourcePaths = resourcePaths;
-    }
-
-    public void setServlet(Servlet servlet) {
+    ServletResourceProvider(final Servlet servlet, final Set<String> resourcePaths) {
         this.servlet = servlet;
+        this.resourcePaths = resourcePaths;
     }
 
     @Override
     public Resource getResource(final ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent) {
         // only return a resource if the servlet has been assigned
-        if (servlet != null && resourcePaths.contains(path)) {
+        if (resourcePaths.contains(path)) {
             return new ServletResource(ctx.getResourceResolver(), servlet, path);
         }
 

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java Fri Mar 31 10:20:28 2017
@@ -120,7 +120,7 @@ public class ServletResourceProviderFact
         }
     }
 
-    public ServletResourceProvider create(ServiceReference<Servlet> ref) {
+    public ServletResourceProvider create(final ServiceReference<Servlet> ref, final Servlet servlet) {
 
         Set<String> pathSet = new HashSet<>();
 
@@ -144,7 +144,7 @@ public class ServletResourceProviderFact
                     getServiceReferenceInfo(ref), pathSet);
         }
 
-        return new ServletResourceProvider(pathSet);
+        return new ServletResourceProvider(servlet, pathSet);
     }
 
     /**

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=1789652&r1=1789651&r2=1789652&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 Fri Mar 31 10:20:28 2017
@@ -43,7 +43,6 @@ import org.apache.sling.api.servlets.Opt
 import org.apache.sling.api.servlets.ServletResolverConstants;
 import org.apache.sling.commons.testing.osgi.MockBundle;
 import org.apache.sling.commons.testing.osgi.MockBundleContext;
-import org.apache.sling.commons.testing.osgi.MockComponentContext;
 import org.apache.sling.commons.testing.osgi.MockServiceReference;
 import org.apache.sling.commons.testing.sling.MockResource;
 import org.apache.sling.commons.testing.sling.MockResourceResolver;
@@ -154,8 +153,6 @@ public class SlingServletResolverTest {
                 return null;
             }
         };
-        MockComponentContext mockComponentContext = new MockComponentContext(
-            bundleContext, SlingServletResolverTest.this.servlet);
         MockServiceReference serviceReference = new MockServiceReference(bundle);
         serviceReference.setProperty(Constants.SERVICE_ID, 1L);
         serviceReference.setProperty(ServletResolverConstants.SLING_SERVLET_NAME,
@@ -165,10 +162,9 @@ public class SlingServletResolverTest {
         serviceReference.setProperty(
             ServletResolverConstants.SLING_SERVLET_EXTENSIONS,
             SERVLET_EXTENSION);
-        mockComponentContext.locateService(SERVLET_NAME, serviceReference);
 
-        servletResolver.bindServlet(serviceReference);
-        servletResolver.activate(mockComponentContext, new SlingServletResolver.Config() {
+        servletResolver.bindServlet(SlingServletResolverTest.this.servlet, serviceReference);
+        servletResolver.activate(bundleContext, new SlingServletResolver.Config() {
 
             @Override
             public Class<? extends Annotation> annotationType() {
@@ -248,7 +244,7 @@ public class SlingServletResolverTest {
         srpf.setAccessible(true);
         ServletResourceProviderFactory factory = (ServletResourceProviderFactory) srpf.get(servletResolver);
 
-        ServletResourceProvider servlet = factory.create(msr);
+        ServletResourceProvider servlet = factory.create(msr, null);
 
         Method createServiceProperties = SlingServletResolver.class.getDeclaredMethod("createServiceProperties", ServiceReference.class, ServletResourceProvider.class, String.class);
         createServiceProperties.setAccessible(true);

Modified: sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java Fri Mar 31 10:20:28 2017
@@ -56,9 +56,8 @@ public class ServletResourceProviderCrea
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES,
             RES_TYPE);
         // msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "*");
-        ServletResourceProvider srp = factory.create(msr);
+        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
         assertNotNull(srp);
-        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getServletPaths();
         assertNotNull(paths);
@@ -84,9 +83,8 @@ public class ServletResourceProviderCrea
             RES_TYPE);
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "GET");
 
-        ServletResourceProvider srp = factory.create(msr);
+        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
         assertNotNull(srp);
-        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getServletPaths();
         assertNotNull(paths);
@@ -111,9 +109,8 @@ public class ServletResourceProviderCrea
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS,
             new String[] { "GET", "POST", "PUT" });
 
-        ServletResourceProvider srp = factory.create(msr);
+        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
         assertNotNull(srp);
-        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getServletPaths();
         assertNotNull(paths);
@@ -141,9 +138,8 @@ public class ServletResourceProviderCrea
             RES_TYPE);
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "*");
 
-        ServletResourceProvider srp = factory.create(msr);
+        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
         assertNotNull(srp);
-        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getServletPaths();
         assertNotNull(paths);
@@ -172,9 +168,8 @@ public class ServletResourceProviderCrea
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_EXTENSIONS,
             new String[] { "json" });
 
-        ServletResourceProvider srp = factory.create(msr);
+        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
         assertNotNull(srp);
-        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getServletPaths();
         assertNotNull(paths);
@@ -201,9 +196,8 @@ public class ServletResourceProviderCrea
         msr.setProperty(ServletResolverConstants.SLING_SERVLET_EXTENSIONS,
             new String[] { "json", "html" });
 
-        ServletResourceProvider srp = factory.create(msr);
+        ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
         assertNotNull(srp);
-        srp.setServlet(TEST_SERVLET);
 
         String[] paths = srp.getServletPaths();
         assertNotNull(paths);