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 2011/01/10 08:37:13 UTC

svn commit: r1057098 - in /sling/trunk/launchpad/base: ./ src/main/java/org/apache/sling/launchpad/base/shared/ src/main/java/org/apache/sling/launchpad/base/webapp/ src/main/java/org/apache/sling/launchpad/webapp/ src/main/webapp/WEB-INF/

Author: fmeschbe
Date: Mon Jan 10 07:37:12 2011
New Revision: 1057098

URL: http://svn.apache.org/viewvc?rev=1057098&view=rev
Log:
SLING-1924 Upgrade to Apache Felix HTTP Bundles 2.0.5-SNAPSHOT and add support for Http Session event forwarding to the ProxyListener.

Added:
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java   (with props)
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java   (with props)
Modified:
    sling/trunk/launchpad/base/pom.xml
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java
    sling/trunk/launchpad/base/src/main/webapp/WEB-INF/web.xml

Modified: sling/trunk/launchpad/base/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/pom.xml?rev=1057098&r1=1057097&r2=1057098&view=diff
==============================================================================
--- sling/trunk/launchpad/base/pom.xml (original)
+++ sling/trunk/launchpad/base/pom.xml Mon Jan 10 07:37:12 2011
@@ -38,7 +38,7 @@
     </description>
 
     <properties>
-        <felix.httpservice.version>2.0.4</felix.httpservice.version>
+        <felix.httpservice.version>2.0.5-SNAPSHOT</felix.httpservice.version>
     </properties>
 
     <scm>

