diff options
Diffstat (limited to 'java/sca/modules/extensibility/src')
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(); } |