You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/05/24 10:50:34 UTC

svn commit: r1681425 [2/2] - in /felix/trunk/http/base/src: main/java/org/apache/felix/http/base/internal/handler/ main/java/org/apache/felix/http/base/internal/registry/ main/java/org/apache/felix/http/base/internal/runtime/ main/java/org/apache/felix...

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java?rev=1681425&r1=1681424&r2=1681425&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java Sun May 24 08:50:33 2015
@@ -31,10 +31,10 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 
 import javax.annotation.Nonnull;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpSessionEvent;
@@ -42,6 +42,7 @@ import javax.servlet.http.HttpSessionEve
 import org.apache.felix.http.base.internal.console.HttpServicePlugin;
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.handler.HttpSessionWrapper;
+import org.apache.felix.http.base.internal.handler.ListenerHandler;
 import org.apache.felix.http.base.internal.logger.SystemLogger;
 import org.apache.felix.http.base.internal.registry.HandlerRegistry;
 import org.apache.felix.http.base.internal.runtime.AbstractInfo;
@@ -270,7 +271,7 @@ public final class WhiteboardManager
             final ContextHandler handler = this.getContextHandler(contextId);
             if ( handler != null )
             {
-                handler.getListenerRegistry().sessionIdChanged(event, oldSessionId);
+                handler.getRegistry().getEventListenerRegistry().sessionIdChanged(event, oldSessionId);
             }
         }
     }
