diff options
Diffstat (limited to 'sca-java-2.x/trunk/modules/extensibility/src/main/java')
3 files changed, 62 insertions, 4 deletions
diff --git a/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClassLoaderContext.java b/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClassLoaderContext.java index 1917fe05d4..598c897402 100644 --- a/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClassLoaderContext.java +++ b/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClassLoaderContext.java @@ -19,11 +19,14 @@ package org.apache.tuscany.sca.extensibility; +import java.io.IOException; +import java.net.URL; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Arrays; +import java.util.Enumeration; import java.util.List; import org.apache.tuscany.sca.extensibility.impl.ClassLoaderDelegate; @@ -124,7 +127,9 @@ public class ClassLoaderContext { * @param serviceNames A list of service provider names * @return The old TCCL if a new one is set, otherwise null */ - public static ClassLoader setContextClassLoader(ClassLoader parent, ServiceDiscovery discovery, String... serviceNames) { + public static ClassLoader setContextClassLoader(ClassLoader parent, + ServiceDiscovery discovery, + String... serviceNames) { ClassLoaderContext context = new ClassLoaderContext(parent, discovery, serviceNames); return context.setContextClassLoader(); } @@ -135,7 +140,9 @@ public class ClassLoaderContext { * @param serviceNames A list of service provider names * @return The old TCCL if a new one is set, otherwise null */ - public static ClassLoader setContextClassLoader(ClassLoader parent, ServiceDiscovery discovery, Class<?>... serviceTypes) { + public static ClassLoader setContextClassLoader(ClassLoader parent, + ServiceDiscovery discovery, + Class<?>... serviceTypes) { ClassLoaderContext context = new ClassLoaderContext(parent, discovery, serviceTypes); return context.setContextClassLoader(); } @@ -154,7 +161,15 @@ public class ClassLoaderContext { try { ServiceDeclaration sd = discovery.getServiceDeclaration(serviceProvider); if (sd != null) { - return sd.loadClass().getClassLoader(); + try { + if (sd.loadClass() != null) { + return sd.loadClass().getClassLoader(); + } else { + return new ClassLoaderImpl(sd); + } + } catch (ClassNotFoundException e) { + return new ClassLoaderImpl(sd); + } } } catch (Exception e) { // Ignore @@ -210,4 +225,29 @@ public class ClassLoaderContext { return classLoader; } + private static class ClassLoaderImpl extends ClassLoader { + private final ServiceDeclaration sd; + + public ClassLoaderImpl(ServiceDeclaration sd) { + super(); + this.sd = sd; + } + + @Override + protected Class<?> findClass(String name) throws ClassNotFoundException { + return sd.loadClass(name); + } + + @Override + protected URL findResource(String name) { + return sd.getResource(name); + } + + @Override + protected Enumeration<URL> findResources(String name) throws IOException { + return sd.getResources(name); + } + + } + } diff --git a/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ContextClassLoaderServiceDiscoverer.java b/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ContextClassLoaderServiceDiscoverer.java index eec4ff1734..d40c37e4be 100644 --- a/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ContextClassLoaderServiceDiscoverer.java +++ b/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ContextClassLoaderServiceDiscoverer.java @@ -28,6 +28,7 @@ import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -106,6 +107,11 @@ public class ContextClassLoaderServiceDiscoverer implements ServiceDiscoverer { } return (javaClass != null && serviceType.isAssignableFrom(javaClass)); } + + @Override + public Enumeration<URL> getResources(String name) throws IOException { + return Collections.enumeration(ContextClassLoaderServiceDiscoverer.this.getResources(name)); + } } private WeakReference<ClassLoader> classLoaderReference; @@ -155,7 +161,16 @@ public class ContextClassLoaderServiceDiscoverer implements ServiceDiscoverer { // http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/XPathFactory.html boolean isPropertyFile = "javax.xml.xpath.XPathFactory".equals(serviceName); - String name = "META-INF/services/" + serviceName; + + String name = serviceName; + if (serviceName.startsWith("/")) { + // If the service name starts with /, treat it as the entry name + name = serviceName.substring(1); + } else { + // Use JDK SPI pattern + name = "META-INF/services/" + serviceName; + } + boolean debug = logger.isLoggable(Level.FINE); try { for (final URL url : getResources(name)) { diff --git a/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java b/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java index 47a91aabfe..24b2c17a0f 100644 --- a/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java +++ b/sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java @@ -19,7 +19,9 @@ package org.apache.tuscany.sca.extensibility; +import java.io.IOException; import java.net.URL; +import java.util.Enumeration; import java.util.Map; /** @@ -67,6 +69,7 @@ public interface ServiceDeclaration { String getClassName(); URL getResource(String name); + Enumeration<URL> getResources(String name) throws IOException; /** * The service descriptor might be hashed |