Author: [email protected]
Date: Thu Apr  7 17:00:12 2011
New Revision: 951

Log:
AMDATU-283 removed possible deadlocks / added lifecycle dependencies for 
(REST)servlets

Modified:
   
branches/AMDATU-283-dev/amdatu-example/course-service/src/main/java/org/amdatu/example/course/service/osgi/Activator.java
   
branches/AMDATU-283-dev/amdatu-opensocial/gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/osgi/Activator.java
   
branches/AMDATU-283-dev/amdatu-opensocial/shindig/src/main/java/org/amdatu/opensocial/shindig/osgi/Activator.java
   
branches/AMDATU-283-dev/amdatu-semanticweb/sparqlendpoint/src/main/java/org/amdatu/semanticweb/sparqlendpoint/Activator.java
   
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
   
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/ServletHandlerRegistry.java
   
branches/AMDATU-283-dev/amdatu-web/rest-wink/src/main/java/org/amdatu/web/rest/wink/service/WinkRegistrationServiceImpl.java

Modified: 
branches/AMDATU-283-dev/amdatu-example/course-service/src/main/java/org/amdatu/example/course/service/osgi/Activator.java
==============================================================================
--- 
branches/AMDATU-283-dev/amdatu-example/course-service/src/main/java/org/amdatu/example/course/service/osgi/Activator.java
   (original)
+++ 
branches/AMDATU-283-dev/amdatu-example/course-service/src/main/java/org/amdatu/example/course/service/osgi/Activator.java
   Thu Apr  7 17:00:12 2011
@@ -29,6 +29,7 @@
 import org.amdatu.libraries.utilities.osgi.ServiceDependentActivator;
 import org.amdatu.opensocial.profile.PersonService;
 import org.amdatu.web.dispatcher.DispatcherService;
+import org.amdatu.web.httpcontext.HttpContextManagerService;
 import org.amdatu.web.httpcontext.ResourceProvider;
 import org.amdatu.web.resource.ResourceSupport;
 import org.amdatu.web.rest.jaxrs.JaxRsSpi;
@@ -36,6 +37,7 @@
 import org.ontoware.rdf2go.model.ModelSet;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.http.HttpContext;
 import org.osgi.service.log.LogService;
 import org.osgi.service.useradmin.UserAdmin;
 
@@ -64,7 +66,10 @@
                 .setImplementation(CourseServiceImpl.class)
                 
.add(createServiceDependency().setService(LogService.class).setRequired(true))
                 
.add(createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true))
-                
.add(createServiceDependency().setService(ModelSet.class).setRequired(true)));
+                
.add(createServiceDependency().setService(ModelSet.class).setRequired(true))
+            .add(
+                createServiceDependency().setService(HttpContext.class,
+                    "(" + HttpContextManagerService.CONTEXT_ID_KEY + "=" + 
CONTEXTID + ")").setRequired(true)));
 
         // Create and register the REST interface for the course service
         Dictionary<String, Object> properties = new Hashtable<String, 
Object>();

Modified: 
branches/AMDATU-283-dev/amdatu-opensocial/gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/osgi/Activator.java
==============================================================================
--- 
branches/AMDATU-283-dev/amdatu-opensocial/gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/osgi/Activator.java
 (original)
+++ 
branches/AMDATU-283-dev/amdatu-opensocial/gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/osgi/Activator.java
 Thu Apr  7 17:00:12 2011
@@ -27,12 +27,14 @@
 import 
org.amdatu.opensocial.gadgetmanagement.service.GadgetManagementServiceImpl;
 import org.amdatu.opensocial.shindig.GadgetStore;
 import org.amdatu.web.dispatcher.DispatcherService;
+import org.amdatu.web.httpcontext.HttpContextManagerService;
 import org.amdatu.web.httpcontext.ResourceProvider;
 import org.amdatu.web.resource.ResourceSupport;
 import org.amdatu.web.rest.jaxrs.JaxRsSpi;
 import org.apache.felix.dm.DependencyManager;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.http.HttpContext;
 import org.osgi.service.log.LogService;
 import org.osgi.service.useradmin.UserAdmin;
 
@@ -79,7 +81,10 @@
                 
.add(createServiceDependency().setService(LogService.class).setRequired(true))
                 
.add(createServiceDependency().setService(ColumnFamilyAvailable.class, 
gadgetFilter).setRequired(true))
                 
