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