FELIX-4841 : Support HttpSessionIdListener

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1679520 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java b/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java
index 79a1958..8976da9 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java
@@ -97,12 +97,12 @@
         return new HttpSessionIdListener() {
 
             @Override
-            public void sessionIdChanged(HttpSessionEvent event, String oldSessionId) {
-                // TODO Auto-generated method stub
-
+            public void sessionIdChanged(final HttpSessionEvent event, String oldSessionId) {
+                whiteboardManager.sessionIdChanged(event, oldSessionId, HttpSessionWrapper.getSessionContextIds(event.getSession()));
             }
         };
     }
+
     public void setProperties(final Hashtable<String, Object> props)
     {
         this.httpServiceFactory.setProperties(props);
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/PerContextEventListener.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/PerContextEventListener.java
index 2b8fdba..c7266ed 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/PerContextEventListener.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/PerContextEventListener.java
@@ -51,6 +51,7 @@
 public final class PerContextEventListener implements
         HttpSessionListener,
         HttpSessionAttributeListener,
+        HttpSessionIdListener,
         ServletContextAttributeListener,
         ServletRequestListener,
         ServletRequestAttributeListener
@@ -435,4 +436,15 @@
                 requestAttributeListeners.keySet(),
                 requestListeners.keySet());
     }
+
+    /**
+     * @see javax.servlet.http.HttpSessionIdListener#sessionIdChanged(javax.servlet.http.HttpSessionEvent, java.lang.String)
+     */
+    @Override
+    public void sessionIdChanged(@Nonnull final HttpSessionEvent event, @Nonnull final String oldSessionId) {
+        for (final HttpSessionIdListener l : sessionIdListeners.values())
+        {
+            l.sessionIdChanged(event, oldSessionId);
+        }
+    }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
index 2b8575e..8f5032a 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
@@ -39,6 +39,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionEvent;
 
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.handler.HandlerRegistry;
@@ -253,6 +254,24 @@
     }
 
     /**
+     * Handle session id changes
+     * @param session The session where the id changed
+     * @param oldSessionId The old session id
+     * @param contextIds The context ids using that session
+     */
+    public void sessionIdChanged(@Nonnull final HttpSessionEvent event, String oldSessionId, final Set<Long> contextIds)
+    {
+        for(final Long contextId : contextIds)
+        {
+            final ContextHandler handler = this.getContextHandler(contextId);
+            if ( handler != null )
+            {
+                handler.getListenerRegistry().sessionIdChanged(event, oldSessionId);
+            }
+        }
+    }
+
+    /**
      * Activate a servlet context helper.
      * @param contextInfo A context info
      */