Author: angelo.vandersijpt at luminis.eu
Date: Wed Dec 22 21:38:04 2010
New Revision: 540
Log:
AMDATU-128 The JSP handler now uses only the whiteboard mechanism for servlets.
Modified:
trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/osgi/Activator.java
trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/service/ResourceProviderListener.java
Modified:
trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/osgi/Activator.java
==============================================================================
--- trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/osgi/Activator.java
(original)
+++ trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/osgi/Activator.java
Wed Dec 22 21:38:04 2010
@@ -42,7 +42,6 @@
.setImplementation(ResourceProviderListener.class)
.add(createServiceDependency().setService(LogService.class).setRequired(true))
.add(createServiceDependency().setService(HttpContextServiceFactory.class).setRequired(true))
-
.add(createServiceDependency().setService(HttpService.class).setRequired(true))
.add(createServiceDependency().setService(ResourceProvider.class).setCallbacks("onAdded",
"onRemoved")));
}
Modified:
trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/service/ResourceProviderListener.java
==============================================================================
---
trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/service/ResourceProviderListener.java
(original)
+++
trunk/amdatu-web/jsp/src/main/java/org/amdatu/web/jsp/service/ResourceProviderListener.java
Wed Dec 22 21:38:04 2010
@@ -17,15 +17,11 @@
package org.amdatu.web.jsp.service;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
+import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.amdatu.web.httpcontext.HttpContextServiceFactory;
@@ -35,9 +31,6 @@
import org.apache.felix.dm.DependencyManager;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
-import org.osgi.service.http.HttpContext;
-import org.osgi.service.http.HttpService;
-import org.osgi.service.http.NamespaceException;
import org.osgi.service.log.LogService;
/**
@@ -65,14 +58,11 @@
private volatile BundleContext m_bundleContext;
private volatile LogService m_logService;
private volatile HttpContextServiceFactory m_httpContextFactoryService;
- private volatile HttpService m_httpService;
private volatile DependencyManager m_dependencyManager;
// Http context variables
private Component m_httpContextComponent;
- private HttpContext m_httpContext;
- List<ResourceProvider> m_resourceProviders = new
ArrayList<ResourceProvider>();
Map<String, Component> m_components = new HashMap<String, Component>();
// This lock prevents concurrency issues caused by onAdded callback method
being invoked during service destruction
@@ -82,21 +72,20 @@
public void init() {
// Create our own http context and register resources
m_httpContextComponent =
m_httpContextFactoryService.create(m_bundleContext, this);
- m_httpContext = (HttpContext) m_httpContextComponent.getService();
}
public void destroy() {
// When this service itself is stopped for any reason, onRemoved will
not be invoked on the providers
// and the corresponding JSP servlet would not be unregistered,
resulting in a 'alias already in use'
- // error upon starting this service. Therefore we explicitly invoke
onRemoved on all available
- // resource providers ourselves here
+ // error upon starting this service.
// First retrieve a write destruction lock, to prevent new resource
providers to be registered during destruction.
WriteLock destructionLock = m_destructionLock.writeLock();
destructionLock.lock();
try {
- while (m_resourceProviders.size() > 0) {
- onRemoved(m_resourceProviders.get(0));
+ for (Component component : m_components.values()) {
+ m_dependencyManager.remove(component);
}
+ m_components.clear();
m_httpContextComponent.stop();
}
finally {
@@ -112,12 +101,16 @@
// After retrieving the destruction lock, be sure the bundle is
not being stopped (we might have been waiting for
// the destruction lock to be released by the destroy() method)
if (m_bundleContext.getBundle().getState() != Bundle.STOPPING) {
- Dictionary<String, String> initParams = new Hashtable<String,
String>();
String servletAlias = getServletAlias(provider);
+ Properties servletProps = new Properties();
+ servletProps.put("alias", servletAlias);
+ servletProps.put("contextId", Activator.RESOURCE_ID);
+
// Instantiate new ResourceProviderJspServlet service
ResourceProviderJspServlet jspServlet = new
ResourceProviderJspServlet(provider);
Component component = m_dependencyManager.createComponent()
+ .setInterface(Servlet.class.getName(), servletProps)
.setImplementation(jspServlet)
.add(m_dependencyManager.createServiceDependency()
.setService(LogService.class)
@@ -127,22 +120,6 @@
// Add the component to the dependency manager
m_components.put(normalizeResourceId(provider), component);
m_dependencyManager.add(component);
-
- try {
- m_httpService.registerServlet(servletAlias, jspServlet,
initParams, m_httpContext);
- m_resourceProviders.add(provider);
-
- }
- catch (ServletException e) {
- m_logService.log(LogService.LOG_ERROR, "Could not register
JSP servlet on alias '" + servletAlias
- + "' for resource provider " + provider, e);
- return;
- }
- catch (NamespaceException e) {
- m_logService.log(LogService.LOG_ERROR, "Could not register
JSP servlet on alias '" + servletAlias
- + "' for resource provider " +
provider.getResourceId(), e);
- return;
- }
}
else {
m_logService.log(LogService.LOG_INFO, "Bundle state of JSP
bundle is '"
@@ -158,13 +135,8 @@
// This callback is invoked for each ResourceProvider that becomes
unavailable
public void onRemoved(ResourceProvider provider) {
- try {
- String alias = getServletAlias(provider);
- m_httpService.unregister(alias);
-
m_dependencyManager.remove(m_components.get(normalizeResourceId(provider)));
- }
- finally {
- m_resourceProviders.remove(provider);
+ if (m_components.containsKey(normalizeResourceId(provider))) {
+
m_dependencyManager.remove(m_components.remove(normalizeResourceId(provider)));
}
m_logService.log(LogService.LOG_DEBUG, "JSP servlet removed for
resource provider " + provider.getResourceId());
}