@@ -283,49 +284,37 @@ public final class WhiteboardManager
      */
     private boolean activate(final ContextHandler handler)
     {
-        if ( !handler.activate() )
+        if ( !handler.activate(this.httpService) )
         {
             return false;
         }
 
-        this.httpService.registerContext(handler);
-
-        // use a map to sort the listeners
-        final Map<ServiceReference<ServletContextListener>, ServletContextListenerInfo> listeners = new TreeMap<ServiceReference<ServletContextListener>, ServletContextListenerInfo>();
         final List<WhiteboardServiceInfo<?>> services = new ArrayList<WhiteboardServiceInfo<?>>();
-
         for(final Map.Entry<WhiteboardServiceInfo<?>, List<ContextHandler>> entry : this.servicesMap.entrySet())
         {
             if ( entry.getKey().getContextSelectionFilter().match(handler.getContextInfo().getServiceReference()) )
             {
                 entry.getValue().add(handler);
+                if ( entry.getValue().size() == 1 )
+                {
+                    this.failureStateHandler.remove(entry.getKey());
+                }
                 if ( entry.getKey() instanceof ServletContextListenerInfo )
                 {
-                    final ServletContextListenerInfo info = (ServletContextListenerInfo)entry.getKey();
-                    listeners.put(info.getServiceReference(), info);
+                    // servlet context listeners will be registered directly
+                    this.registerWhiteboardService(handler, entry.getKey());
                 }
                 else
                 {
+                    // registration of other services will be delayed
                     services.add(entry.getKey());
                 }
-                if ( entry.getValue().size() == 1 )
-                {
-                    this.failureStateHandler.remove(entry.getKey());
-                }
-            }
-        }
-        // context listeners first
-        for(final ServletContextListenerInfo info : listeners.values())
-        {
-            final int reason = handler.getListenerRegistry().initialized(info, handler);
-            if ( reason != -1 )
-            {
-                final String type = info.getClass().getSimpleName().substring(0,info.getClass().getSimpleName().length() - 4);
-                SystemLogger.debug("Ignoring " + type + " service " + info.getServiceReference());
-                this.failureStateHandler.add(info, handler.getContextInfo().getServiceId(), reason);
             }
         }
-        // now register services
+        // notify context listeners first
+        handler.getRegistry().getEventListenerRegistry().contextInitialized();
+
+        // register services
         for(final WhiteboardServiceInfo<?> info : services)
         {
             this.registerWhiteboardService(handler, info);
@@ -341,8 +330,8 @@ public final class WhiteboardManager
      */
     private void deactivate(final ContextHandler handler)
     {
-        // context listeners last but sorted
-        final Map<ServiceReference<ServletContextListener>, ServletContextListenerInfo> listeners = new TreeMap<ServiceReference<ServletContextListener>, ServletContextListenerInfo>();
+        // services except context listeners first
+        final List<WhiteboardServiceInfo<?>> listeners = new ArrayList<WhiteboardServiceInfo<?>>();
         final Iterator<Map.Entry<WhiteboardServiceInfo<?>, List<ContextHandler>>> i = this.servicesMap.entrySet().iterator();
         while ( i.hasNext() )
         {
@@ -353,8 +342,7 @@ public final class WhiteboardManager
                 {
                     if ( entry.getKey() instanceof ServletContextListenerInfo )
                     {
-                        final ServletContextListenerInfo info = (ServletContextListenerInfo)entry.getKey();
-                        listeners.put(info.getServiceReference(), info);
+                        listeners.add(entry.getKey());
                     }
                     else
                     {
@@ -369,14 +357,14 @@ public final class WhiteboardManager
                 }
             }
         }
-        for(final ServletContextListenerInfo info : listeners.values())
+        // context listeners last
+        handler.getRegistry().getEventListenerRegistry().contextDestroyed();
+        for(final WhiteboardServiceInfo<?> info : listeners)
         {
-            handler.getListenerRegistry().destroyed(info, handler);
+            this.unregisterWhiteboardService(handler, info);
         }
 
-        this.httpService.unregisterContext(handler);
-
-        handler.deactivate();
+        handler.deactivate(this.httpService);
     }
 
     /**
@@ -584,20 +572,19 @@ public final class WhiteboardManager
                     {
                         for(final ContextHandler h : handlerList)
                         {
+                            this.registerWhiteboardService(h, info);
                             if ( info instanceof ServletContextListenerInfo )
                             {
-                                final int reason = h.getListenerRegistry().initialized((ServletContextListenerInfo)info, h);
-                                if ( reason != -1 )
+                                final ListenerHandler<ServletContextListener> handler = h.getRegistry().getEventListenerRegistry().getServletContextListener((ServletContextListenerInfo)info);
+                                if ( handler != null )
                                 {
-                                    final String type = info.getClass().getSimpleName().substring(0,info.getClass().getSimpleName().length() - 4);
-                                    SystemLogger.debug("Ignoring " + type + " service " + info.getServiceReference());
-                                    this.failureStateHandler.add(info, h.getContextInfo().getServiceId(), reason);
+                                    final ServletContextListener listener = handler.getListener();
+                                    if ( listener != null )
+                                    {
+                                        listener.contextInitialized(new ServletContextEvent(handler.getContext()));
+                                    }
                                 }
                             }
-                            else
-                            {
-                                this.registerWhiteboardService(h, info);
-                            }
                         }
                     }
                 }
@@ -631,14 +618,19 @@ public final class WhiteboardManager
                     {
                         if ( !failureStateHandler.remove(info, h.getContextInfo().getServiceId()) )
                         {
-                            if ( !(info instanceof ServletContextListenerInfo ) )
-                            {
-                                this.unregisterWhiteboardService(h, info);
-                            }
-                            else
+                            if ( info instanceof ServletContextListenerInfo )
                             {
-                                h.getListenerRegistry().destroyed((ServletContextListenerInfo)info, h);
+                                final ListenerHandler<ServletContextListener> handler = h.getRegistry().getEventListenerRegistry().getServletContextListener((ServletContextListenerInfo)info);
+                                if ( handler != null )
+                                {
+                                    final ServletContextListener listener = handler.getListener();
+                                    if ( listener != null )
+                                    {
+                                        listener.contextDestroyed(new ServletContextEvent(handler.getContext()));
+                                    }
+                                }
                             }
+                            this.unregisterWhiteboardService(h, info);
                         }
                     }
                 }
@@ -670,29 +662,33 @@ public final class WhiteboardManager
                 failureCode = this.httpService.registerResource(handler, (ResourceInfo)info);
             }
 
+            else if ( info instanceof ServletContextListenerInfo )
+            {
+                failureCode = this.httpService.registerListener(handler, (ServletContextListenerInfo) info);
+            }
             else if ( info instanceof ServletContextAttributeListenerInfo )
             {
-                failureCode = handler.getListenerRegistry().addListener((ServletContextAttributeListenerInfo) info);
+                failureCode = this.httpService.registerListener(handler, (ServletContextAttributeListenerInfo) info);
             }
             else if ( info instanceof HttpSessionListenerInfo )
             {
-                failureCode = handler.getListenerRegistry().addListener((HttpSessionListenerInfo) info);
+                failureCode = this.httpService.registerListener(handler, (HttpSessionListenerInfo) info);
             }
             else if ( info instanceof HttpSessionAttributeListenerInfo )
             {
-                failureCode = handler.getListenerRegistry().addListener((HttpSessionAttributeListenerInfo) info);
+                failureCode = this.httpService.registerListener(handler, (HttpSessionAttributeListenerInfo) info);
             }
             else if ( info instanceof HttpSessionIdListenerInfo )
             {
-                failureCode = handler.getListenerRegistry().addListener((HttpSessionIdListenerInfo) info);
+                failureCode = this.httpService.registerListener(handler, (HttpSessionIdListenerInfo) info);
             }
             else if ( info instanceof ServletRequestListenerInfo )
             {
-                failureCode = handler.getListenerRegistry().addListener((ServletRequestListenerInfo) info);
+                failureCode = this.httpService.registerListener(handler, (ServletRequestListenerInfo) info);
             }
             else if ( info instanceof ServletRequestAttributeListenerInfo )
             {
-                failureCode = handler.getListenerRegistry().addListener((ServletRequestAttributeListenerInfo) info);
+                failureCode = this.httpService.registerListener(handler, (ServletRequestAttributeListenerInfo) info);
             }
             else
             {
@@ -735,29 +731,33 @@ public final class WhiteboardManager
                 this.httpService.unregisterResource(handler, (ResourceInfo)info);
             }
 
+            else if ( info instanceof ServletContextListenerInfo )
+            {
+                this.httpService.unregisterListener(handler, (ServletContextListenerInfo) info);
+            }
             else if ( info instanceof ServletContextAttributeListenerInfo )
             {
-                handler.getListenerRegistry().removeListener((ServletContextAttributeListenerInfo) info);
+                this.httpService.unregisterListener(handler, (ServletContextAttributeListenerInfo) info);
             }
             else if ( info instanceof HttpSessionListenerInfo )
             {
-                handler.getListenerRegistry().removeListener((HttpSessionListenerInfo) info);
+                this.httpService.unregisterListener(handler, (HttpSessionListenerInfo) info);
             }
             else if ( info instanceof HttpSessionAttributeListenerInfo )
             {
-                handler.getListenerRegistry().removeListener((HttpSessionAttributeListenerInfo) info);
+                this.httpService.unregisterListener(handler, (HttpSessionAttributeListenerInfo) info);
             }
             else if ( info instanceof HttpSessionIdListenerInfo )
             {
-                handler.getListenerRegistry().removeListener((HttpSessionIdListenerInfo) info);
+                this.httpService.unregisterListener(handler, (HttpSessionIdListenerInfo) info);
             }
             else if ( info instanceof ServletRequestListenerInfo )
             {
-                handler.getListenerRegistry().removeListener((ServletRequestListenerInfo) info);
+                this.httpService.unregisterListener(handler, (ServletRequestListenerInfo) info);
             }
             else if ( info instanceof ServletRequestAttributeListenerInfo )
             {
-                handler.getListenerRegistry().removeListener((ServletRequestAttributeListenerInfo) info);
+                this.httpService.unregisterListener(handler, (ServletRequestAttributeListenerInfo) info);
             }
         }
         catch (final Exception e)
@@ -807,7 +807,7 @@ public final class WhiteboardManager
         return null;
     }
 
-    public RegistryRuntime getRuntime(final HandlerRegistry registry)
+    public RegistryRuntime getRuntimeInfo(final HandlerRegistry registry)
     {
         final FailedDTOHolder failedDTOHolder = new FailedDTOHolder();
 
@@ -817,7 +817,7 @@ public final class WhiteboardManager
                 HttpServiceFactory.HTTP_SERVICE_CONTEXT_SERVICE_ID,
                 HttpServiceFactory.HTTP_SERVICE_CONTEXT_NAME, "/", null);
         final ServletContextDTO dto = ServletContextDTOBuilder.build(info, webContext, -1);
-        if ( registry.getRuntime(dto, failedDTOHolder) )
+        if ( registry.getRuntimeInfo(dto, failedDTOHolder) )
         {
             contextDTOs.add(dto);
         }
@@ -841,9 +841,8 @@ public final class WhiteboardManager
         {
             final ServletContextDTO scDTO = ServletContextDTOBuilder.build(handler.getContextInfo(), handler.getSharedContext(), -1);
 
-            if ( registry.getRuntime(scDTO, failedDTOHolder) )
+            if ( registry.getRuntimeInfo(scDTO, failedDTOHolder) )
             {
-                handler.getListenerRegistry().getRuntime(scDTO);
                 contextDTOs.add(scDTO);
             }
         }

Modified: felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java?rev=1681425&r1=1681424&r2=1681425&view=diff
==============================================================================
--- felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java (original)
+++ felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java Sun May 24 08:50:33 2015
@@ -46,14 +46,14 @@ public class HandlerRegistryTest
         final ServletContextDTO dto = new ServletContextDTO();
         dto.serviceId = HttpServiceFactory.HTTP_SERVICE_CONTEXT_SERVICE_ID;
 
-        assertFalse(registry.getRuntime(dto, holder));
+        assertFalse(registry.getRuntimeInfo(dto, holder));
 
         registry.init();
 
-        assertTrue(registry.getRuntime(dto, holder));
+        assertTrue(registry.getRuntimeInfo(dto, holder));
 
         registry.shutdown();
-        assertFalse(registry.getRuntime(dto, holder));
+        assertFalse(registry.getRuntimeInfo(dto, holder));
     }
 
     @Test
@@ -67,28 +67,28 @@ public class HandlerRegistryTest
         dto.servletDTOs = new ServletDTO[0];
 
         Servlet servlet = Mockito.mock(Servlet.class);
-        final ServletInfo info = new ServletInfo("foo", "/foo", 0, Collections.EMPTY_MAP);
+        final ServletInfo info = new ServletInfo("foo", "/foo", 0, Collections.<String, String> emptyMap());
         ServletHandler handler = new HttpServiceServletHandler(null, info, servlet);
 
-        assertTrue(registry.getRuntime(dto, holder));
+        assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals("Precondition", 0, dto.servletDTOs.length);
 
         registry.addServlet(handler);
         Mockito.verify(servlet, Mockito.times(1)).init(Mockito.any(ServletConfig.class));
-        assertTrue(registry.getRuntime(dto, holder));
+        assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals(1, dto.servletDTOs.length);
         assertEquals(info.getServiceId(), dto.servletDTOs[0].serviceId);
 
-        final ServletInfo info2 = new ServletInfo("bar", "/bar", 0, Collections.EMPTY_MAP);
+        final ServletInfo info2 = new ServletInfo("bar", "/bar", 0, Collections.<String, String> emptyMap());
         ServletHandler handler2 = new HttpServiceServletHandler(null, info2, Mockito.mock(Servlet.class));
         registry.addServlet(handler2);
-        assertTrue(registry.getRuntime(dto, holder));
+        assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals(2, dto.servletDTOs.length);
 
-        final ServletInfo info3 = new ServletInfo("zar", "/foo", 0, Collections.EMPTY_MAP);
+        final ServletInfo info3 = new ServletInfo("zar", "/foo", 0, Collections.<String, String> emptyMap());
         ServletHandler handler3 = new HttpServiceServletHandler(null,info3, Mockito.mock(Servlet.class));
         registry.addServlet(handler3);
-        assertTrue(registry.getRuntime(dto, holder));
+        assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals(2, dto.servletDTOs.length);
         assertEquals(1, holder.failedServletDTOs.size());