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 2010/09/07 11:58:50 UTC

svn commit: r993307 - in /sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine: SlingRequestProcessor.java impl/SlingMainServlet.java impl/helper/SlingServletContext.java

Author: fmeschbe
Date: Tue Sep  7 09:58:50 2010
New Revision: 993307

URL: http://svn.apache.org/viewvc?rev=993307&view=rev
Log:
SLING-1603 SlingRequestProcessor must be registered as a service
(also cleanup activation and deactivation methods with respect to using the Component Context)

Modified:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/SlingRequestProcessor.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/SlingRequestProcessor.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/SlingRequestProcessor.java?rev=993307&r1=993306&r2=993307&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/SlingRequestProcessor.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/SlingRequestProcessor.java Tue Sep  7 09:58:50 2010
@@ -36,6 +36,11 @@ import org.apache.sling.api.resource.Res
 public interface SlingRequestProcessor {
 
     /**
+     * The name of the <code>SlingRequestProcessor</code> service.
+     */
+    static final String NAME = SlingRequestProcessor.class.getName();
+
+    /**
      * Process an HTTP request through the Sling request processing engine.
      * <p>
      * This method does <b>not</b> close the provided resource resolver !

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java?rev=993307&r1=993306&r2=993307&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java Tue Sep  7 09:58:50 2010
@@ -23,6 +23,8 @@ import java.net.SocketException;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.Map;
+
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
@@ -30,7 +32,9 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
@@ -44,6 +48,7 @@ import org.apache.sling.api.servlets.Ser
 import org.apache.sling.auth.core.AuthenticationSupport;
 import org.apache.sling.commons.mime.MimeTypeService;
 import org.apache.sling.commons.osgi.OsgiUtil;
+import org.apache.sling.engine.SlingRequestProcessor;
 import org.apache.sling.engine.impl.filter.ServletFilterManager;
 import org.apache.sling.engine.impl.helper.RequestListenerManager;
 import org.apache.sling.engine.impl.helper.SlingServletContext;
@@ -52,8 +57,8 @@ import org.apache.sling.engine.impl.requ
 import org.apache.sling.engine.servlets.ErrorHandler;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.Version;
-import org.osgi.service.component.ComponentContext;
 import org.osgi.service.http.HttpService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -110,8 +115,6 @@ public class SlingMainServlet extends Ge
 
     private SlingServletContext slingServletContext;
 
-    private ComponentContext osgiComponentContext;
-
     /**
      * The server information to report in the {@link #getServerInfo()} method.
      * By default this is just the {@link #PRODUCT_NAME}. The
@@ -135,6 +138,8 @@ public class SlingMainServlet extends Ge
 
     private final SlingRequestProcessorImpl requestProcessor = new SlingRequestProcessorImpl();
 
+    private ServiceRegistration requestProcessorRegistration;
+
     // ---------- Servlet API -------------------------------------------------
 
     public void service(ServletRequest req, ServletResponse res)
@@ -234,18 +239,13 @@ public class SlingMainServlet extends Ge
         return serverInfo;
     }
 
-    public BundleContext getBundleContext() {
-        return osgiComponentContext.getBundleContext();
-    }
-
     // ---------- Property Setter for SCR --------------------------------------
 
-    protected void activate(ComponentContext componentContext) {
-
-        osgiComponentContext = componentContext;
+    @Activate
+    protected void activate(final BundleContext bundleContext,
+            final Map<String, Object> componentConfig) {
 
         // setup server info
-        final BundleContext bundleContext = componentContext.getBundleContext();
         final Dictionary<?, ?> props = bundleContext.getBundle().getHeaders();
         final Version bundleVersion = Version.parseVersion((String) props.get(Constants.BUNDLE_VERSION));
         final String productVersion = bundleVersion.getMajor() + "."
@@ -259,12 +259,8 @@ public class SlingMainServlet extends Ge
         this.requestProcessor.setServerInfo(serverInfo);
 
         // prepare the servlet configuration from the component config
-        final Hashtable<String, Object> configuration = new Hashtable<String, Object>();
-        final Dictionary<?, ?> componentConfig = componentContext.getProperties();
-        for (Enumeration<?> cce = componentConfig.keys(); cce.hasMoreElements();) {
-            Object key = cce.nextElement();
-            configuration.put(String.valueOf(key), componentConfig.get(key));
-        }
+        final Hashtable<String, Object> configuration = new Hashtable<String, Object>(
+            componentConfig);
 
         // ensure the servlet name
         if (!(configuration.get("servlet-name") instanceof String)) {
@@ -300,13 +296,13 @@ public class SlingMainServlet extends Ge
 
         // now that the sling main servlet is registered with the HttpService
         // and initialized we can register the servlet context
-        slingServletContext = new SlingServletContext(this);
+        slingServletContext = new SlingServletContext(bundleContext, this);
 
         // register render filters already registered after registration with
         // the HttpService as filter initialization may cause the servlet
         // context to be required (see SLING-42)
-        filterManager = new ServletFilterManager(
-            componentContext.getBundleContext(), slingServletContext);
+        filterManager = new ServletFilterManager(bundleContext,
+            slingServletContext);
         filterManager.open();
         requestProcessor.setFilterManager(filterManager);
 
@@ -319,9 +315,23 @@ public class SlingMainServlet extends Ge
         } catch (Throwable t) {
             log.debug("Unable to register web console configuration printer.", t);
         }
+
+        // provide the SlingRequestProcessor service
+        Hashtable<String, String> srpProps = new Hashtable<String, String>();
+        srpProps.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
+        srpProps.put(Constants.SERVICE_DESCRIPTION, "Sling Request Processor");
+        requestProcessorRegistration = bundleContext.registerService(
+            SlingRequestProcessor.NAME, requestProcessor, srpProps);
     }
 
-    protected void deactivate(ComponentContext componentContext) {
+    @Deactivate
+    protected void deactivate() {
+        // unregister the sling request processor
+        if (requestProcessorRegistration != null) {
+            requestProcessorRegistration.unregister();
+            requestProcessorRegistration = null;
+        }
+
         // this reverses the activation setup
         if ( this.printerRegistration != null ) {
             WebConsoleConfigPrinter.unregister(this.printerRegistration);
@@ -354,8 +364,6 @@ public class SlingMainServlet extends Ge
         // reset the sling main servlet reference (help GC and be nice)
         RequestData.setSlingMainServlet(null);
 
-        this.osgiComponentContext = null;
-
         log.info(this.getServerInfo() + " shut down");
     }
 

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java?rev=993307&r1=993306&r2=993307&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java Tue Sep  7 09:58:50 2010
@@ -33,6 +33,7 @@ import javax.servlet.ServletContext;
 
 import org.apache.sling.engine.impl.SlingMainServlet;
 import org.apache.sling.engine.impl.request.SlingRequestDispatcher;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceRegistration;
 import org.slf4j.Logger;
@@ -90,14 +91,15 @@ public class SlingServletContext impleme
      * method may cause a {@link NullPointerException} !
      * @see #dispose()
      */
-    public SlingServletContext(SlingMainServlet slingMainServlet) {
+    public SlingServletContext(final BundleContext bundleContext,
+            final SlingMainServlet slingMainServlet) {
         this.slingMainServlet = slingMainServlet;
 
         Dictionary<String, Object> props = new Hashtable<String, Object>();
         props.put(Constants.SERVICE_PID, getClass().getName());
         props.put(Constants.SERVICE_DESCRIPTION, "Sling ServletContext");
         props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
-        registration = slingMainServlet.getBundleContext().registerService(
+        registration = bundleContext.registerService(
             ServletContext.class.getName(), this, props);
     }