Modified: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java?rev=1057098&r1=1057097&r2=1057098&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java (original)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java Mon Jan 10 07:37:12 2011
@@ -54,6 +54,14 @@ public interface SharedConstants {
     public static final String DEFAULT_SLING_SERVLET = "org.apache.sling.launchpad.base.webapp.SlingServletDelegate";
 
     /**
+     * The fully qualified name of the implementation of the Servlet API
+     * ServletContextListener, HttpSessionListener, and
+     * HttpSessionAttributeListener interfaces to which the respective events
+     * are forwarded.
+     */
+    public static final String DEFAULT_SLING_LISTENER = "org.apache.sling.launchpad.base.webapp.SlingHttpSessionListenerDelegate";
+
+    /**
      * The name of the file providing the Launcher JAR. On the one hand this is
      * the name used to place the JAR file sling.home to use for startup. On the
      * other hand, this is the name of the file in the archive (see

Added: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java?rev=1057098&view=auto
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java (added)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java Mon Jan 10 07:37:12 2011
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.launchpad.base.webapp;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import org.apache.felix.http.proxy.ProxyListener;
+
+public class SlingHttpSessionListenerDelegate implements
+        HttpSessionAttributeListener, HttpSessionListener,
+        ServletContextListener {
+
+    private final ProxyListener proxyListener = new ProxyListener();
+
+    // ---------- ServletContextListener
+
+    public void contextInitialized(final ServletContextEvent sce) {
+        this.proxyListener.contextInitialized(sce);
+    }
+
+    public void contextDestroyed(final ServletContextEvent sce) {
+        this.proxyListener.contextDestroyed(sce);
+    }
+
+    // ---------- HttpSessionListener
+
+    public void sessionCreated(HttpSessionEvent se) {
+        proxyListener.sessionCreated(se);
+    }
+
+    public void sessionDestroyed(HttpSessionEvent se) {
+        proxyListener.sessionDestroyed(se);
+    }
+
+    // ---------- HttpSessionAttributeListener
+
+    public void attributeAdded(HttpSessionBindingEvent se) {
+        proxyListener.attributeAdded(se);
+    }
+
+    public void attributeRemoved(HttpSessionBindingEvent se) {
+        proxyListener.attributeRemoved(se);
+    }
+
+    public void attributeReplaced(HttpSessionBindingEvent se) {
+        proxyListener.attributeReplaced(se);
+    }
+
+}

Propchange: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Modified: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java?rev=1057098&r1=1057097&r2=1057098&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java (original)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java Mon Jan 10 07:37:12 2011
@@ -167,6 +167,8 @@ public class SlingServlet extends Generi
      */
     @Override
     public void destroy() {
+        SlingSessionListener.stopDelegatee();
+
         if (sling != null) {
             sling.destroy();
         }
@@ -200,6 +202,7 @@ public class SlingServlet extends Generi
 
         // clear the reference to the framework
         sling = null;
+        SlingSessionListener.stopDelegatee();
     }
 
     /**
@@ -220,6 +223,7 @@ public class SlingServlet extends Generi
         synchronized (this) {
             if (startingSling == null) {
                 sling = null;
+                SlingSessionListener.stopDelegatee();
             }
         }
 
@@ -347,6 +351,8 @@ public class SlingServlet extends Generi
                 slingLauncher.setSlingHome(slingHome);
             }
 
+            SlingSessionListener.startDelegate(sling.getClass().getClassLoader());
+
             try {
                 log("Starting launcher ...");
                 sling.init(getServletConfig());

Added: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java?rev=1057098&view=auto
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java (added)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java Mon Jan 10 07:37:12 2011
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.launchpad.webapp;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import org.apache.sling.launchpad.base.shared.SharedConstants;
+
+public class SlingSessionListener implements HttpSessionAttributeListener,
+        HttpSessionListener, ServletContextListener {
+
+    private static ServletContext servletContext;
+
+    private static ServletContextListener delegateeContextListener;
+
+    private static HttpSessionListener delegateeSessionListener;
+
+    private static HttpSessionAttributeListener delegateeSessionAttributeListener;
+
+    static void startDelegate(final ClassLoader classLoader) {
+        Object delegatee = null;
+        try {
+            Class<?> delegateeClass = classLoader.loadClass(SharedConstants.DEFAULT_SLING_LISTENER);
+            delegatee = delegateeClass.newInstance();
+        } catch (Exception e) {
+            servletContext.log(
+                "Delegatee Event Listener class "
+                    + SharedConstants.DEFAULT_SLING_LISTENER
+                    + " cannot be loaded or instantiated; Http Session Event forwarding is disabled",
+                e);
+        }
+
+        if (delegatee instanceof ServletContextListener) {
+            delegateeContextListener = (ServletContextListener) delegatee;
+            delegateeContextListener.contextInitialized(new ServletContextEvent(
+                servletContext));
+
+            delegateeSessionListener = (HttpSessionListener) delegatee;
+            delegateeSessionAttributeListener = (HttpSessionAttributeListener) delegatee;
+        }
+    }
+
+    static void stopDelegatee() {
+        if (delegateeContextListener != null) {
+            delegateeContextListener.contextDestroyed(new ServletContextEvent(
+                servletContext));
+        }
+
+        delegateeContextListener = null;
+        delegateeSessionListener = null;
+        delegateeSessionAttributeListener = null;
+    }
+
+    public void contextInitialized(ServletContextEvent sce) {
+        SlingSessionListener.servletContext = sce.getServletContext();
+    }
+
+    public void contextDestroyed(ServletContextEvent sce) {
+        stopDelegatee();
+        SlingSessionListener.servletContext = null;
+    }
+
+    public void sessionCreated(HttpSessionEvent se) {
+        final HttpSessionListener delegateeSessionListener = SlingSessionListener.delegateeSessionListener;
+        if (delegateeSessionListener != null) {
+            delegateeSessionListener.sessionCreated(se);
+        }
+    }
+
+    public void sessionDestroyed(HttpSessionEvent se) {
+        final HttpSessionListener delegateeSessionListener = SlingSessionListener.delegateeSessionListener;
+        if (delegateeSessionListener != null) {
+            delegateeSessionListener.sessionDestroyed(se);
+        }
+    }
+
+    public void attributeAdded(HttpSessionBindingEvent se) {
+        final HttpSessionAttributeListener delegateeSessionAttributeListener = SlingSessionListener.delegateeSessionAttributeListener;
+        if (delegateeSessionAttributeListener != null) {
+            delegateeSessionAttributeListener.attributeAdded(se);
+        }
+    }
+
+    public void attributeRemoved(HttpSessionBindingEvent se) {
+        final HttpSessionAttributeListener delegateeSessionAttributeListener = SlingSessionListener.delegateeSessionAttributeListener;
+        if (delegateeSessionAttributeListener != null) {
+            delegateeSessionAttributeListener.attributeRemoved(se);
+        }
+    }
+
+    public void attributeReplaced(HttpSessionBindingEvent se) {
+        final HttpSessionAttributeListener delegateeSessionAttributeListener = SlingSessionListener.delegateeSessionAttributeListener;
+        if (delegateeSessionAttributeListener != null) {
+            delegateeSessionAttributeListener.attributeReplaced(se);
+        }
+    }
+
+}

Propchange: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Modified: sling/trunk/launchpad/base/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/webapp/WEB-INF/web.xml?rev=1057098&r1=1057097&r2=1057098&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/webapp/WEB-INF/web.xml (original)
+++ sling/trunk/launchpad/base/src/main/webapp/WEB-INF/web.xml Mon Jan 10 07:37:12 2011
@@ -23,6 +23,13 @@
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
     <display-name>Sling Launchpad Web Application</display-name>
 
+    <!-- The Felix Http Service Listener Proxy for HTTP Session events -->
+    <listener>
+        <listener-class>
+            org.apache.sling.launchpad.webapp.SlingSessionListener
+        </listener-class>
+    </listener>
+
     <servlet>
         <display-name>Sling Servlet</display-name>
         <servlet-name>sling</servlet-name>