Author: ivol
Date: Fri Oct 22 09:19:02 2010
New Revision: 203
Log:
[AMDATU-104] Replaced last service trackers with dependency manager
Removed:
trunk/platform-bundles/tenant-service/src/main/java/org/amdatu/platform/tenant/TenantAwareServiceAdapter.java
trunk/platform-bundles/tenant-service/src/main/java/org/amdatu/platform/tenant/service/TenantAwareServiceAdapterImpl.java
Modified:
trunk/platform-bundles/tenant-service/src/main/java/org/amdatu/platform/tenant/osgi/Activator.java
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/osgi/Activator.java
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/service/WinkRegistrationServiceImpl.java
trunk/readme.txt
Modified:
trunk/platform-bundles/tenant-service/src/main/java/org/amdatu/platform/tenant/osgi/Activator.java
==============================================================================
---
trunk/platform-bundles/tenant-service/src/main/java/org/amdatu/platform/tenant/osgi/Activator.java
(original)
+++
trunk/platform-bundles/tenant-service/src/main/java/org/amdatu/platform/tenant/osgi/Activator.java
Fri Oct 22 09:19:02 2010
@@ -21,11 +21,9 @@
import org.amdatu.platform.cassandra.listener.ColumnFamilyAvailable;
import org.amdatu.platform.cassandra.listener.ColumnFamilyProvider;
import
org.amdatu.platform.cassandra.persistencemanager.CassandraPersistenceManager;
-import org.amdatu.platform.tenant.TenantAwareServiceAdapter;
import org.amdatu.platform.tenant.TenantDAO;
import org.amdatu.platform.tenant.TenantManagementService;
import org.amdatu.platform.tenant.dao.TenantDAOCassandraImpl;
-import org.amdatu.platform.tenant.service.TenantAwareServiceAdapterImpl;
import org.amdatu.platform.tenant.service.TenantColumnFamilyProvider;
import org.amdatu.platform.tenant.service.TenantManagementServiceImpl;
import org.apache.felix.dm.DependencyActivatorBase;
@@ -69,12 +67,6 @@
.setInterface(TenantManagementService.class.getName(), null)
.add(createServiceDependency().setService(TenantDAO.class).setRequired(true))
.add(createServiceDependency().setService(LogService.class).setRequired(true)));
-
- // Create and register a tenant aware service adapter
- manager.add(
- createComponent()
- .setImplementation(TenantAwareServiceAdapterImpl.class)
- .setInterface(TenantAwareServiceAdapter.class.getName(),
null));
}
@Override
Modified:
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/osgi/Activator.java
==============================================================================
---
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/osgi/Activator.java
(original)
+++
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/osgi/Activator.java
Fri Oct 22 09:19:02 2010
@@ -43,6 +43,7 @@
.setImplementation(WinkRegistrationServiceImpl.class)
.add(createServiceDependency().setService(LogService.class).setRequired(true))
.add(createServiceDependency().setService(HttpContextServiceFactory.class).setRequired(true))
+
.add(createServiceDependency().setService("(objectclass=*)").setCallbacks("onAdded",
"onRemoved"))
.add(createServiceDependency().setService(HttpService.class).setRequired(true)));
}
Modified:
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/service/WinkRegistrationServiceImpl.java
==============================================================================
---
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/service/WinkRegistrationServiceImpl.java
(original)
+++
trunk/platform-bundles/wink-application/src/main/java/org/amdatu/platform/wink/service/WinkRegistrationServiceImpl.java
Fri Oct 22 09:19:02 2010
@@ -18,18 +18,19 @@
import static org.amdatu.platform.wink.osgi.Activator.RESOURCE_ID;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+
import javax.servlet.ServletException;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
-import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Variant.VariantListBuilder;
import javax.ws.rs.ext.RuntimeDelegate;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.List;
import org.amdatu.platform.httpcontext.HttpContextServiceFactory;
import org.amdatu.platform.httpcontext.ResourceProvider;
@@ -37,17 +38,15 @@
import org.apache.wink.common.internal.runtime.RuntimeDelegateImpl;
import org.apache.wink.server.utils.RegistrationUtils;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
import org.osgi.service.log.LogService;
-import org.osgi.util.tracker.ServiceTracker;
/**
* This class is responsible for booting Wink as well as registration of
dynamic resources.
+ *
* @author ivol
*/
public class WinkRegistrationServiceImpl implements ResourceProvider {
@@ -62,12 +61,10 @@
// List of registered servlets, stored to be sure the servlet is registerd
before unregistering it
private List<String> m_registeredServlets = new ArrayList<String>();
-
+
// Our HTTP context
private Component m_httpContextComponent;
private HttpContext m_httpContext;
-
- private RESTResourceTracker m_restResourceTracker;
/**
* The init() method is invoked by the Felix dependency manager.
@@ -76,19 +73,10 @@
// Create our own http context and register resources
m_httpContextComponent =
m_httpContextServiceFactory.create(m_bundleContext, this);
m_httpContext = (HttpContext) m_httpContextComponent.getService();
-
+
// Set the runtime delegate
setRuntimeDelegate();
- // Create a service tracker to monitor RESTService services.
- try {
- Filter filter = m_bundleContext.createFilter("(objectClass=*)");
- m_restResourceTracker = new RESTResourceTracker(filter);
- m_restResourceTracker.open(true);
- } catch (InvalidSyntaxException e) {
- m_logService.log(LogService.LOG_ERROR, "Could not register REST
resource service tracker", e);
- }
-
m_logService.log(LogService.LOG_INFO, getClass().getName() + " service
initialized");
}
@@ -102,14 +90,12 @@
m_httpService.unregister(servletUrl);
m_registeredServlets.remove(servletUrl);
m_logService.log(LogService.LOG_INFO, "Wink application
unregistered REST servlet '" + servletUrl
- + "'");
+ + "'");
}
-
- m_restResourceTracker.close();
-
+
// Stop the HTTP context service we created ourselves
m_httpContextComponent.stop();
-
+
m_logService.log(LogService.LOG_INFO, getClass().getName() + " service
destroyed");
}
@@ -128,7 +114,7 @@
// The nasty fix is to set some dummy RuntimeDelegate first, then set
the Wink RuntimeDelegateImpl
RuntimeDelegate.setInstance(new RuntimeDelegate() {
public <T> T createEndpoint(Application arg0, Class<T> arg1)
throws IllegalArgumentException,
- UnsupportedOperationException {
+ UnsupportedOperationException {
return null;
}
@@ -151,87 +137,74 @@
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
}
- /**
- * Service tracker for REST resources.
- * @author ivol
- */
- private class RESTResourceTracker extends ServiceTracker {
- /**
- * Constructor.
- */
- private RESTResourceTracker(Filter filter) {
- super(m_bundleContext, filter, null);
- }
-
- public Object addingService(ServiceReference ref) {
- // Check if this is a JAX-RS annotated class
- Object service = m_bundleContext.getService(ref);
- if (service.getClass().getAnnotation(Path.class) != null) {
- // Register a new REST servlet for this REST resource
- addRestServlet(service);
- }
- return context.getService(ref);
+ public void onAdded(ServiceReference ref, Object service) {
+ // Check if this is a JAX-RS annotated class
+ if (service.getClass().getAnnotation(Path.class) != null) {
+ // Register a new REST servlet for this REST resource
+ addRestServlet(service);
}
+ }
- public void removedService(ServiceReference ref, Object obj) {
- // Check if this is a JAX-RS annotated class
- Object service = m_bundleContext.getService(ref);
- if (service.getClass().getAnnotation(Path.class) != null) {
- // Unregister the REST servlet registered earlier this REST
resource
- removeRestServlet(service);
- }
+ public void onRemoved(ServiceReference ref, Object service) {
+ // Check if this is a JAX-RS annotated class
+ if (service.getClass().getAnnotation(Path.class) != null) {
+ // Unregister the REST servlet registered earlier this REST
resource
+ removeRestServlet(service);
}
+ }
- /**
- * Registers a new REST servlet for this resource.
- * @param service The REST resource service to register the servlet for
- */
- private void addRestServlet(Object service) {
- synchronized (m_registeredServlets) {
- try {
- // Initialize the servlet
- Dictionary<String, String> initParams = new
Hashtable<String, String>();
- initParams.put("applicationConfigLocation", APP_RPOPS);
- String restPath =
service.getClass().getAnnotation(Path.class).value();
- if (restPath.startsWith("/")) {
- restPath = restPath.substring(1);
- }
- WinkRestServlet restServlet = new
WinkRestServlet(restPath);
-
- // FIXME: the only problem with creating a REST servlet
for each REST resource
- // is that the REST resource path appears twice in the
URL; once to point to a
- // particular servlet instance and one for the resource.
For example a REST URL becomes:
- //
http://localhost/rest/services/sparqlendpoint/sparqlendpoint?executeSPARQLQuery
- // instead of
- //
http://localhost/rest/services/sparqlendpoint?executeSPARQLQuery
- // There seems to be no proper way to prevent this using
Apache Wink however.
- String servletUrl = "/" + RESOURCE_ID + "/" + restPath;
- m_httpService.registerServlet(servletUrl, restServlet,
initParams, m_httpContext);
- String reqProcAttr = restPath;
-
RegistrationUtils.registerInstances(restServlet.getServletContext(),
reqProcAttr, service);
- m_registeredServlets.add(servletUrl);
- m_logService.log(LogService.LOG_INFO, "Wink application
registered REST servlet '" + servletUrl
- + "'");
- } catch (ServletException e) {
- m_logService.log(LogService.LOG_ERROR, "Failed to register
servlet for REST service '"
- + service.getClass() + "'", e);
- } catch (NamespaceException e) {
- m_logService.log(LogService.LOG_ERROR, "Failed to register
servlet for REST service '"
- + service.getClass() + "'", e);
+ /**
+ * Registers a new REST servlet for this resource.
+ *
+ * @param service The REST resource service to register the servlet for
+ */
+ private void addRestServlet(Object service) {
+ synchronized (m_registeredServlets) {
+ try {
+ // Initialize the servlet
+ Dictionary<String, String> initParams = new Hashtable<String,
String>();
+ initParams.put("applicationConfigLocation", APP_RPOPS);
+ String restPath =
service.getClass().getAnnotation(Path.class).value();
+ if (restPath.startsWith("/")) {
+ restPath = restPath.substring(1);
}
+ WinkRestServlet restServlet = new WinkRestServlet(restPath);
+
+ // FIXME: the only problem with creating a REST servlet for
each REST resource
+ // is that the REST resource path appears twice in the URL;
once to point to a
+ // particular servlet instance and one for the resource. For
example a REST URL becomes:
+ //
http://localhost/rest/services/sparqlendpoint/sparqlendpoint?executeSPARQLQuery
+ // instead of
+ //
http://localhost/rest/services/sparqlendpoint?executeSPARQLQuery
+ // There seems to be no proper way to prevent this using
Apache Wink however.
+ String servletUrl = "/" + RESOURCE_ID + "/" + restPath;
+ m_httpService.registerServlet(servletUrl, restServlet,
initParams, m_httpContext);
+ String reqProcAttr = restPath;
+
RegistrationUtils.registerInstances(restServlet.getServletContext(),
reqProcAttr, service);
+ m_registeredServlets.add(servletUrl);
+ m_logService.log(LogService.LOG_INFO, "Wink application
registered REST servlet '" + servletUrl
+ + "'");
+ }
+ catch (ServletException e) {
+ m_logService.log(LogService.LOG_ERROR, "Failed to register
servlet for REST service '"
+ + service.getClass() + "'", e);
+ }
+ catch (NamespaceException e) {
+ m_logService.log(LogService.LOG_ERROR, "Failed to register
servlet for REST service '"
+ + service.getClass() + "'", e);
}
}
+ }
- private void removeRestServlet(Object service) {
- synchronized (m_registeredServlets) {
- String restPath =
service.getClass().getAnnotation(Path.class).value();
- String servletUrl = "/" + RESOURCE_ID + "/" + restPath;
- if (m_registeredServlets.contains(servletUrl)) {
- m_httpService.unregister(servletUrl);
- m_registeredServlets.remove(servletUrl);
- m_logService.log(LogService.LOG_INFO, "Wink application
unregistered REST servlet '" + servletUrl
- + "'");
- }
+ private void removeRestServlet(Object service) {
+ synchronized (m_registeredServlets) {
+ String restPath =
service.getClass().getAnnotation(Path.class).value();
+ String servletUrl = "/" + RESOURCE_ID + "/" + restPath;
+ if (m_registeredServlets.contains(servletUrl)) {
+ m_httpService.unregister(servletUrl);
+ m_registeredServlets.remove(servletUrl);
+ m_logService.log(LogService.LOG_INFO, "Wink application
unregistered REST servlet '" + servletUrl
+ + "'");
}
}
}
@@ -239,7 +212,7 @@
public URL getResource(String name) {
return null;
}
-
+
public String getResourceId() {
return RESOURCE_ID;
}
Modified: trunk/readme.txt
==============================================================================
--- trunk/readme.txt (original)
+++ trunk/readme.txt Fri Oct 22 09:19:02 2010
@@ -52,7 +52,7 @@
===================================================================================================
-4- HARDWARE AND SOFTWARE REQUIREMENTS
===================================================================================================
-- JDK or JRE 1.5 or higher
+- JDK or JRE 1.6 or higher
- Firefox 3 or higher
===================================================================================================