diff options
9 files changed, 140 insertions, 90 deletions
diff --git a/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java b/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java index cbcca659a8..f662f44a24 100644 --- a/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java +++ b/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java @@ -97,7 +97,7 @@ public class EquinoxServiceDiscoverer implements ServiceDiscoverer { public URL getLocation() { return url; } - + public URL getResource(final String name) { return AccessController.doPrivileged(new PrivilegedAction<URL>() { public URL run() { @@ -117,11 +117,11 @@ public class EquinoxServiceDiscoverer implements ServiceDiscoverer { } public class ClassLoaderImpl extends SecureClassLoader { - + public ClassLoaderImpl() { super(EquinoxServiceDiscoverer.class.getClassLoader()); } - + /** * Open a back-door to expose the META-INF/services resources */ @@ -135,21 +135,21 @@ public class EquinoxServiceDiscoverer implements ServiceDiscoverer { if (path.startsWith("/")) { path = path.substring(1); } - + if (!path.startsWith("META-INF/services")) { return null; } - + for (Bundle bundle : context.getBundles()) { URL url = bundle.getEntry(name); if (url != null) { return url; } } - + return null; } - + /** * Open a back-door to expose the META-INF/services resources */ @@ -164,13 +164,13 @@ public class EquinoxServiceDiscoverer implements ServiceDiscoverer { if (path.startsWith("/")) { path = path.substring(1); } - + if (!path.startsWith("META-INF/services")) { return null; } - + Set<URL> urlSet = new HashSet<URL>(); - + for (Bundle bundle : context.getBundles()) { Enumeration<URL> urls = bundle.findEntries(path, file, false); if (urls != null) { @@ -179,7 +179,7 @@ public class EquinoxServiceDiscoverer implements ServiceDiscoverer { } return Collections.enumeration(urlSet); } - + } private static String toString(Bundle b) { @@ -250,72 +250,74 @@ public class EquinoxServiceDiscoverer implements ServiceDiscoverer { serviceName = "META-INF/services/" + serviceName; - int index = serviceName.lastIndexOf('/'); - String path = serviceName.substring(0, index); - String file = serviceName.substring(index + 1); + // int index = serviceName.lastIndexOf('/'); + // String path = serviceName.substring(0, index); + // String file = serviceName.substring(index + 1); for (Bundle bundle : context.getBundles()) { - Enumeration<URL> urls = bundle.findEntries(path, file, false); - while (urls != null && urls.hasMoreElements()) { - final URL url = urls.nextElement(); - if (debug) { - logger.fine("Reading service provider file: " + url.toExternalForm()); + // Enumeration<URL> urls = bundle.findEntries(path, file, false); + // Enumeration<URL> urls = bundle.findEntries(path, file, false); // This is expensive + final URL url = bundle.getEntry(serviceName); + if (url == null) { + continue; + } + if (debug) { + logger.fine("Reading service provider file: " + url.toExternalForm()); + } + try { + // Allow privileged access to open URL stream. Add FilePermission to added to security + // policy file. + InputStream is; + try { + is = AccessController.doPrivileged(new PrivilegedExceptionAction<InputStream>() { + public InputStream run() throws IOException { + return url.openStream(); + } + }); + } catch (PrivilegedActionException e) { + throw (IOException)e.getException(); } + BufferedReader reader = null; try { - // Allow privileged access to open URL stream. Add FilePermission to added to security - // policy file. - InputStream is; - try { - is = AccessController.doPrivileged(new PrivilegedExceptionAction<InputStream>() { - public InputStream run() throws IOException { - return url.openStream(); + reader = new BufferedReader(new InputStreamReader(is)); + int count = 0; + while (true) { + String line = reader.readLine(); + if (line == null) + break; + line = line.trim(); + if (!line.startsWith("#") && !"".equals(line)) { + String reg = line.trim(); + if (debug) { + logger.fine("Registering service provider: " + reg); } - }); - } catch (PrivilegedActionException e) { - throw (IOException)e.getException(); - } - BufferedReader reader = null; - try { - reader = new BufferedReader(new InputStreamReader(is)); - int count = 0; - while (true) { - String line = reader.readLine(); - if (line == null) - break; - line = line.trim(); - if (!line.startsWith("#") && !"".equals(line)) { - String reg = line.trim(); - if (debug) { - logger.fine("Registering service provider: " + reg); - } - - Map<String, String> attributes = parseServiceDeclaration(reg); - String className = attributes.get("class"); - if (className == null) { - // Add a unique class name to prevent equals() from returning true - className = "_class_" + count; - count++; - } - ServiceDeclarationImpl descriptor = - new ServiceDeclarationImpl(bundle, url, className, attributes); - descriptors.add(descriptor); - if (firstOnly) { - return descriptors; - } + + Map<String, String> attributes = parseServiceDeclaration(reg); + String className = attributes.get("class"); + if (className == null) { + // Add a unique class name to prevent equals() from returning true + className = "_class_" + count; + count++; } - } - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - // Ignore + ServiceDeclarationImpl descriptor = + new ServiceDeclarationImpl(bundle, url, className, attributes); + descriptors.add(descriptor); + if (firstOnly) { + return descriptors; } } } - } catch (IOException e) { - logger.log(Level.SEVERE, e.getMessage(), e); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + // Ignore + } + } } + } catch (IOException e) { + logger.log(Level.SEVERE, e.getMessage(), e); } } return descriptors; @@ -331,7 +333,7 @@ public class EquinoxServiceDiscoverer implements ServiceDiscoverer { } public <T> T getContext() { - return (T) context; + return (T)context; } } diff --git a/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoveryActivator.java b/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoveryActivator.java index 4b2e37f07a..0d00c1c3dd 100644 --- a/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoveryActivator.java +++ b/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoveryActivator.java @@ -33,7 +33,7 @@ public class EquinoxServiceDiscoveryActivator implements BundleActivator { if (bundleContext == null) { bundleContext = context; EquinoxServiceDiscoverer discoverer = new EquinoxServiceDiscoverer(bundleContext); - ServiceDiscovery.setServiceDiscoverer(discoverer); + ServiceDiscovery.getInstance().setServiceDiscoverer(discoverer); } } diff --git a/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java b/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java index 10954b1f5f..5f951baf84 100644 --- a/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java +++ b/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java @@ -254,7 +254,7 @@ public class OSGiServiceDiscoverer implements ServiceDiscoverer { } return attributes; } - + public BundleContext getBundleContext() { return context; } @@ -266,9 +266,9 @@ public class OSGiServiceDiscoverer implements ServiceDiscoverer { public ClassLoader getContextClassLoader() { return classLoader; } - + public <T> T getContext() { - return (T) context; + return (T)context; } @SuppressWarnings("unchecked") @@ -278,14 +278,19 @@ public class OSGiServiceDiscoverer implements ServiceDiscoverer { serviceName = "META-INF/services/" + serviceName; - int index = serviceName.lastIndexOf('/'); - String path = serviceName.substring(0, index); - String file = serviceName.substring(index + 1); + // int index = serviceName.lastIndexOf('/'); + // String path = serviceName.substring(0, index); + // String file = serviceName.substring(index + 1); + + // long start = System.currentTimeMillis(); + try { + for (Bundle bundle : context.getBundles()) { + // Enumeration<URL> urls = bundle.findEntries(path, file, false); // This is expensive + final URL url = bundle.getEntry(serviceName); + if (url == null) { + continue; + } - for (Bundle bundle : context.getBundles()) { - Enumeration<URL> urls = bundle.findEntries(path, file, false); - while (urls != null && urls.hasMoreElements()) { - final URL url = urls.nextElement(); if (debug) { logger.fine("Reading service provider file: " + url.toExternalForm()); } @@ -345,6 +350,11 @@ public class OSGiServiceDiscoverer implements ServiceDiscoverer { logger.log(Level.SEVERE, e.getMessage(), e); } } + } finally { +// long end = System.currentTimeMillis(); +// if (true) { +// logger.info("Duration: " + (end - start) + " ms"); +// } } return descriptors; diff --git a/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoveryActivator.java b/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoveryActivator.java index b69f36d383..208ef1a74f 100644 --- a/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoveryActivator.java +++ b/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoveryActivator.java @@ -33,7 +33,7 @@ public class OSGiServiceDiscoveryActivator implements BundleActivator { if (bundleContext == null) { bundleContext = context; OSGiServiceDiscoverer discoverer = new OSGiServiceDiscoverer(bundleContext); - ServiceDiscovery.setServiceDiscoverer(discoverer); + ServiceDiscovery.getInstance().setServiceDiscoverer(discoverer); } } diff --git a/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java b/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java index 8a9b8d485c..472cfbc17c 100644 --- a/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java +++ b/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java @@ -19,8 +19,12 @@ package org.apache.tuscany.sca.extensibility.osgi; +import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -109,4 +113,11 @@ public class OSGiServiceDiscovererTestCase { descriptors = discoverer.discover("notthere", true); Assert.assertEquals(0, descriptors.size()); } + + @Test + public void testClassLoader () throws IOException { + Enumeration<URL> resources = discoverer.getContextClassLoader().getResources("META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory"); + List<URL> list = Collections.list(resources); + Assert.assertEquals(1, list.size()); + } } 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 2c2016d7e3..8ad7009f47 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 @@ -38,9 +38,9 @@ import java.util.logging.Logger; public class ServiceDiscovery { private static final Logger logger = Logger.getLogger(ServiceDiscovery.class.getName()); - private final static ServiceDiscovery instance = new ServiceDiscovery(); + private final static ServiceDiscovery INSTANCE = new ServiceDiscovery(); - private static ServiceDiscoverer discoverer; + private ServiceDiscoverer discoverer; private Set<ClassLoader> registeredClassLoaders = new HashSet<ClassLoader>(); /** @@ -50,17 +50,28 @@ public class ServiceDiscovery { * @return */ public static ServiceDiscovery getInstance() { - return instance; + return INSTANCE; } - public static ServiceDiscoverer getServiceDiscoverer() { + /** + * Get a classloader-based service discovery instance + * @param classLoader + * @return + */ + public static ServiceDiscovery getInstance(ClassLoader classLoader) { + ServiceDiscovery discovery = new ServiceDiscovery(); + discovery.setServiceDiscoverer(new ClasspathServiceDiscoverer(classLoader)); + return discovery; + } + + public ServiceDiscoverer getServiceDiscoverer() { if (discoverer == null) { discoverer = new ClasspathServiceDiscoverer(); } return discoverer; } - public static void setServiceDiscoverer(ServiceDiscoverer sd) { + public void setServiceDiscoverer(ServiceDiscoverer sd) { if (discoverer != null) { throw new IllegalStateException("The ServiceDiscoverer cannot be reset"); } diff --git a/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java b/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java index 46b1ebb808..effe9b298d 100644 --- a/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java +++ b/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java @@ -31,7 +31,9 @@ import org.osgi.framework.BundleContext; * */ public class EquinoxOSGiHost implements OSGiHost { - + private LauncherBundleActivator activator = new LauncherBundleActivator(); + private BundleContext context; + private final static String systemPackages = "org.osgi.framework; version=1.3.0," + "org.osgi.service.packageadmin; version=1.2.0, " + "org.osgi.service.startlevel; version=1.0.0, " @@ -92,15 +94,22 @@ public class EquinoxOSGiHost implements OSGiHost { String args[] = {}; Map<Object, Object> props = new HashMap<Object, Object>(); props.put("org.osgi.framework.system.packages", systemPackages); + // Set the extension bundle + // props.put("osgi.framework.extensions", "org.apache.tuscany.sca.extensibility.equinox"); props.put(EclipseStarter.PROP_CLEAN, "true"); props.put(LocationManager.PROP_INSTANCE_AREA, new File("target/workspace").toURI().toString()); - props.put(LocationManager.PROP_INSTALL_AREA, new File("target/eclipse").toURI().toString()); + props.put(LocationManager.PROP_INSTALL_AREA, new File("target/eclipse/install").toURI().toString()); + props.put(LocationManager.PROP_CONFIG_AREA, new File("target/eclipse/config").toURI().toString()); + props.put(LocationManager.PROP_USER_AREA, new File("target/eclipse/user").toURI().toString()); + EclipseStarter.setInitialProperties(props); - BundleContext context = EclipseStarter.startup(args, null); + context = EclipseStarter.startup(args, null); + activator.start(context); return context; } private void shutdown() throws Exception { + activator.stop(context); EclipseStarter.shutdown(); } diff --git a/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java b/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java index 2a5af89171..778eb0f690 100644 --- a/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java +++ b/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java @@ -142,7 +142,8 @@ public class LauncherBundleActivator implements BundleActivator, Constants, Bund for (URL url : urls) { File file = new File(url.toURI()); - if (file.getName().startsWith("org.apache.felix.") || file.getName().startsWith("org.osgi.")) { + if (file.getName().startsWith("org.apache.felix.") || file.getName().startsWith("osgi-") + || file.getName().startsWith("org.osgi.")) { continue; } try { @@ -205,6 +206,12 @@ public class LauncherBundleActivator implements BundleActivator, Constants, Bund } String symbolicName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); + if (symbolicName != null) { + int index = symbolicName.indexOf(';'); + if (index != -1) { + symbolicName = symbolicName.substring(0, index); + } + } String version = manifest.getMainAttributes().getValue(BUNDLE_VERSION); Bundle bundle = findBundle(bundleContext, symbolicName, version); if (bundle != null) { diff --git a/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java b/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java index e0e520c368..b87f70deef 100644 --- a/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java +++ b/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java @@ -79,7 +79,7 @@ public class OSGiBundleActivator implements BundleActivator, BundleListener { private void initializeTuscanyClassLoaders(BundleContext bundleContext) {
OSGiServiceDiscoverer discoverer = new OSGiServiceDiscoverer(bundleContext);
- ServiceDiscovery.setServiceDiscoverer(discoverer);
+ ServiceDiscovery.getInstance().setServiceDiscoverer(discoverer);
thisBundle = bundleContext.getBundle();
origTCCL = Thread.currentThread().getContextClassLoader();
|