summaryrefslogtreecommitdiffstats
path: root/java/sca/modules/extensibility/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/sca/modules/extensibility/src')
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java15
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultFactoryExtensionPoint.java18
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultModuleActivatorExtensionPoint.java2
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java25
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/ExtensionPointRegistry.java8
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java32
-rw-r--r--java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/DefaultUtilityExtensionPointTestCase.java3
7 files changed, 68 insertions, 35 deletions
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java
index f6be464cbc..66df61996b 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java
@@ -42,11 +42,16 @@ import org.apache.tuscany.sca.extensibility.ServiceHelper;
*/
public class DefaultExtensionPointRegistry implements ExtensionPointRegistry {
private Map<Class<?>, Object> extensionPoints = new HashMap<Class<?>, Object>();
-
+ private ServiceDiscovery discovery;
/**
* Constructs a new registry.
*/
public DefaultExtensionPointRegistry() {
+ this.discovery = ServiceDiscovery.getInstance();
+ }
+
+ protected DefaultExtensionPointRegistry(ServiceDiscovery discovery) {
+ this.discovery = discovery;
}
/**
@@ -162,11 +167,11 @@ public class DefaultExtensionPointRegistry implements ExtensionPointRegistry {
}
}
- public void start() {
+ public synchronized void start() {
// Do nothing
}
- public void stop() {
+ public synchronized void stop() {
// Get a unique map as an extension point may exist in the map by different keys
Map<LifeCycleListener, LifeCycleListener> map = new IdentityHashMap<LifeCycleListener, LifeCycleListener>();
for (Object extp : extensionPoints.values()) {
@@ -179,4 +184,8 @@ public class DefaultExtensionPointRegistry implements ExtensionPointRegistry {
extensionPoints.clear();
}
+ public ServiceDiscovery getServiceDiscovery() {
+ return discovery;
+ }
+
}
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultFactoryExtensionPoint.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultFactoryExtensionPoint.java
index 300acdc259..2ccb192fdb 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultFactoryExtensionPoint.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultFactoryExtensionPoint.java
@@ -26,9 +26,9 @@ import java.lang.reflect.Modifier;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashMap;
+import java.util.Map;
import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
-import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
@@ -38,14 +38,14 @@ import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
* @version $Rev$ $Date$
*/
public class DefaultFactoryExtensionPoint implements FactoryExtensionPoint {
- private ExtensionPointRegistry extensionPointRegistry;
- private HashMap<Class<?>, Object> factories = new HashMap<Class<?>, Object>();
+ private ExtensionPointRegistry registry;
+ private Map<Class<?>, Object> factories = new HashMap<Class<?>, Object>();
/**
* Constructs a new DefaultModelFactoryExtensionPoint.
*/
public DefaultFactoryExtensionPoint(ExtensionPointRegistry extensionPointRegistry) {
- this.extensionPointRegistry = extensionPointRegistry;
+ this.registry = extensionPointRegistry;
}
/**
@@ -53,7 +53,7 @@ public class DefaultFactoryExtensionPoint implements FactoryExtensionPoint {
*
* @param factory The factory to add
*/
- public void addFactory(Object factory) {
+ public synchronized void addFactory(Object factory) {
Class<?>[] interfaces = factory.getClass().getInterfaces();
if (interfaces.length == 0) {
Class<?> sc = factory.getClass().getSuperclass();
@@ -72,7 +72,7 @@ public class DefaultFactoryExtensionPoint implements FactoryExtensionPoint {
*
* @param factory The factory to remove
*/
- public void removeFactory(Object factory) {
+ public synchronized void removeFactory(Object factory) {
Class<?>[] interfaces = factory.getClass().getInterfaces();
if (interfaces.length == 0) {
Class<?> sc = factory.getClass().getSuperclass();
@@ -103,18 +103,18 @@ public class DefaultFactoryExtensionPoint implements FactoryExtensionPoint {
* @param factoryInterface The lookup key (factory interface)
* @return The factory
*/
- public <T> T getFactory(Class<T> factoryInterface) {
+ public synchronized <T> T getFactory(Class<T> factoryInterface) {
Object factory = factories.get(factoryInterface);
if (factory == null) {
// Dynamically load a factory class declared under META-INF/services
try {
ServiceDeclaration factoryDeclaration =
- ServiceDiscovery.getInstance().getServiceDeclaration(factoryInterface);
+ registry.getServiceDiscovery().getServiceDeclaration(factoryInterface);
if (factoryDeclaration != null) {
try {
// Constructor taking the extension point registry
- factory = newInstance(extensionPointRegistry, factoryDeclaration);
+ factory = newInstance(registry, factoryDeclaration);
} catch (NoSuchMethodException e) {
factory = newInstance(factoryDeclaration.loadClass(), FactoryExtensionPoint.class, this);
}
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultModuleActivatorExtensionPoint.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultModuleActivatorExtensionPoint.java
index 83bc4a836e..fc958afad5 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultModuleActivatorExtensionPoint.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultModuleActivatorExtensionPoint.java
@@ -77,7 +77,7 @@ public class DefaultModuleActivatorExtensionPoint implements ModuleActivatorExte
Collection<ServiceDeclaration> activatorDeclarations;
try {
// Load the module activators by ranking
- activatorDeclarations = ServiceDiscovery.getInstance().getServiceDeclarations(ModuleActivator.class.getName(), true);
+ activatorDeclarations = registry.getServiceDiscovery().getServiceDeclarations(ModuleActivator.class.getName(), true);
} catch (IOException e) {
throw new IllegalStateException(e);
}
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java
index eca59d689d..41e2377db5 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java
@@ -30,7 +30,6 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
-import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
/**
* Default implementation of an extension point to hold Tuscany utility utilities.
@@ -40,12 +39,12 @@ import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
private Map<Object, Object> utilities = new ConcurrentHashMap<Object, Object>();
- private ExtensionPointRegistry extensionPoints;
+ private ExtensionPointRegistry registry;
/**
* Constructs a new extension point.
*/
public DefaultUtilityExtensionPoint(ExtensionPointRegistry extensionPoints) {
- this.extensionPoints = extensionPoints;
+ this.registry = extensionPoints;
}
/**
@@ -56,11 +55,11 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
*
* @throws IllegalArgumentException if utility is null
*/
- public void addUtility(Object utility) {
+ public synchronized void addUtility(Object utility) {
addUtility(null, utility);
}
- public void addUtility(Object key, Object utility) {
+ public synchronized void addUtility(Object key, Object utility) {
if (utility == null) {
throw new IllegalArgumentException("Cannot register null as a Service");
}
@@ -91,7 +90,7 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
*
* @throws IllegalArgumentException if utilityType is null
*/
- public <T> T getUtility(Class<T> utilityType) {
+ public synchronized <T> T getUtility(Class<T> utilityType) {
return getUtility(utilityType, null);
}
@@ -102,7 +101,7 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
*
* @throws IllegalArgumentException if utility is null
*/
- public void removeUtility(Object utility) {
+ public synchronized void removeUtility(Object utility) {
if (utility == null) {
throw new IllegalArgumentException("Cannot remove null as a Service");
}
@@ -144,7 +143,7 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
}
}
- public <T> T getUtility(Class<T> utilityType, Object key) {
+ public synchronized <T> T getUtility(Class<T> utilityType, Object key) {
if (utilityType == null) {
throw new IllegalArgumentException("Cannot lookup Service of type null");
}
@@ -160,7 +159,7 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
// Dynamically load a utility class declared under META-INF/services/"utilityType"
try {
ServiceDeclaration utilityDeclaration =
- ServiceDiscovery.getInstance().getServiceDeclaration(utilityType.getName());
+ registry.getServiceDiscovery().getServiceDeclaration(utilityType.getName());
Class<?> utilityClass = null;
if (utilityDeclaration != null) {
utilityClass = utilityDeclaration.loadClass();
@@ -171,10 +170,10 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
if (utilityClass != null) {
// Construct the utility
if (utilityDeclaration != null) {
- utility = newInstance(extensionPoints, utilityDeclaration);
+ utility = newInstance(registry, utilityDeclaration);
} else {
try {
- utility = newInstance(utilityClass, ExtensionPointRegistry.class, extensionPoints);
+ utility = newInstance(utilityClass, ExtensionPointRegistry.class, registry);
} catch (NoSuchMethodException e) {
utility = newInstance(utilityClass);
}
@@ -198,11 +197,11 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
return !utilityType.isInterface() && Modifier.isPublic(modifiers) && !Modifier.isAbstract(modifiers);
}
- public void start() {
+ public synchronized void start() {
// NOOP
}
- public void stop() {
+ public synchronized void stop() {
// Get a unique map as an extension point may exist in the map by different keys
Map<LifeCycleListener, LifeCycleListener> map = new IdentityHashMap<LifeCycleListener, LifeCycleListener>();
for (Object util : utilities.values()) {
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/ExtensionPointRegistry.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/ExtensionPointRegistry.java
index 4c6fbd283f..762fcad7aa 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/ExtensionPointRegistry.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/ExtensionPointRegistry.java
@@ -19,6 +19,8 @@
package org.apache.tuscany.sca.core;
+import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
+
/**
* The registry for the Tuscany core extension points. As the point of contact
@@ -53,4 +55,10 @@ public interface ExtensionPointRegistry extends LifeCycleListener {
* @throws IllegalArgumentException if extensionPoint is null
*/
void removeExtensionPoint(Object extensionPoint);
+
+ /**
+ * Get an instance of the ServiceDiscovery
+ * @return an instance of the ServiceDiscovery associated with the environment
+ */
+ ServiceDiscovery getServiceDiscovery();
}
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java
index ca401a6484..1c03166eeb 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java
@@ -53,6 +53,11 @@ public final class ServiceDiscovery implements ServiceDiscoverer {
super();
}
+ private ServiceDiscovery(ServiceDiscoverer discoverer) {
+ super();
+ this.discoverer = discoverer;
+ }
+
/**
* Get an instance of Service discovery, one instance is created per
* ClassLoader that this class is loaded from
@@ -62,6 +67,10 @@ public final class ServiceDiscovery implements ServiceDiscoverer {
public static ServiceDiscovery getInstance() {
return INSTANCE;
}
+
+ public static ServiceDiscovery getInstance(ServiceDiscoverer discoverer) {
+ return new ServiceDiscovery(discoverer);
+ }
public ServiceDiscoverer getServiceDiscoverer() {
if (discoverer != null) {
@@ -80,8 +89,8 @@ public final class ServiceDiscovery implements ServiceDiscoverer {
}
public void setServiceDiscoverer(ServiceDiscoverer sd) {
- if (discoverer != null) {
- throw new IllegalStateException("The ServiceDiscoverer cannot be reset");
+ if (discoverer != null && sd != null) {
+ logger.warning("ServiceDiscoverer is reset to " + sd);
}
discoverer = sd;
}
@@ -255,9 +264,9 @@ public final class ServiceDiscovery implements ServiceDiscoverer {
@Override
protected Class<?> findClass(String className) throws ClassNotFoundException {
- for (ClassLoader parent : classLoaders) {
+ for (ClassLoader delegate : classLoaders) {
try {
- return parent.loadClass(className);
+ return delegate.loadClass(className);
} catch (ClassNotFoundException e) {
continue;
}
@@ -267,8 +276,8 @@ public final class ServiceDiscovery implements ServiceDiscoverer {
@Override
protected URL findResource(String resName) {
- for (ClassLoader parent : classLoaders) {
- URL url = parent.getResource(resName);
+ for (ClassLoader delegate : classLoaders) {
+ URL url = delegate.getResource(resName);
if (url != null) {
return url;
}
@@ -279,8 +288,8 @@ public final class ServiceDiscovery implements ServiceDiscoverer {
@Override
protected Enumeration<URL> findResources(String resName) throws IOException {
Set<URL> urlSet = new HashSet<URL>();
- for (ClassLoader parent : classLoaders) {
- Enumeration<URL> urls = parent.getResources(resName);
+ for (ClassLoader delegate : classLoaders) {
+ Enumeration<URL> urls = delegate.getResources(resName);
if (urls != null) {
while (urls.hasMoreElements()) {
urlSet.add(urls.nextElement());
@@ -327,6 +336,13 @@ public final class ServiceDiscovery implements ServiceDiscoverer {
return loaders;
}
+ /**
+ * Set the thread context classloader (TCCL) to a classloader that delegates to a collection
+ * of classloaders
+ * @param parent The parent classloader
+ * @param delegates A list of classloaders to try
+ * @return The existing TCCL
+ */
public ClassLoader setContextClassLoader(ClassLoader parent, ClassLoader... delegates) {
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
List<ClassLoader> loaders = new ArrayList<ClassLoader>();
diff --git a/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/DefaultUtilityExtensionPointTestCase.java b/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/DefaultUtilityExtensionPointTestCase.java
index 6e9e3f07d3..0a5f4d6442 100644
--- a/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/DefaultUtilityExtensionPointTestCase.java
+++ b/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/DefaultUtilityExtensionPointTestCase.java
@@ -22,6 +22,7 @@ package org.apache.tuscany.sca.extensibility;
import java.io.Serializable;
+import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry;
import org.apache.tuscany.sca.core.DefaultUtilityExtensionPoint;
import org.apache.tuscany.sca.core.LifeCycleListener;
import org.apache.tuscany.sca.core.UtilityExtensionPoint;
@@ -41,7 +42,7 @@ public class DefaultUtilityExtensionPointTestCase {
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
- ep = new DefaultUtilityExtensionPoint(null);
+ ep = new DefaultUtilityExtensionPoint(new DefaultExtensionPointRegistry());
ep.start();
}