Author: bdekruijff at gmail.com
Date: Tue Feb  1 11:05:54 2011
New Revision: 737

Log:
AMDATU-245 extenderfilter mechanism changed to services

Modified:
   
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/DispatcherService.java
   
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenanHostNameDispatchExtender.java
   
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenantParameterDispatchExtender.java
   
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
   
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/osgi/DispatcherServiceActivator.java
   
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/service/DispatcherServiceImpl.java

Modified: 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/DispatcherService.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/DispatcherService.java
     (original)
+++ 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/DispatcherService.java
     Tue Feb  1 11:05:54 2011
@@ -25,17 +25,16 @@
 
 public interface DispatcherService {
 
-    
     public final static String CONTEXT_ID_KEY = "contextId";
     public final static String PATTERN_KEY = "pattern";
     public final static String ALIAS_KEY = "alias";
     public final static String INIT_KEY_PREFIX = "init.";
 
-//    HttpServlet getServletByAlias(String alias);
-
-    public FilterPipeline getFilterPipeline(HttpServletRequest 
httpServletRequest);
+    FilterPipeline getFilterPipeline(HttpServletRequest httpServletRequest);
 
     HttpContextManager getHttpContextManager();
+
     LogService getLogService();
+
     ServletContext getServletContext();
 }

Modified: 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenanHostNameDispatchExtender.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenanHostNameDispatchExtender.java
        (original)
+++ 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenanHostNameDispatchExtender.java
        Tue Feb  1 11:05:54 2011
@@ -16,13 +16,16 @@
 import org.amdatu.core.tenant.TenantException;
 import org.amdatu.core.tenant.TenantManagementService;
 import org.amdatu.web.dispatcher.DispatchExtenderFilter;
+import org.amdatu.web.dispatcher.DispatcherService;
+import org.osgi.service.log.LogService;
 
 public final class TenanHostNameDispatchExtender implements 