.add(createServiceDependency().setService(GadgetStore.class).setRequired(true))
-                
.add(createServiceDependency().setService(CassandraPersistenceManager.class, 
keyspaceFilter).setRequired(true)));
+                
.add(createServiceDependency().setService(CassandraPersistenceManager.class, 
keyspaceFilter).setRequired(true))
+                .add(
+                    createServiceDependency().setService(HttpContext.class,
+                        "(" + HttpContextManagerService.CONTEXT_ID_KEY + "=" + 
CONTEXTID + ")").setRequired(true)));
     }
 
     @Override

Modified: 
branches/AMDATU-283-dev/amdatu-opensocial/shindig/src/main/java/org/amdatu/opensocial/shindig/osgi/Activator.java
==============================================================================
--- 
branches/AMDATU-283-dev/amdatu-opensocial/shindig/src/main/java/org/amdatu/opensocial/shindig/osgi/Activator.java
   (original)
+++ 
branches/AMDATU-283-dev/amdatu-opensocial/shindig/src/main/java/org/amdatu/opensocial/shindig/osgi/Activator.java
   Thu Apr  7 17:00:12 2011
@@ -40,6 +40,7 @@
 import 
org.amdatu.opensocial.shindig.service.TenantHostnameDispatchExtenderFilter;
 import org.amdatu.web.dispatcher.DispatchExtenderFilter;
 import org.amdatu.web.dispatcher.DispatcherService;
+import org.amdatu.web.httpcontext.HttpContextManagerService;
 import org.amdatu.web.httpcontext.ResourceProvider;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
