diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2008-07-11 17:54:53 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2008-07-11 17:54:53 +0000 |
commit | ad902526609be7f53e8df85fb18e0941095f9316 (patch) | |
tree | 3cc84aeb15c85c546387bca16cf7d789c0a9c466 /java/sca/modules/extensibility/src | |
parent | fa46111ff3b9e4136baa79a7c43df564e3ae743b (diff) |
Add the first instance only optimization back
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@676038 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules/extensibility/src')
4 files changed, 38 insertions, 63 deletions
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java index c83a7d9172..803f5f615d 100644 --- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java +++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java @@ -29,6 +29,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -117,11 +118,20 @@ public class ClasspathServiceDiscover implements ServiceDiscoverer { this.classLoaderReference = new WeakReference<ClassLoader>(classLoader); } - protected List<URL> getResources(final String name) throws IOException { + protected List<URL> getResources(final String name, final boolean firstOnly) throws IOException { try { return AccessController.doPrivileged(new PrivilegedExceptionAction<List<URL>>() { public List<URL> run() throws IOException { - return Collections.list(getClassLoader().getResources(name)); + if (firstOnly) { + URL url = getClassLoader().getResource(name); + if (url != null) { + return Arrays.asList(url); + } else { + return Collections.emptyList(); + } + } else { + return Collections.list(getClassLoader().getResources(name)); + } } }); } catch (PrivilegedActionException e) { @@ -168,13 +178,13 @@ public class ClasspathServiceDiscover implements ServiceDiscoverer { return attributes; } - public Set<ServiceDeclaration> discover(String serviceName) { + public Set<ServiceDeclaration> discover(String serviceName, boolean firstOnly) { Set<ServiceDeclaration> descriptors = new HashSet<ServiceDeclaration>(); String name = "META-INF/services/" + serviceName; boolean debug = logger.isLoggable(Level.FINE); try { - for (final URL url : getResources(name)) { + for (final URL url : getResources(name, firstOnly)) { if (debug) { logger.fine("Reading service provider file: " + url.toExternalForm()); } @@ -215,6 +225,9 @@ public class ClasspathServiceDiscover implements ServiceDiscoverer { } ServiceDeclarationImpl descriptor = new ServiceDeclarationImpl(url, className, attributes); descriptors.add(descriptor); + if (firstOnly) { + return descriptors; + } } } } finally { diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java index 31f2cf600e..4079f86d99 100644 --- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java +++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java @@ -22,13 +22,15 @@ package org.apache.tuscany.sca.extensibility; import java.util.Set; /** - * + * A SPI that allows different implementations of discovering service declarations */ public interface ServiceDiscoverer { /** * Discover the service descriptors by name - * @param serviceName + * @param serviceName The name of the service + * @param firstOnly A flag to indicate if only the first instance is to be discovered + * * @return A set of service descriptors */ - Set<ServiceDeclaration> discover(String serviceName); + Set<ServiceDeclaration> discover(String serviceName, boolean firstOnly); } 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 412774c83b..07e5dc322e 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 @@ -28,8 +28,7 @@ import java.util.logging.Logger; * Service discovery for Tuscany based on J2SE Jar service provider spec. * Services are described using configuration files in META-INF/services. * Service description specifies a class name followed by optional properties. - * Multi-ClassLoader environments are supported through a ClassLoader - * registration API + * * * @version $Rev$ $Date$ */ @@ -48,12 +47,6 @@ public class ServiceDiscovery { * @return */ public static ServiceDiscovery getInstance() { -// -// if (instance == null) { -// instance = new ServiceDiscovery(); -// instance.registeredClassLoaders = new HashSet<ClassLoader>(); -// instance.registeredClassLoaders.add(ServiceDiscovery.class.getClassLoader()); -// } return instance; } @@ -98,8 +91,7 @@ public class ServiceDiscovery { * @throws IOException */ public Set<ServiceDeclaration> getServiceDeclarations(String name) throws IOException { - // Set<ServiceDeclaration> classSet = new HashSet<ServiceDeclaration>(); - Set<ServiceDeclaration> services = getServiceDiscoverer().discover(name); + Set<ServiceDeclaration> services = getServiceDiscoverer().discover(name, false); return services; } @@ -124,52 +116,9 @@ public class ServiceDiscovery { * @throws ClassNotFoundException */ public Class<?> loadFirstServiceClass(Class<?> serviceInterface) throws IOException, ClassNotFoundException { - Set<ServiceDeclaration> services = getServiceDiscoverer().discover(serviceInterface.getName()); + Set<ServiceDeclaration> services = getServiceDiscoverer().discover(serviceInterface.getName(), true); if(services.isEmpty()) { return null; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } return services.iterator().next().loadClass(); } diff --git a/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java b/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java index cf203cce7a..fbdd4a6b2e 100644 --- a/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java +++ b/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java @@ -44,12 +44,23 @@ public class ClasspathServiceDiscovererTestCase { @Test public void testDiscovery() { Set<ServiceDeclaration> discriptors = - discover.discover("org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint"); + discover.discover("org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint", false); Assert.assertEquals(1, discriptors.size()); discriptors = - discover.discover("notthere"); + discover.discover("notthere", false); Assert.assertEquals(0, discriptors.size()); } + + @Test + public void testDiscoveryFirst() { + Set<ServiceDeclaration> discriptors = + discover.discover("org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint", true); + Assert.assertEquals(1, discriptors.size()); + discriptors = + discover.discover("notthere", true); + Assert.assertEquals(0, discriptors.size()); + } + /** * @throws java.lang.Exception |