DispatchExtenderFilter {
 
     public final static String TENANT_REQUESTCONTEXT_KEY = 
"org.amdatu.web.dispatcher.TENANT";
     public final static String TENANT_PROPERTY_PARAMETER = "hostname";
 
-    private TenantManagementService m_tenantManagementService;
+    private volatile TenantManagementService m_tenantManagementService;
+    private volatile LogService m_logService;
 
     public void setTenentManagementService(TenantManagementService 
tenantManagementService) {
         m_tenantManagementService = tenantManagementService;

Modified: 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenantParameterDispatchExtender.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenantParameterDispatchExtender.java
      (original)
+++ 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/extender/TenantParameterDispatchExtender.java
      Tue Feb  1 11:05:54 2011
@@ -13,13 +13,16 @@
 import org.amdatu.core.tenant.TenantException;
 import org.amdatu.core.tenant.TenantManagementService;
 import org.amdatu.web.dispatcher.DispatchExtenderFilter;
+import org.osgi.service.log.LogService;
 
 public final class TenantParameterDispatchExtender implements 
DispatchExtenderFilter {
 
     public final static String TENANT_REQUESTCONTEXT_KEY = 
"org.amdatu.web.dispatcher.TENANT";
     public final static String TENANT_REQUEST_PARAMETER = "tenant";
 
-    private TenantManagementService m_tenantManagementService;
+    private volatile TenantManagementService m_tenantManagementService;
+    private volatile LogService m_logService;
+
 
     public void setTenentManagementService(TenantManagementService 
tenantManagementService) {
         m_tenantManagementService = tenantManagementService;

Modified: 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
 (original)
+++ 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
 Tue Feb  1 11:05:54 2011
@@ -10,6 +10,7 @@
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 
+import org.amdatu.web.dispatcher.DispatchExtenderFilter;
 import org.amdatu.web.dispatcher.DispatchFilterMatcher;
 import org.amdatu.web.dispatcher.DispatcherService;
 import org.amdatu.web.dispatcher.context.HandlerServletContext;
@@ -21,47 +22,68 @@
     private final Map<ServiceReference, FilterHandler> m_filterHandlers =
         new HashMap<ServiceReference, FilterHandler>();
 
-    private final Map<Filter, FilterHandler> m_extenderFilterHandlers = new 
HashMap<Filter, FilterHandler>();
+    private final Map<ServiceReference, FilterHandler> 
m_extenderFilterHandlers =
+        new HashMap<ServiceReference, FilterHandler>();
     private Set<DispatchFilterMatcher> m_matchers = new 
HashSet<DispatchFilterMatcher>();
 
     public FilterHandlerRegistry(DispatcherService dispatcherService) {
         super(dispatcherService);
     }
 
-    public void addDispatchFilterMatcher(DispatchFilterMatcher 
dispatchFilterMatcher) {
-        if (m_matchers.contains(dispatchFilterMatcher)) {
-            throw new IllegalStateException("unforseen duplicate matcher....");
+    public void addDispatchExtenderFilter(ServiceReference serviceReference, 
DispatchExtenderFilter extenderFilter) {
+        if (m_extenderFilterHandlers.containsKey(serviceReference)) {
+            throw new IllegalStateException("Unexpected.... ");
         }
-        m_matchers.add(dispatchFilterMatcher);
-    }
 
-    public void removeDispatchFilterMatcher(DispatchFilterMatcher 
dispatchFilterMatcher) {
-        if (!m_matchers.contains(dispatchFilterMatcher)) {
-            throw new IllegalStateException("unforseen unknown matcher....");
+        int ranking = getIntProperty(serviceReference, 
Constants.SERVICE_RANKING, 0);
+        String pattern = getStringProperty(serviceReference, 
DispatcherService.PATTERN_KEY);
+        if (pattern == null) {
+            return;
         }
-        m_matchers.remove(dispatchFilterMatcher);
-    }
 
-    public void addDispatchExtenderFilter(FilterHandler handler)
-        throws ServletException {
-        if (m_extenderFilterHandlers.containsKey(handler.getFilter())) {
+        HandlerServletContext extServletContextWrapper =
+            new HandlerServletContext(getServletContext(), 
getHttpContext(serviceReference));
+        FilterHandler filterHandler =
+            new FilterHandler(this, extServletContextWrapper, extenderFilter, 
pattern, ranking, null);
+        filterHandler.setInitParams(getInitParams(serviceReference));
+
+        if (m_extenderFilterHandlers.containsKey(serviceReference)) {
             throw new IllegalStateException("unforseen duplicate 
extender....");
         }
 
-        handler.init();
-        m_extenderFilterHandlers.put(handler.getFilter(), handler);
+        try {
+            filterHandler.init();
+            m_extenderFilterHandlers.put(serviceReference, filterHandler);
+        }
+        catch (ServletException e) {
+            e.printStackTrace();
+        }
     }
 
-    public void removeDispatchExtenderFilter(Filter filter) {
-        if (!m_extenderFilterHandlers.containsKey(filter)) {
+    public void removeDispatchExtenderFilter(ServiceReference 
serviceReference, DispatchExtenderFilter extenderFilter) {
+        if (!m_extenderFilterHandlers.containsKey(serviceReference)) {
             throw new IllegalStateException("unforseen unknown extender....");
         }
-        FilterHandler handler = m_extenderFilterHandlers.remove(filter);
+        FilterHandler handler = 
m_extenderFilterHandlers.remove(serviceReference);
         if (handler != null) {
             handler.destroy();
         }
     }
 
+    public void addDispatchFilterMatcher(DispatchFilterMatcher 
dispatchFilterMatcher) {
+        if (m_matchers.contains(dispatchFilterMatcher)) {
+            throw new IllegalStateException("unforseen duplicate matcher....");
+        }
+        m_matchers.add(dispatchFilterMatcher);
+    }
+
+    public void removeDispatchFilterMatcher(DispatchFilterMatcher 
dispatchFilterMatcher) {
+        if (!m_matchers.contains(dispatchFilterMatcher)) {
+            throw new IllegalStateException("unforseen unknown matcher....");
+        }
+        m_matchers.remove(dispatchFilterMatcher);
+    }
+
     public void addFilterHandler(ServiceReference serviceReference, Filter 
filter) {
         if (m_filterHandlers.containsKey(serviceReference)) {
             throw new IllegalStateException("Unexpected.... ");

Modified: 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/osgi/DispatcherServiceActivator.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/osgi/DispatcherServiceActivator.java
       (original)
+++ 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/osgi/DispatcherServiceActivator.java
       Tue Feb  1 11:05:54 2011
@@ -24,13 +24,17 @@
 
 import org.amdatu.core.tenant.Tenant;
 import org.amdatu.core.tenant.TenantManagementService;
+import org.amdatu.web.dispatcher.DispatchExtenderFilter;
 import org.amdatu.web.dispatcher.DispatcherService;
+import org.amdatu.web.dispatcher.extender.TenanHostNameDispatchExtender;
+import org.amdatu.web.dispatcher.extender.TenantParameterDispatchExtender;
 import org.amdatu.web.dispatcher.service.DispatcherServiceImpl;
 import org.amdatu.web.dispatcher.test.HelloWorldServlet;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.http.api.ExtHttpService;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.log.LogService;
 
@@ -46,7 +50,11 @@
                     .setImplementation(DispatcherServiceImpl.class)
                     
.add(createServiceDependency().setService(ExtHttpService.class).setRequired(true))
                     
.add(createServiceDependency().setService(LogService.class).setRequired(true))
-                    
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true))
+                    .add(
+                        createServiceDependency()
+                            .setService(DispatchExtenderFilter.class)
+                            .setCallbacks("addExtenderFilter", 
"removeExtenderFilter")
+                            .setRequired(false))
                     .add(
                         createServiceDependency()
                             .setService(HttpContext.class)
@@ -64,6 +72,30 @@
                             .setRequired(false))
                 );
 
+        Dictionary<String, Object> thProperties = new Hashtable<String, 
Object>();
+        thProperties.put(Constants.SERVICE_RANKING, 0);
+        thProperties.put(DispatcherService.PATTERN_KEY, ".*");
+        manager.add(
+                createComponent()
+                    .setInterface(DispatchExtenderFilter.class.getName(), 
thProperties)
+                    .setImplementation(TenanHostNameDispatchExtender.class)
+                    // Guards filter lifecycle
+                    
.add(createServiceDependency().setService(DispatcherService.class).setRequired(true))
+                    
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true))
+                    
.add(createServiceDependency().setService(LogService.class).setRequired(true)));
+
+        Dictionary<String, Object> tpProperties = new Hashtable<String, 
Object>();
+        tpProperties.put(Constants.SERVICE_RANKING, 0);
+        tpProperties.put(DispatcherService.PATTERN_KEY, ".*");
+        manager.add(
+                createComponent()
+                    .setInterface(DispatchExtenderFilter.class.getName(), 
tpProperties)
+                    .setImplementation(TenantParameterDispatchExtender.class)
+                    // Guards filter lifecycle
+                    
.add(createServiceDependency().setService(DispatcherService.class).setRequired(true))
+                    
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true))
+                    
.add(createServiceDependency().setService(LogService.class).setRequired(true)));
+
         // test servlets
         Dictionary<String, String> props = new Hashtable<String, String>();
         props.put("alias", "/hello/world");

Modified: 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/service/DispatcherServiceImpl.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/service/DispatcherServiceImpl.java
 (original)
+++ 
branches/amdatu-dispatcher/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/service/DispatcherServiceImpl.java
 Tue Feb  1 11:05:54 2011
@@ -24,17 +24,14 @@
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 
-import org.amdatu.core.tenant.TenantManagementService;
+import org.amdatu.web.dispatcher.DispatchExtenderFilter;
 import org.amdatu.web.dispatcher.DispatcherService;
 import org.amdatu.web.dispatcher.context.DefaultHttpContext;
 import org.amdatu.web.dispatcher.context.HandlerServletContext;
 import org.amdatu.web.dispatcher.context.HttpContextManager;
 import org.amdatu.web.dispatcher.dispatch.FilterPipeline;
 import org.amdatu.web.dispatcher.dispatch.ServletPipeline;
-import org.amdatu.web.dispatcher.extender.TenanHostNameDispatchExtender;
-import org.amdatu.web.dispatcher.extender.TenantParameterDispatchExtender;
 import org.amdatu.web.dispatcher.filter.DispatchInterceptFilter;
-import org.amdatu.web.dispatcher.handler.FilterHandler;
 import org.amdatu.web.dispatcher.handler.FilterHandlerRegistry;
 import org.amdatu.web.dispatcher.handler.ServletHandlerRegistry;
 import org.amdatu.web.dispatcher.matcher.TenantAwareServletMatcher;
@@ -50,7 +47,6 @@
     private volatile BundleContext m_bundleContext;
     private volatile LogService m_logService;
     private volatile ExtHttpService m_httpService;
-    private volatile TenantManagementService m_tenantManagementService;
 
     private DispatchInterceptFilter m_interceptorFilter;
     private HttpContextManager m_httpContextManager;
@@ -80,20 +76,6 @@
         HandlerServletContext extServletContextWrapper =
             new HandlerServletContext(m_extServletContext, new 
DefaultHttpContext(m_bundleContext.getBundle()));
 
-        TenanHostNameDispatchExtender the = new 
TenanHostNameDispatchExtender();
-        the.setTenentManagementService(m_tenantManagementService);
-        FilterHandler theHandler =
-            new FilterHandler(m_filterHandlerRegistry, 
extServletContextWrapper, the, ".*", 0, null);
-        theHandler.setInitParams(null);
-        m_filterHandlerRegistry.addDispatchExtenderFilter(theHandler);
-
-        TenantParameterDispatchExtender tde = new 
TenantParameterDispatchExtender();
-        tde.setTenentManagementService(m_tenantManagementService);
-        FilterHandler tdeHandler =
-            new FilterHandler(m_filterHandlerRegistry, 
extServletContextWrapper, tde, ".*", 0, null);
-        tdeHandler.setInitParams(null);
-        m_filterHandlerRegistry.addDispatchExtenderFilter(tdeHandler);
-
         m_httpContextManager = new HttpContextManager();
 
         m_interceptorFilter = new DispatchInterceptFilter();
@@ -123,6 +105,16 @@
         m_logService.log(LogService.LOG_INFO, 
DispatcherServiceImpl.class.getSimpleName() + " stopped");
     }
 
+    public void addExtenderFilter(ServiceReference serviceReference, Object 
service) {
+        DispatchExtenderFilter extenderFilter = (DispatchExtenderFilter) 
service;
+        m_filterHandlerRegistry.addDispatchExtenderFilter(serviceReference, 
extenderFilter);
+    }
+
+    public void removeExtenderFilter(ServiceReference serviceReference, Object 
service) {
+        DispatchExtenderFilter extenderFilter = (DispatchExtenderFilter) 
service;
+        m_filterHandlerRegistry.removeDispatchExtenderFilter(serviceReference, 
extenderFilter);
+    }
+
     public void addHttpContext(ServiceReference serviceReference, Object 
service) {
         HttpContext httpContext = (HttpContext) service;
         Bundle bundle = serviceReference.getBundle();

Reply via email to