summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/extensibility/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/trunk/modules/extensibility/src/main/java')
-rw-r--r--sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClassLoaderContext.java46
-rw-r--r--sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ContextClassLoaderServiceDiscoverer.java17
-rw-r--r--sca-java-2.x/trunk/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java3
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