@@ -47,6 +48,7 @@
 import org.apache.shindig.social.opensocial.spi.AppDataService;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.http.HttpContext;
 import org.osgi.service.log.LogService;
 
 /**
@@ -147,6 +149,8 @@
                 .setImplementation(ShindigRegistrationServiceImpl.class)
                 .setInterface(new String[] { ShindigService.class.getName() }, 
null)
                 
.add(createServiceDependency().setService(DispatcherService.class).setRequired(true))
+                .add(createServiceDependency().setService(HttpContext.class,
+                    "(" + HttpContextManagerService.CONTEXT_ID_KEY + "=" + 
CONTEXTID + ")").setRequired(true))
                 
.add(createServiceDependency().setService(LogService.class).setRequired(true))
                 
.add(createServiceDependency().setService(GuiceInjectorService.class).setRequired(true))
                 
.add(createServiceDependency().setService(SocialApiModule.class).setRequired(true))

Modified: 
branches/AMDATU-283-dev/amdatu-semanticweb/sparqlendpoint/src/main/java/org/amdatu/semanticweb/sparqlendpoint/Activator.java
==============================================================================
--- 
branches/AMDATU-283-dev/amdatu-semanticweb/sparqlendpoint/src/main/java/org/amdatu/semanticweb/sparqlendpoint/Activator.java
        (original)
+++ 
branches/AMDATU-283-dev/amdatu-semanticweb/sparqlendpoint/src/main/java/org/amdatu/semanticweb/sparqlendpoint/Activator.java
        Thu Apr  7 17:00:12 2011
@@ -23,6 +23,7 @@
 import org.amdatu.opensocial.gadgetmanagement.GadgetManagement;
 import org.amdatu.semanticweb.sparqlendpoint.service.SPARQLEndpointServiceImpl;
 import org.amdatu.web.dispatcher.DispatcherService;
+import org.amdatu.web.httpcontext.HttpContextManagerService;
 import org.amdatu.web.httpcontext.ResourceProvider;
 import org.amdatu.web.jsp.JspSupport;
 import org.amdatu.web.resource.ResourceSupport;
@@ -58,11 +59,17 @@
         properties.put(JspSupport.JSP_ALIAS_KEY, JSP_ALIAS);
         properties.put(ResourceSupport.RESOURCE_ALIAS_KEY, RES_ALIAS);
 
-        
manager.add(createComponent().setInterface(ResourceProvider.class.getName(), 
properties).setImplementation(
-            SPARQLEndpointServiceImpl.class).add(
-                
createServiceDependency().setService(LogService.class).setRequired(true))
+        // TODO Revisit this class. As it is both ResourceProvider and JAX-RS
+        // service it can not depend on it's own HttpContext. Therefore it now
+        // depends on the HttpContextManagerService
+        manager.add(createComponent()
+            .setInterface(ResourceProvider.class.getName(), properties)
+            .setImplementation(
+                SPARQLEndpointServiceImpl.class)
+            
.add(createServiceDependency().setService(LogService.class).setRequired(true))
                 
.add(createServiceDependency().setService(GadgetManagement.class).setRequired(true))
-                
.add(createServiceDependency().setService(ModelSet.class).setRequired(true)));
+                
.add(createServiceDependency().setService(ModelSet.class).setRequired(true))
+            
.add(createServiceDependency().setService(HttpContextManagerService.class).setRequired(true)));
     }
 
     @Override

Modified: 
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
==============================================================================
--- 
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
    (original)
+++ 
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/FilterHandlerRegistry.java
    Thu Apr  7 17:00:12 2011
@@ -37,6 +37,13 @@
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.log.LogService;
 
+/**
+ * Handler registry that manages <code>FilterHandler</code> instances lifecycle
+ * based on <code>HttpContext</code> availability
+ * 
+ * TODO revisit threadsafety / spawning threads
+ * TODO add eager filter matching and optimize
+ */
 public final class FilterHandlerRegistry extends AbstractHandlerRegistry {
 
     private final ReentrantReadWriteLock m_extenderFilterHandlersLock = new 
ReentrantReadWriteLock();
@@ -114,12 +121,16 @@
             if (!m_extenderFilterHandlers.containsKey(serviceReference)) {
                 throw new IllegalStateException("unforseen unknown 
extender....");
             }
-            FilterHandler handler = 
m_extenderFilterHandlers.remove(serviceReference);
+            final FilterHandler handler = 
m_extenderFilterHandlers.remove(serviceReference);
             m_extenderFilterHandlerArray =
                 m_extenderFilterHandlers.values().toArray(new 
FilterHandler[m_extenderFilterHandlers.size()]);
             Arrays.sort(m_extenderFilterHandlerArray);
             if (handler != null) {
-                handler.destroy();
+                new Thread(new Runnable() {
+                    public void run() {
+                        handler.destroy();
+                    }
+                }).start();
             }
         }
         finally {
@@ -188,10 +199,14 @@
             if (!m_filterHandlers.containsKey(serviceReference)) {
                 throw new IllegalStateException("Unexpected.... ");
             }
-            FilterHandler filterHandler = 
m_filterHandlers.remove(serviceReference);
+            final FilterHandler filterHandler = 
m_filterHandlers.remove(serviceReference);
             m_tenantFilterHandlerArrays.clear();
             if (filterHandler != null) {
-                filterHandler.destroy();
+                new Thread(new Runnable() {
+                    public void run() {
+                        filterHandler.destroy();
+                    }
+                }).start();
             }
         }
         finally {
@@ -265,18 +280,22 @@
         m_extenderFilterHandlersLock.readLock().lock();
         try {
 
-            for (FilterHandler handler : m_extenderFilterHandlers.values()) {
+            for (final FilterHandler handler : 
m_extenderFilterHandlers.values()) {
                 if (!handler.isActive() && 
handler.getContextId().equals(contextId)) {
                     HandlerServletContext servletContextWrapper =
                         new HandlerServletContext(getServletContext(), 
context);
                     handler.setExtServletContext(servletContextWrapper);
-                    try {
-                        handler.init();
-                    }
-                    catch (ServletException e) {
-                        // TODO Auto-generated catch block
-                        e.printStackTrace();
-                    }
+
+                    new Thread(new Runnable() {
+                        public void run() {
+                            try {
+                                handler.init();
+                            }
+                            catch (ServletException e) {
+                                handler.destroy();
+                            }
+                        }
+                    }).start();
                 }
             }
         }
@@ -287,18 +306,21 @@
         m_filterHandlersLock.readLock().lock();
         try {
 
-            for (FilterHandler handler : m_filterHandlers.values()) {
+            for (final FilterHandler handler : m_filterHandlers.values()) {
                 if (!handler.isActive() && 
handler.getContextId().equals(contextId)) {
                     HandlerServletContext servletContextWrapper =
                         new HandlerServletContext(getServletContext(), 
context);
                     handler.setExtServletContext(servletContextWrapper);
-                    try {
-                        handler.init();
-                    }
-                    catch (ServletException e) {
-                        // TODO Auto-generated catch block
-                        e.printStackTrace();
-                    }
+                    new Thread(new Runnable() {
+                        public void run() {
+                            try {
+                                handler.init();
+                            }
+                            catch (ServletException e) {
+                                handler.destroy();
+                            }
+                        }
+                    }).start();
                 }
             }
         }
@@ -311,9 +333,13 @@
     public void httpContextRemoved(String contextId) {
         m_extenderFilterHandlersLock.readLock().lock();
         try {
-            for (FilterHandler handler : m_extenderFilterHandlers.values()) {
+            for (final FilterHandler handler : 
m_extenderFilterHandlers.values()) {
                 if (handler.isActive() && 
handler.getContextId().equals(contextId)) {
-                    handler.destroy();
+                    new Thread(new Runnable() {
+                        public void run() {
+                            handler.destroy();
+                        }
+                    }).start();
                 }
             }
         }
@@ -323,9 +349,13 @@
 
         m_filterHandlersLock.readLock().lock();
         try {
-            for (FilterHandler handler : m_filterHandlers.values()) {
+            for (final FilterHandler handler : m_filterHandlers.values()) {
                 if (handler.isActive() && 
handler.getContextId().equals(contextId)) {
-                    handler.destroy();
+                    new Thread(new Runnable() {
+                        public void run() {
+                            handler.destroy();
+                        }
+                    }).start();
                 }
             }
         }

Modified: 
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/ServletHandlerRegistry.java
==============================================================================
--- 
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/ServletHandlerRegistry.java
   (original)
+++ 
branches/AMDATU-283-dev/amdatu-web/dispatcher/src/main/java/org/amdatu/web/dispatcher/handler/ServletHandlerRegistry.java
   Thu Apr  7 17:00:12 2011
@@ -36,6 +36,13 @@
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.log.LogService;
 
+/**
+ * Handler registry that manages <code>FilterHandler</code> instances lifecycle
+ * based on <code>HttpContext</code> availability
+ * 
+ * TODO revisit threadsafety / spawning threads
+ * TODO consider caching for getServletHandler
+ */
 public final class ServletHandlerRegistry extends AbstractHandlerRegistry {
 
     private final ReentrantReadWriteLock m_servletHandlersLock = new 
ReentrantReadWriteLock();
@@ -90,8 +97,15 @@
         try {
 
             for (ServletHandler handler : m_servletHandlers.values()) {
-                if (handler.isActive() && 
handler.getContextId().equals(contextId)) {
-                    handler.destroy();
+                final ServletHandler finalHandler = handler;
+                if (finalHandler.isActive() && 
finalHandler.getContextId().equals(contextId)) {
+
+                    // outside lock
+                    new Thread(new Runnable() {
+                        public void run() {
+                            finalHandler.destroy();
+                        }
+                    }).start();
                 }
             }
         }
@@ -161,9 +175,17 @@
             if (!m_servletHandlers.containsKey(serviceReference)) {
                 return;
             }
-            ServletHandler servletHandler = 
m_servletHandlers.remove(serviceReference);
+            final ServletHandler servletHandler = 
m_servletHandlers.remove(serviceReference);
             m_tenantServletHandlerArrays.clear();
             if (servletHandler != null) {
+
+                // outside lock
+                new Thread(new Runnable() {
+                    public void run() {
+                        servletHandler.destroy();
+                    }
+                }).start();
+
                 servletHandler.destroy();
             }
         }

Modified: 
branches/AMDATU-283-dev/amdatu-web/rest-wink/src/main/java/org/amdatu/web/rest/wink/service/WinkRegistrationServiceImpl.java
==============================================================================
--- 
branches/AMDATU-283-dev/amdatu-web/rest-wink/src/main/java/org/amdatu/web/rest/wink/service/WinkRegistrationServiceImpl.java
        (original)
+++ 
branches/AMDATU-283-dev/amdatu-web/rest-wink/src/main/java/org/amdatu/web/rest/wink/service/WinkRegistrationServiceImpl.java
        Thu Apr  7 17:00:12 2011
@@ -118,7 +118,7 @@
             .setInterface(Servlet.class.getName(), initParams)
             .setImplementation(restServlet)
             .setCallbacks("_init", "start", "stop", "_destroy");
-
+        
         // threadsafe
         if (m_servletComponents.putIfAbsent(serviceReference, 
servletComponent) == null) {
             m_dependencyManager.add(servletComponent);
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to