From b4fb8e98f94ca47e99f40e92db5972dd7b70fd54 Mon Sep 17 00:00:00 2001 From: rfeng Date: Tue, 4 Nov 2008 22:18:49 +0000 Subject: Add two more methods to find contribution locations by resource search git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@711449 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/node/ContributionLocationHelper.java | 56 +++++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'branches/sca-equinox/modules/node-api/src') diff --git a/branches/sca-equinox/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java b/branches/sca-equinox/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java index 74ebe556bc..96a25dfa63 100644 --- a/branches/sca-equinox/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java +++ b/branches/sca-equinox/modules/node-api/src/main/java/org/apache/tuscany/sca/node/ContributionLocationHelper.java @@ -26,10 +26,10 @@ import java.security.PrivilegedAction; /** * ContributionLocationHelper * - * @version $Rev: $ $Date: $ + * @version $Rev$ $Date$ */ public class ContributionLocationHelper { - + /** * Returns the location of the SCA contribution containing the given class. * @@ -46,4 +46,56 @@ public class ContributionLocationHelper { return uri; } + /** + * Find the contribution location by seraching a resource on the classpath + * @param resourceName + * @return + */ + public static String getContributionLocation(String resourceName) { + return getContributionLocation(null, resourceName); + + } + + /** + * Find the contribution location by seraching a resource using the given classloader + * @param classLoader + * @param resourceName + * @return + */ + public static String getContributionLocation(ClassLoader classLoader, String resourceName) { + if (classLoader == null) { + classLoader = AccessController.doPrivileged(new PrivilegedAction() { + public ClassLoader run() { + return Thread.currentThread().getContextClassLoader(); + } + }); + } + URL resourceURL = getResource(classLoader, resourceName); + if (resourceURL == null) { + return null; + } + String location = null; + // "jar:file://....../something.jar!/a/b/c/app.composite" + String url = resourceURL.toExternalForm(); + String protocol = resourceURL.getProtocol(); + if ("file".equals(protocol)) { + // directory contribution + if (url.endsWith(resourceName)) { + location = url.substring(0, url.lastIndexOf(resourceName)); + } + } else if ("jar".equals(protocol) || "wsjar".equals(protocol) || "zip".equals(protocol)) { + // jar contribution + location = url.substring(protocol.length() + 1, url.lastIndexOf("!/")); + } + return location; + } + + private static URL getResource(final ClassLoader classLoader, final String compositeURI) { + return AccessController.doPrivileged(new PrivilegedAction() { + public URL run() { + return classLoader.getResource(compositeURI); + } + }); + } + } -- cgit v1.2.3