diff options
author | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2012-02-16 15:42:31 +0000 |
---|---|---|
committer | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2012-02-16 15:42:31 +0000 |
commit | 86beaaacd17f5d9fba397114fae2799390929a48 (patch) | |
tree | a19200e4fbcab1a43c513355d3b39c4d8f0f5739 /sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache | |
parent | c0bef68247bd8a6d0bbbe7c9f07cc927ca2861d2 (diff) |
Delete old RC tags
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1245042 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache')
12 files changed, 0 insertions, 3487 deletions
diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/Contribution.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/Contribution.java deleted file mode 100644 index 892412b395..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/Contribution.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tuscany.sca.node.equinox.launcher; - -/** - * Represents an SCA contribution uri + location. - * - * @version $Rev$ $Date$ - */ -public final class Contribution { - private String uri; - private String location; - - /** - * Constructs a new SCA contribution. - * - * @param uri - * @param location - */ - public Contribution(String uri, String location) { - this.uri = uri; - this.location = location; - } - - public String getURI() { - return uri; - } - - public String getLocation() { - return location; - } -}
\ No newline at end of file diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/ContributionLocationHelper.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/ContributionLocationHelper.java deleted file mode 100644 index 056ec080ba..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/ContributionLocationHelper.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import java.io.File; -import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; - -import org.osgi.framework.Bundle; - -/** - * ContributionLocationHelper - * - * @version $Rev$ $Date$ - */ -public class ContributionLocationHelper { - - /** - * Returns the location of the SCA contribution containing the given class. - * - * @param anchorClass - * @return - */ - public static String getContributionLocation(final Class<?> anchorClass) { - URL url = AccessController.doPrivileged(new PrivilegedAction<URL>() { - public URL run() { - return anchorClass.getProtectionDomain().getCodeSource().getLocation(); - } - }); - String uri = url.toString(); - return uri; - } - - /** - * Returns the location of the SCA contribution represented by the given bundle. - * - * @param anchorClass - * @return - */ - public static String getContributionLocation(final Bundle bundle) { - String uri = bundle.getLocation(); - uri = uri.substring(uri.indexOf("file:") + 5); - File file = new File(uri); - uri = file.toURI().toString(); - return uri; - } - -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/DomainManagerLauncher.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/DomainManagerLauncher.java deleted file mode 100644 index e6f59e1b07..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/DomainManagerLauncher.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.domainManager; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Simple launcher for the SCA domain manager. - * - * @version $Rev$ $Date$ - */ -public class DomainManagerLauncher { - - static final Logger logger = Logger.getLogger(DomainManagerLauncher.class.getName()); - - /** - * Constructs a new DomainManagerLauncher. - */ - private DomainManagerLauncher() { - } - - /** - * Returns a new launcher instance. - * - * @return a new launcher instance - */ - public static DomainManagerLauncher newInstance() { - return new DomainManagerLauncher(); - } - - /** - * Creates a new DomainManager. - * - * @return a new DomainManager - * @throws LauncherException - */ - public <T> T createDomainManager() throws LauncherException { - return (T)domainManager("."); - } - - /** - * Creates a new DomainManager. - * - * @param rootDirectory the domain's root configuration directory - * - * @return a new DomainManager - * @throws LauncherException - */ - public <T> T createDomainManager(String rootDirectory) throws LauncherException { - return (T)domainManager(rootDirectory); - } - - public static void main(String[] args) throws Exception { - logger.info("Apache Tuscany SCA Domain Manager is starting..."); - - // Create a launcher - DomainManagerLauncher launcher = newInstance(); - - EquinoxHost equinox = null; - Object domainManager = null; - ShutdownThread shutdown = null; - try { - - // Start the OSGi host - equinox = new EquinoxHost(); - equinox.start(); - - // Start the domain manager - domainManager = launcher.createDomainManager(); - try { - domainManager.getClass().getMethod("start").invoke(domainManager); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Domain Manager could not be started", e); - throw e; - } - logger.info("SCA Domain Manager is now started."); - - // Install a shutdown hook - ShutdownThread hook = new ShutdownThread(domainManager, equinox); - Runtime.getRuntime().addShutdownHook(hook); - - logger.info("Press enter to shutdown."); - try { - System.in.read(); - } catch (IOException e) { - - // Wait forever - Object lock = new Object(); - synchronized(lock) { - lock.wait(); - } - } - - } finally { - - // Remove the shutdown hook - if (shutdown != null) { - Runtime.getRuntime().removeShutdownHook(shutdown); - } - - // Stop the domain manager and OSGi host - if (domainManager != null) { - stopDomainManager(domainManager); - } - if (equinox != null) { - equinox.stop(); - } - } - } - - - /** - * Stop the given domain manager. - * - * @param domainManager - * @throws Exception - */ - private static void stopDomainManager(Object domainManager) throws Exception { - try { - domainManager.getClass().getMethod("stop").invoke(domainManager); - logger.info("SCA Domain Manager is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Domain Manager could not be stopped", e); - throw e; - } - } - - private static class ShutdownThread extends Thread { - private Object domainManager; - private EquinoxHost equinox; - - public ShutdownThread(Object domainManager, EquinoxHost equinox) { - super(); - this.domainManager = domainManager; - this.equinox = equinox; - } - - @Override - public void run() { - try { - stopDomainManager(domainManager); - } catch (Exception e) { - // Ignore - } - try { - equinox.stop(); - } catch (Exception e) { - // Ignore - } - } - } -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java deleted file mode 100644 index ae7aa57cb9..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java +++ /dev/null @@ -1,658 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import static java.lang.System.currentTimeMillis; -import static java.lang.System.setProperty; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.GATEWAY_BUNDLE; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.LAUNCHER_EQUINOX_LIBRARIES; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.artifactId; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.bundleName; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.file; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.fixupBundle; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.jarVersion; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.runtimeClasspathEntries; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.string; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.thirdPartyLibraryBundle; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.thisBundleLocation; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.UUID; -import java.util.jar.Manifest; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; -import org.osgi.framework.Constants; -import org.osgi.framework.launch.Framework; - -/** - * Wraps the Equinox runtime. - */ -public class EquinoxHost { - static final String PROP_OSGI_CONTEXT_CLASS_LOADER_PARENT = "osgi.contextClassLoaderParent"; - - static final String PROP_OSGI_CLEAN = "osgi.clean"; - - static final String PROP_USER_NAME = "user.name"; - - private static Logger logger = Logger.getLogger(EquinoxHost.class.getName()); - - static final String PROP_INSTALL_AREA = "osgi.install.area"; - static final String PROP_CONFIG_AREA = "osgi.configuration.area"; - static final String PROP_CONFIG_AREA_DEFAULT = "osgi.configuration.area.default"; - static final String PROP_SHARED_CONFIG_AREA = "osgi.sharedConfiguration.area"; - static final String PROP_INSTANCE_AREA = "osgi.instance.area"; - static final String PROP_INSTANCE_AREA_DEFAULT = "osgi.instance.area.default"; - static final String PROP_USER_AREA = "osgi.user.area"; - static final String PROP_USER_AREA_DEFAULT = "osgi.user.area.default"; - - /** - * If the class is loaded inside OSGi, then the bundle context will be injected by the activator - */ - static BundleContext injectedBundleContext; - - static { - if (getSystemProperty("osgi.debug") != null) { - logger.setLevel(Level.FINE); - } - } - - private BundleContext bundleContext; - private Bundle launcherBundle; - private List<URL> bundleFiles = new ArrayList<URL>(); - private List<String> bundleNames = new ArrayList<String>(); - private Map<URL, Manifest> jarFiles = new HashMap<URL, Manifest>(); - private Map<String, Bundle> allBundles = new HashMap<String, Bundle>(); - private List<Bundle> installedBundles = new ArrayList<Bundle>(); - - private Set<URL> bundleLocations; - private boolean aggregateThirdPartyJars = false; - - private FrameworkLauncher frameworkLauncher = new FrameworkLauncher(); - private Framework framework; - - public EquinoxHost() { - super(); - } - - public EquinoxHost(Set<URL> urls) { - super(); - this.bundleLocations = urls; - } - - private static String getSystemProperty(final String name) { - return AccessController.doPrivileged(new PrivilegedAction<String>() { - public String run() { - return System.getProperty(name); - } - }); - } - - private static Properties getSystemProperties() { - return AccessController.doPrivileged(new PrivilegedAction<Properties>() { - public Properties run() { - Properties props = new Properties(); - for (Map.Entry<Object, Object> e : System.getProperties().entrySet()) { - if (e.getKey() instanceof String) { - String prop = (String)e.getKey(); - if (prop.startsWith("osgi.") || prop.startsWith("eclipse.")) { - props.put(prop, e.getValue()); - } - } - } - return props; - } - }); - } - - private static void put(Properties props, String key, String value) { - if (!props.contains(key)) { - props.put(key, value); - } - } - - - /** - * Search for org/apache/tuscany/sca/node/equinox/launcher for customized MANIFEST.MF - * for a given artifact. For example, a-1.0.MF for a-1.0.jar. - * - * @param fileName - * @return - * @throws IOException - */ - private Manifest getCustomizedMF(String fileName) throws IOException { - int index = fileName.lastIndexOf('.'); - if (index == -1) { - return null; - } - String mf = fileName.substring(0, index) + ".MF"; - InputStream is = getClass().getResourceAsStream(mf); - if (is == null) { - return null; - } else { - try { - Manifest manifest = new Manifest(is); - return manifest; - } finally { - is.close(); - } - } - } - - /** - * Start the Equinox host. - * - * @return - */ - public BundleContext start() { - try { - if (injectedBundleContext == null) { - - Properties props = configureProperties(); - startFramework(props); - - } else { - - // Get bundle context from the running Eclipse instance - bundleContext = injectedBundleContext; - } - - // Determine the runtime classpath entries - Set<URL> urls; - urls = findBundleLocations(); - - // Sort out which are bundles (and not already installed) and which are just - // regular JARs - for (URL url : urls) { - File file = file(url); - - Manifest manifest = getCustomizedMF(file.getName()); - String bundleName = null; - if (manifest == null) { - bundleName = bundleName(file); - } else { - if (manifest.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME) == null) { - manifest = null; - } - } - if (bundleName != null) { - bundleFiles.add(url); - bundleNames.add(bundleName); - } else { - if (file.isFile()) { - jarFiles.put(url, manifest); - } - } - } - - // Get the already installed bundles - for (Bundle bundle : bundleContext.getBundles()) { - allBundles.put(bundle.getSymbolicName(), bundle); - } - - // Install the launcher bundle if necessary - String launcherBundleName = "org.apache.tuscany.sca.node.launcher.equinox"; - String launcherBundleLocation; - launcherBundle = allBundles.get(launcherBundleName); - if (launcherBundle == null) { - launcherBundleLocation = thisBundleLocation(); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Installing launcher bundle: " + launcherBundleLocation); - } - fixupBundle(launcherBundleLocation); - launcherBundle = bundleContext.installBundle(launcherBundleLocation); - allBundles.put(launcherBundleName, launcherBundle); - installedBundles.add(launcherBundle); - } else { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Launcher bundle is already installed: " + string(launcherBundle, false)); - } - // launcherBundleLocation = thisBundleLocation(launcherBundle); - } - - // FIXME: SDO bundles dont have the correct dependencies - setProperty("commonj.sdo.impl.HelperProvider", "org.apache.tuscany.sdo.helper.HelperProviderImpl"); - - // Install the Tuscany bundles - long start = currentTimeMillis(); - - if (logger.isLoggable(Level.FINE)) { - logger.fine("Generating third-party library bundle."); - } - - logger.info("Checking for manfiests customized by Tuscany in node-launcher-equinox/resources"); - - long libraryStart = currentTimeMillis(); - - Set<String> serviceProviders = new HashSet<String>(); - if (!aggregateThirdPartyJars) { - for (Map.Entry<URL, Manifest> entry : jarFiles.entrySet()) { - URL jarFile = entry.getKey(); - Manifest manifest = entry.getValue(); - Bundle bundle = null; - if (manifest == null) { - bundle = installAsBundle(jarFile, null); - } else { - bundle = installAsBundle(Collections.singleton(jarFile), manifest); - } - isServiceProvider(bundle, serviceProviders); - } - } else { - Bundle bundle = installAsBundle(jarFiles.keySet(), LAUNCHER_EQUINOX_LIBRARIES); - isServiceProvider(bundle, serviceProviders); - } - - installGatewayBundle(serviceProviders); - - if (logger.isLoggable(Level.FINE)) { - logger - .fine("Third-party library bundle installed in " + (currentTimeMillis() - libraryStart) + " ms: "); - } - - // Install all the other bundles that are not already installed - for (URL bundleFile : bundleFiles) { - fixupBundle(bundleFile.toString()); - } - for (int i = 0, n = bundleFiles.size(); i < n; i++) { - URL bundleFile = bundleFiles.get(i); - String bundleName = bundleNames.get(i); - if (bundleName.contains("org.eclipse.jdt.junit") || bundleName.contains("org.apache.tuscany.sca.base")) { - continue; - } - installBundle(bundleFile, bundleName); - } - - long end = currentTimeMillis(); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Tuscany bundles are installed in " + (end - start) + " ms."); - } - - // Start the extensiblity and launcher bundles - String extensibilityBundleName = "org.apache.tuscany.sca.extensibility.equinox"; - Bundle extensibilityBundle = allBundles.get(extensibilityBundleName); - if (extensibilityBundle != null) { - if ((extensibilityBundle.getState() & Bundle.ACTIVE) == 0) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Starting bundle: " + string(extensibilityBundle, false)); - } - extensibilityBundle.start(); - } else if (logger.isLoggable(Level.FINE)) { - logger.fine("Bundle is already started: " + string(extensibilityBundle, false)); - } - } - if ((launcherBundle.getState() & Bundle.ACTIVE) == 0) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Starting launcher bundle: " + string(launcherBundle, false)); - } - launcherBundle.start(); - } else if (logger.isLoggable(Level.FINE)) { - logger.fine("Bundle is already started: " + string(launcherBundle, false)); - } - - // Start all our bundles for now to help diagnose any class loading issues - // startBundles( bundleContext ); - return bundleContext; - - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - protected Properties configureProperties() throws IOException, FileNotFoundException { - String version = getSystemProperty("java.specification.version"); - - /** - * [rfeng] I have to remove javax.transaction.* packages from the system bundle - * See: http://www.mail-archive.com/dev@geronimo.apache.org/msg70761.html - */ - String profile = "J2SE-1.5.profile"; - if (version.startsWith("1.6")) { - profile = "JavaSE-1.6.profile"; - } - Properties props = new Properties(); - InputStream is = getClass().getResourceAsStream(profile); - if (is != null) { - props.load(is); - is.close(); - } - - props.putAll(getSystemProperties()); - - // Configure Eclipse properties - - // Use the boot classloader as the parent classloader - put(props, PROP_OSGI_CONTEXT_CLASS_LOADER_PARENT, "app"); - - // Set startup properties - put(props, PROP_OSGI_CLEAN, "true"); - - // Set location properties - // FIXME Use proper locations - String tmpDir = getSystemProperty("java.io.tmpdir"); - File root = new File(tmpDir); - // Add user name as the prefix. For multiple users on the same Lunix, - // there will be permission issue if one user creates the .tuscany folder - // first under /tmp with no write permission for others. - String userName = getSystemProperty(PROP_USER_NAME); - if (userName != null) { - root = new File(root, userName); - } - root = new File(root, ".tuscany/equinox/" + UUID.randomUUID().toString()); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Equinox location: " + root); - } - - put(props, PROP_INSTANCE_AREA_DEFAULT, new File(root, "workspace").toURI().toString()); - put(props, PROP_INSTALL_AREA, new File(root, "install").toURI().toString()); - put(props, PROP_CONFIG_AREA_DEFAULT, new File(root, "config").toURI().toString()); - put(props, PROP_USER_AREA_DEFAULT, new File(root, "user").toURI().toString()); - - // Test if the configuration/config.ini or osgi.bundles has been set - // If yes, try to avoid discovery of bundles - if (bundleLocations == null) { - if (props.getProperty("osgi.bundles") != null) { - bundleLocations = Collections.emptySet(); - } else { - String config = props.getProperty(PROP_CONFIG_AREA); - File ini = new File(config, "config.ini"); - if (ini.isFile()) { - Properties iniProps = new Properties(); - iniProps.load(new FileInputStream(ini)); - if (iniProps.getProperty("osgi.bundles") != null) { - bundleLocations = Collections.emptySet(); - } - } - } - } - return props; - } - - private boolean isServiceProvider(Bundle bundle, Set<String> serviceProviders) { - if (bundle != null) { - String export = (String)bundle.getHeaders().get(Constants.EXPORT_PACKAGE); - if (export != null && export.contains(NodeLauncherUtil.META_INF_SERVICES)) { - serviceProviders.add(bundle.getSymbolicName()); - return true; - } - } - return false; - } - - private void installGatewayBundle(Set<String> bundles) throws IOException, BundleException { - if (allBundles.containsKey(GATEWAY_BUNDLE)) { - return; - } - if (bundles == null) { - bundles = allBundles.keySet(); - } - InputStream gateway = NodeLauncherUtil.generateGatewayBundle(bundles, null, false); - if (gateway != null) { - Bundle gatewayBundle = bundleContext.installBundle(GATEWAY_BUNDLE, gateway); - allBundles.put(NodeLauncherUtil.GATEWAY_BUNDLE, gatewayBundle); - installedBundles.add(gatewayBundle); - } - } - - /** - * Start all the bundles as a check for class loading issues - * @param bundleContext - the bundle context - */ - private void startBundles(BundleContext bundleContext) { - - for (Bundle bundle : bundleContext.getBundles()) { - // if (bundle.getSymbolicName().startsWith("org.apache.tuscany.sca")) { - if ((bundle.getState() & Bundle.ACTIVE) == 0) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Starting bundle: " + string(bundle, false)); - } // end if - try { - bundle.start(); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - // throw e; - } // end try - if (logger.isLoggable(Level.FINE)) { - logger.fine("Bundle: " + string(bundle, false)); - } // end if - } // end if - // } // end if - } // end for - logger.fine("Tuscany bundles are started."); - return; - } // end startBundles - - public Bundle installAsBundle(Collection<URL> jarFiles, String libraryBundleName) throws IOException, - BundleException { - // Install a single 'library' bundle for the third-party JAR files - Bundle libraryBundle = allBundles.get(libraryBundleName); - if (libraryBundle == null) { - InputStream library = thirdPartyLibraryBundle(jarFiles, libraryBundleName, null); - libraryBundle = bundleContext.installBundle(libraryBundleName, library); - allBundles.put(libraryBundleName, libraryBundle); - installedBundles.add(libraryBundle); - } else { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Third-party library bundle is already installed: " + string(libraryBundle, false)); - } - } - return libraryBundle; - } - - public Bundle installAsBundle(Collection<URL> jarFiles, Manifest manifest) throws IOException, BundleException { - String bundleName = manifest.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME); - - // Install a single 'library' bundle for the third-party JAR files - Bundle libraryBundle = allBundles.get(bundleName); - if (libraryBundle == null) { - InputStream library = thirdPartyLibraryBundle(jarFiles, manifest); - libraryBundle = bundleContext.installBundle(bundleName, library); - allBundles.put(bundleName, libraryBundle); - installedBundles.add(libraryBundle); - } else { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Third-party library bundle is already installed: " + string(libraryBundle, false)); - } - } - return libraryBundle; - } - - public Bundle installBundle(URL bundleFile, String bundleName) throws MalformedURLException, BundleException { - if (bundleName == null) { - try { - bundleName = bundleName(file(bundleFile)); - } catch (IOException e) { - bundleName = null; - } - } - Bundle bundle = allBundles.get(bundleName); - if (bundle == null) { - long installStart = currentTimeMillis(); - String location = bundleFile.toString(); - if (frameworkLauncher.isEquinox() && "file".equals(bundleFile.getProtocol())) { - File target = file(bundleFile); - // Use a special "reference" scheme to install the bundle as a reference - // instead of copying the bundle - location = "reference:file:/" + target.getPath(); - } - bundle = bundleContext.installBundle(location); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Bundle " + bundleFile + " installed in " + (currentTimeMillis() - installStart) - + " ms: " - + string(bundle, false)); - } - allBundles.put(bundleName, bundle); - installedBundles.add(bundle); - } - return bundle; - } - - public Bundle installAsBundle(URL jarFile, String symbolicName) throws IOException, BundleException { - if (symbolicName == null) { - symbolicName = LAUNCHER_EQUINOX_LIBRARIES + "." + artifactId(jarFile); - } - Bundle bundle = allBundles.get(symbolicName); - if (bundle == null) { - String version = jarVersion(jarFile); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Installing third-party jar as bundle: " + jarFile); - } - InputStream is = thirdPartyLibraryBundle(Collections.singleton(jarFile), symbolicName, version); - // try/catch and output message added 10/04/2009 Mike Edwards - try { - bundle = bundleContext.installBundle(symbolicName, is); - allBundles.put(symbolicName, bundle); - installedBundles.add(bundle); - } catch (BundleException e) { - System.out - .println("EquinoxHost:installAsBundle - BundleException raised when dealing with jar " + symbolicName); - throw (e); - } // end try - // end of addition - } - return bundle; - } - - private Set<URL> findBundleLocations() throws FileNotFoundException, URISyntaxException, MalformedURLException { - if (bundleLocations == null || - (bundleLocations != null && bundleLocations.size() == 0)) { - if (injectedBundleContext != null) { - // Use classpath entries from a distribution if there is one and the modules - // directories available in a dev environment for example - bundleLocations = runtimeClasspathEntries(true, false, true); - } else { - // Use classpath entries from a distribution if there is one and the classpath - // entries on the current application's classloader - // *** Changed by Mike Edwards, 9th April 2009 *** - // -- this place is reached when starting from within Eclipse so why use the classpath?? - // bundleLocations = runtimeClasspathEntries(true, true, false); - // Instead search the modules directory - bundleLocations = runtimeClasspathEntries(true, true, true); - } - } - return bundleLocations; - } - - /** - * Stop the Equinox host. - */ - public void stop() { - try { - - // Uninstall all the bundles we've installed - for (int i = installedBundles.size() - 1; i >= 0; i--) { - Bundle bundle = installedBundles.get(i); - try { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Uninstalling bundle: " + string(bundle, false)); - } - bundle.uninstall(); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - } - } - installedBundles.clear(); - - stopFramework(); - - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - /* - private void startFramework(Properties props) throws Exception { - EclipseStarter.setInitialProperties(props); - - // Test if the configuration/config.ini or osgi.bundles has been set - // If yes, try to avoid discovery of bundles - if (bundleLocations == null) { - if (props.getProperty("osgi.bundles") != null) { - bundleLocations = Collections.emptySet(); - } else { - String config = props.getProperty(PROP_CONFIG_AREA); - File ini = new File(config, "config.ini"); - if (ini.isFile()) { - Properties iniProps = new Properties(); - iniProps.load(new FileInputStream(ini)); - if (iniProps.getProperty("osgi.bundles") != null) { - bundleLocations = Collections.emptySet(); - } - } - } - } - - // Start Eclipse - bundleContext = EclipseStarter.startup(new String[] {}, null); - } - - private void stopFramework() throws Exception { - // Shutdown Eclipse if we started it ourselves - if (injectedBundleContext == null) { - EclipseStarter.shutdown(); - } - } - */ - - private void startFramework(Map configuration) throws Exception { - if (framework != null) { - throw new IllegalStateException("The OSGi framework has been started"); - } - framework = frameworkLauncher.newFramework(configuration); - framework.start(); - this.bundleContext = framework.getBundleContext(); - } - - private void stopFramework() throws Exception { - // Shutdown Eclipse if we started it ourselves - if (injectedBundleContext == null) { - framework.stop(); - framework.waitForStop(5000); - framework = null; - bundleContext = null; - } - } - - - public void setBundleLocations(Set<URL> bundleLocations) { - this.bundleLocations = bundleLocations; - } - -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java deleted file mode 100644 index 414f3aae63..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; -import java.util.Properties; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.eclipse.osgi.framework.console.CommandProvider; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.launch.Framework; -import org.osgi.framework.launch.FrameworkFactory; - -/** - * Launcher for the OSGi framework using the framework launch APIs - */ -public class FrameworkLauncher implements BundleActivator { - private static final String FACTORY_RESOURCE = "META-INF/services/" + FrameworkFactory.class.getName(); - - private static final Logger logger = Logger.getLogger(FrameworkLauncher.class.getName()); - - private FrameworkFactory factory; - private boolean isEquinox; - - @SuppressWarnings("unchecked") - private synchronized FrameworkFactory loadFrameworkFactory() { - if (factory == null) { - try { - ClassLoader classLoader = FrameworkFactory.class.getClassLoader(); - InputStream is = classLoader.getResourceAsStream(FACTORY_RESOURCE); - if (is == null) { - classLoader = Thread.currentThread().getContextClassLoader(); - is = classLoader.getResourceAsStream(FACTORY_RESOURCE); - } - if (is == null) { - return null; - } - BufferedReader reader = null; - String line = null; - try { - reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); - while (true) { - line = reader.readLine(); - if (line == null) - break; - line = line.trim(); - if (!line.startsWith("#") && !"".equals(line)) { - break; - } - } - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - // Ignore - } - } - } - if (line != null) { - Class<? extends FrameworkFactory> factoryImplClass = - (Class<? extends FrameworkFactory>)Class.forName(line, false, classLoader); - factory = factoryImplClass.newInstance(); - if (factory != null && factory.getClass().getName().startsWith("org.eclipse.osgi.")) { - isEquinox = true; - } - - } - } catch (Throwable e) { - logger.log(Level.SEVERE, e.getMessage(), e); - } - } - return factory; - } - - public Framework newFramework(Map properties) { - FrameworkFactory factory = loadFrameworkFactory(); - if (factory == null) { - return null; - } - String propertyFile = null; - String factoryName = factory.getClass().getName(); - if (factoryName.startsWith("org.eclipse.osgi.")) { - propertyFile = "equinox.properties"; - } else if (factoryName.startsWith("org.apache.felix.")) { - propertyFile = "felix.properties"; - } - Map propMap = new HashMap(); - if (propertyFile != null) { - InputStream is = getClass().getResourceAsStream(propertyFile); - if (is != null) { - Properties props = new Properties(); - try { - props.load(is); - } catch (IOException e) { - logger.log(Level.WARNING, e.getMessage(), e); - } - propMap.putAll(props); - } - } - propMap.putAll(properties); - return factory.newFramework(propMap); - } - - public boolean isEquinox() { - return isEquinox; - } - - public void start(BundleContext context) throws Exception { - EquinoxHost.injectedBundleContext = context; - if (context.getClass().getName().startsWith("org.eclipse.osgi.")) { - isEquinox = true; - try { - context.registerService(CommandProvider.class.getName(), new NodeLauncherCommand(), new Hashtable()); - } catch (NoClassDefFoundError e) { - // Ignore it - } - } - } - - public void stop(BundleContext context) throws Exception { - EquinoxHost.injectedBundleContext = null; - } - - private static final String DELIM_START = "${"; - private static final String DELIM_STOP = "}"; - - /** - * <p> - * This method performs property variable substitution on the - * specified value. If the specified value contains the syntax - * <tt>${<prop-name>}</tt>, where <tt><prop-name></tt> - * refers to either a configuration property or a system property, - * then the corresponding property value is substituted for the variable - * placeholder. Multiple variable placeholders may exist in the - * specified value as well as nested variable placeholders, which - * are substituted from inner most to outer most. Configuration - * properties override system properties. - * </p> - * @param val The string on which to perform property substitution. - * @param currentKey The key of the property being evaluated used to - * detect cycles. - * @param cycleMap Map of variable references used to detect nested cycles. - * @param configProps Set of configuration properties. - * @return The value of the specified string after system property substitution. - * @throws IllegalArgumentException If there was a syntax error in the - * property placeholder syntax or a recursive variable reference. - **/ - public static String substVars(String val, String currentKey, Map cycleMap, Properties configProps) - throws IllegalArgumentException { - // If there is currently no cycle map, then create - // one for detecting cycles for this invocation. - if (cycleMap == null) { - cycleMap = new HashMap(); - } - - // Put the current key in the cycle map. - cycleMap.put(currentKey, currentKey); - - // Assume we have a value that is something like: - // "leading ${foo.${bar}} middle ${baz} trailing" - - // Find the first ending '}' variable delimiter, which - // will correspond to the first deepest nested variable - // placeholder. - int stopDelim = val.indexOf(DELIM_STOP); - - // Find the matching starting "${" variable delimiter - // by looping until we find a start delimiter that is - // greater than the stop delimiter we have found. - int startDelim = val.indexOf(DELIM_START); - while (stopDelim >= 0) { - int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length()); - if ((idx < 0) || (idx > stopDelim)) { - break; - } else if (idx < stopDelim) { - startDelim = idx; - } - } - - // If we do not have a start or stop delimiter, then just - // return the existing value. - if ((startDelim < 0) && (stopDelim < 0)) { - return val; - } - // At this point, we found a stop delimiter without a start, - // so throw an exception. - else if (((startDelim < 0) || (startDelim > stopDelim)) && (stopDelim >= 0)) { - throw new IllegalArgumentException("stop delimiter with no start delimiter: " + val); - } - - // At this point, we have found a variable placeholder so - // we must perform a variable substitution on it. - // Using the start and stop delimiter indices, extract - // the first, deepest nested variable placeholder. - String variable = val.substring(startDelim + DELIM_START.length(), stopDelim); - - // Verify that this is not a recursive variable reference. - if (cycleMap.get(variable) != null) { - throw new IllegalArgumentException("recursive variable reference: " + variable); - } - - // Get the value of the deepest nested variable placeholder. - // Try to configuration properties first. - String substValue = (configProps != null) ? configProps.getProperty(variable, null) : null; - if (substValue == null) { - // Ignore unknown property values. - substValue = System.getProperty(variable, ""); - } - - // Remove the found variable from the cycle map, since - // it may appear more than once in the value and we don't - // want such situations to appear as a recursive reference. - cycleMap.remove(variable); - - // Append the leading characters, the substituted value of - // the variable, and the trailing characters to get the new - // value. - val = val.substring(0, startDelim) + substValue + val.substring(stopDelim + DELIM_STOP.length(), val.length()); - - // Now perform substitution again, since there could still - // be substitutions to make. - val = substVars(val, currentKey, cycleMap, configProps); - - // Return the value. - return val; - } - -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherException.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherException.java deleted file mode 100644 index b9bb70b5d7..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherException.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tuscany.sca.node.equinox.launcher; - - -/** - * Denotes an error launching an SCA domain manager or node. - * - * @version $Rev$ $Date$ - */ -public class LauncherException extends Exception { - private static final long serialVersionUID = 4581189418849190567L; - - public LauncherException() { - super(); - } - - /** - * @param message - * @param cause - */ - public LauncherException(String message, Throwable cause) { - super(message, cause); - } - - /** - * @param message - */ - public LauncherException(String message) { - super(message); - } - - /** - * @param cause - */ - public LauncherException(Throwable cause) { - super(cause); - } -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeDaemonLauncher.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeDaemonLauncher.java deleted file mode 100644 index aeb29c0789..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeDaemonLauncher.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.nodeDaemon; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * A launcher for the SCA Node daemon. - * - * @version $Rev$ $Date$ - */ -public class NodeDaemonLauncher { - - static final Logger logger = Logger.getLogger(NodeDaemonLauncher.class.getName()); - - /** - * Constructs a new node daemon launcher. - */ - private NodeDaemonLauncher() { - } - - /** - * Returns a new launcher instance. - * - * @return a new launcher instance - */ - public static NodeDaemonLauncher newInstance() { - return new NodeDaemonLauncher(); - } - - /** - * Creates a new node daemon. - * - * @param - * @return a new node daemon - * @throws LauncherException - */ - public <T> T createNodeDaemon() throws LauncherException { - return (T)nodeDaemon(); - } - - public static void main(String[] args) throws Exception { - logger.info("Apache Tuscany SCA Node Daemon is starting..."); - - // Create a node launcher - NodeDaemonLauncher launcher = newInstance(); - - EquinoxHost equinox = null; - Object node = null; - ShutdownThread shutdown = null; - try { - - // Start the OSGi host - equinox = new EquinoxHost(); - equinox.start(); - - // Start the node - node = launcher.createNodeDaemon(); - try { - node.getClass().getMethod("start").invoke(node); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node Daemon could not be started", e); - throw e; - } - logger.info("SCA Node Daemon is now started."); - - // Install a shutdown hook - shutdown = new ShutdownThread(node, equinox); - Runtime.getRuntime().addShutdownHook(shutdown); - - logger.info("Press enter to shutdown."); - try { - System.in.read(); - } catch (IOException e) { - - // Wait forever - Object lock = new Object(); - synchronized(lock) { - lock.wait(); - } - } - } finally { - - // Remove the shutdown hook - if (shutdown != null) { - Runtime.getRuntime().removeShutdownHook(shutdown); - } - - // Stop the node - if (node != null) { - stopNode(node); - } - if (equinox != null) { - equinox.stop(); - } - } - } - - /** - * Stop the given node. - * - * @param node - * @throws Exception - */ - private static void stopNode(Object node) throws Exception { - try { - node.getClass().getMethod("stop").invoke(node); - logger.info("SCA Node Daemon is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node Daemon could not be stopped", e); - throw e; - } - } - - private static class ShutdownThread extends Thread { - private Object node; - private EquinoxHost equinox; - - public ShutdownThread(Object node, EquinoxHost equinox) { - super(); - this.node = node; - this.equinox = equinox; - } - - @Override - public void run() { - try { - stopNode(node); - } catch (Exception e) { - // Ignore - } - try { - equinox.stop(); - } catch (Exception e) { - // Ignore - } - } - } -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java deleted file mode 100644 index 678d88dab7..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.node; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.PosixParser; -import org.osgi.framework.BundleContext; - -/** - * A launcher for SCA nodes. - * - * Agruments: - * [-config <equinoxConfiguration>]: The configuration folder for Equinox - * [-bundles <osgiBundles>]: A list of bundles to be installed - * [-c <compositeURI>]: The composite URI - * [-t <ttl>]: Time to live in milliseconds before the node is started - * contribution1 ... contributionN: A list of contribution files or URLs - * - * @version $Rev$ $Date$ - */ -public class NodeLauncher { - - static final Logger logger = Logger.getLogger(NodeLauncher.class.getName()); - private EquinoxHost equinoxHost; - private BundleContext bundleContext; - - /** - * Constructs a new node launcher. - */ - private NodeLauncher() { - equinoxHost = new EquinoxHost(); - bundleContext = equinoxHost.start(); - } - - /** - * Returns a new launcher instance. - * - * @return a new launcher instance - */ - public static NodeLauncher newInstance() { - return new NodeLauncher(); - } - - /** - * Creates a new SCA node from the configuration URL - * - * @param configurationURL the URL of the node configuration which is the ATOM feed - * that contains the URI of the composite and a collection of URLs for the contributions - * - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String configurationURL) throws LauncherException { - return (T)node(configurationURL, null, null, null, bundleContext); - } - - /** - * Creates a new SCA OSGi Node. - * - * @param compositeURI the URI of the composite to use - * @param contributions the URI of the contributions that provides the composites and related - * artifacts. If the list is empty, then we will use the thread context classloader to discover - * the contribution on the classpath - * - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String compositeURI, Contribution... contributions) throws LauncherException { - return (T)node(null, compositeURI, null, contributions, bundleContext); - } - - /** - * Creates a new SCA OSGi Node. - * - * @param compositeURI the URI of the composite to use - * @param compositeContent the XML content of the composite to use - * @param contributions the URI of the contributions that provides the composites and related artifacts - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String compositeURI, String compositeContent, Contribution... contributions) - throws LauncherException { - return (T)node(null, compositeURI, compositeContent, contributions, bundleContext); - } - - public static void main(String[] args) throws Exception { - CommandLineParser parser = new PosixParser(); - Options options = getCommandLineOptions(); - CommandLine cli = parser.parse(options, args); - - Object node = null; - ShutdownThread shutdown = null; - EquinoxHost equinox = null; - try { - - if (cli.hasOption("config")) { - System.setProperty("osgi.configuration.area", cli.getOptionValue("config")); - } - - while (true) { - if (cli.hasOption("node")) { - // Create a node from a configuration URI - String configurationURI = cli.getOptionValue("node"); - logger.info("SCA Node configuration: " + configurationURI); - - // Create a node launcher - NodeLauncher launcher = newInstance(); - equinox = launcher.equinoxHost; - - node = launcher.createNode(configurationURI); - } - else if (cli.hasOption("bundles")) { - /** - * osgi.bundles - * The comma-separated list of bundles which are automatically installed and optionally started once the system is up - * and running. Each entry is of the form: - * <URL | simple bundle location>[@ [<start-level>] [":start"]] - * If the start-level (>0 integer) is omitted then the framework will use the default start level for the bundle. - * If the "start" tag is added then the bundle will be marked as started after being installed. Simple bundle locations are - * interepreted as relative to the framework's parent directory. The start-level indicates the OSGi start level at which the - * bundle should run. If this value is not set, the system computes an appropriate default. - */ - String bundles = cli.getOptionValue("bundles"); - if (bundles != null) { - System.setProperty("osgi.bundles", cli.getOptionValue("bundles")); - } - - // Create a node launcher - NodeLauncher launcher = newInstance(); - equinox = launcher.equinoxHost; - - /* - List<String> bundleFiles = cli.getArgList(); - for (String bf : bundleFiles) { - File f = new File(bf); - equinox.installBundle(f.toURI().toURL(), null); - } - for (Bundle b : launcher.bundleContext.getBundles()) { - try { - if (b.getHeaders().get(Constants.FRAGMENT_HOST) == null) { - // Start the non-fragment bundle - b.start(); - } - } catch (Exception e) { - logger.severe(NodeLauncherUtil.string(b, false) + " " + e.getMessage()); - // logger.log(Level.SEVERE, e.getMessage(), e); - } - } - */ - - } - else { - // Create a node from a composite URI and a contribution location - String compositeURI = cli.getOptionValue("composite"); - List<String> contribs = cli.getArgList(); - Contribution[] contributions = null; - if (!contribs.isEmpty()) { - contributions = new Contribution[contribs.size()]; - int index = 0; - for (String contrib : contribs) { - logger.info("SCA contribution: " + contrib); - URL url = null; - try { - url = new URL(contrib); - } catch (MalformedURLException e) { - url = new File(contrib).toURI().toURL(); - } - contributions[index] = new Contribution("contribution-" + index, url.toString()); - index++; - } - } else { - HelpFormatter formatter = new HelpFormatter(); - formatter.setSyntaxPrefix("Usage: "); - formatter.printHelp("java " + NodeLauncher.class.getName() - + " [-config <equinoxConfiguration>]" - + " [-c <compositeURI>]" - + " [-b <bundles>]" - + " [-t <ttl>]" - + " contribution1 ... contributionN", options); - return; - } - // Create a node launcher - logger.info("SCA composite: " + compositeURI); - NodeLauncher launcher = newInstance(); - equinox = launcher.equinoxHost; - node = launcher.createNode(compositeURI, contributions); - } - - if (node != null) { - logger.info("Apache Tuscany SCA Node is starting..."); - - // Start the node - try { - node.getClass().getMethod("start").invoke(node); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be started", e); - throw e; - } - logger.info("SCA Node is now started."); - } - // Install a shutdown hook - shutdown = new ShutdownThread(node, equinox); - Runtime.getRuntime().addShutdownHook(shutdown); - - long ttl = Long.parseLong(cli.getOptionValue("ttl", "-1")); - if (ttl >= 0) { - logger.info("Waiting for " + ttl + " milliseconds ..."); - Thread.sleep(ttl); - break; // Exit - } - - // Wait until the "Enter" is pressed - logger.info("Press 'q' to quit, 'r' to restart."); - int k = 0; - try { - while ((k != 'q') && (k != 'r')) { - k = System.in.read(); - } - } catch (IOException e) { - - // Wait forever - Object lock = new Object(); - synchronized (lock) { - lock.wait(); - } - } - - // Stop the node - if (node != null) { - Object n = node; - node = null; - stopNode(n); - } - - // Quit - if (k == 'q') { - break; - } - - } - } finally { - - // Remove the shutdown hook - if (shutdown != null) { - Runtime.getRuntime().removeShutdownHook(shutdown); - } - - // Stop the node - if (node != null) { - destroyNode(node); - } - if (equinox != null) { - equinox.stop(); - } - } - } - - static Options getCommandLineOptions() { - Options options = new Options(); - Option opt1 = new Option("c", "composite", true, "URI for the composite"); - opt1.setArgName("compositeURI"); - options.addOption(opt1); - Option opt2 = new Option("n", "node", true, "URI for the node configuration"); - opt2.setArgName("nodeConfigurationURI"); - options.addOption(opt2); - Option opt3 = new Option("config", "configuration", true, "Configuration"); - opt3.setArgName("equinoxConfiguration"); - options.addOption(opt3); - Option opt4 = new Option("t", "ttl", true, "Time to live"); - opt4.setArgName("timeToLiveInMilliseconds"); - // opt4.setType(long.class); - options.addOption(opt4); - - Option opt5 = new Option("b", "bundles", false, "OSGi bundles"); - opt4.setArgName("osgiBundles"); - options.addOption(opt5); - - return options; - } - - public void destroy() { - if (equinoxHost != null) { - equinoxHost.stop(); - bundleContext = null; - } - } - - /** - * Stop the given node. - * - * @param node - * @throws Exception - */ - private static void destroyNode(Object node) throws Exception { - try { - node.getClass().getMethod("stop").invoke(node); - logger.info("SCA Node is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be stopped", e); - throw e; - } - } - - private static class ShutdownThread extends Thread { - private Object node; - private EquinoxHost equinox; - - public ShutdownThread(Object node, EquinoxHost equinox) { - super(); - this.node = node; - this.equinox = equinox; - } - - @Override - public void run() { - try { - destroyNode(node); - } catch (Exception e) { - // Ignore - } - try { - equinox.stop(); - } catch (Exception e) { - // Ignore - } - } - } - - /** - * Stop the given node. - * - * @param node - * @throws Exception - */ - private static void stopNode(Object node) throws Exception { - try { - node.getClass().getMethod("stop").invoke(node); - logger.info("SCA Node is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be stopped", e); - throw e; - } - } -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher2.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher2.java deleted file mode 100644 index 14018a7af5..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher2.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.node; - -import java.io.File; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.osgi.framework.BundleContext; - -/** - * A launcher for SCA nodes. - * - * @version $Rev$ $Date$ - */ -public class NodeLauncher2 { - - static final Logger logger = Logger.getLogger(NodeLauncher2.class.getName()); - private EquinoxHost equinoxHost; - private BundleContext bundleContext; - - /** - * Constructs a new node launcher. - */ - private NodeLauncher2() { - equinoxHost = new EquinoxHost(); - bundleContext = equinoxHost.start(); - } - - /** - * Returns a new launcher instance. - * - * @return a new launcher instance - */ - public static NodeLauncher2 newInstance() { - return new NodeLauncher2(); - } - - /** - * Creates a new SCA node from the configuration URL - * - * @param configurationURL the URL of the node configuration which is the ATOM feed - * that contains the URI of the composite and a collection of URLs for the contributions - * - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String configurationURL) throws LauncherException { - return (T)node(configurationURL, null, null, null, bundleContext); - } - - /** - * Creates a new SCA OSGi Node. - * - * @param compositeURI the URI of the composite to use - * @param contributions the URI of the contributions that provides the composites and related - * artifacts. If the list is empty, then we will use the thread context classloader to discover - * the contribution on the classpath - * - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String compositeURI, Contribution... contributions) throws LauncherException { - return (T)node(null, compositeURI, null, contributions, bundleContext); - } - - /** - * Creates a new SCA OSGi Node. - * - * @param compositeURI the URI of the composite to use - * @param compositeContent the XML content of the composite to use - * @param contributions the URI of the contributions that provides the composites and related artifacts - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String compositeURI, String compositeContent, Contribution... contributions) - throws LauncherException { - return (T)node(null, compositeURI, compositeContent, contributions, bundleContext); - } - - public static void main(String[] args) throws Exception { - logger.info("Apache Tuscany SCA Node is starting..."); - - // Create a node launcher - NodeLauncher2 launcher = newInstance(); - - EquinoxHost equinox = launcher.equinoxHost; - Object node = null; - ShutdownThread shutdown = null; - try { - - Contribution[] contributions = new Contribution[args.length]; - for (int i=0; i<args.length; i++) { - File f = new File(args[i]); - if (!f.exists()) { - System.err.println("contribution not found: " + f); - System.exit(1); - } - contributions[i] = new Contribution(f.toURI().toString(), f.toURI().toString()); - } - - // Create a node from a composite URI and a contribution location -// String contributionLocation = args[1]; -// logger.info("SCA composite: " + null); -// logger.info("SCA contribution: " + contributionLocation); - node = launcher.createNode(null, contributions); - - // Start the node - try { - node.getClass().getMethod("start").invoke(node); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be started", e); - throw e; - } - logger.info("SCA Node is now started."); - - // Install a shutdown hook - shutdown = new ShutdownThread(node, equinox); - Runtime.getRuntime().addShutdownHook(shutdown); - - logger.info("Press enter to shutdown."); - try { - System.in.read(); - } catch (IOException e) { - - // Wait forever - Object lock = new Object(); - synchronized(lock) { - lock.wait(); - } - } - } finally { - - // Remove the shutdown hook - if (shutdown != null) { - Runtime.getRuntime().removeShutdownHook(shutdown); - } - - // Stop the node - if (node != null) { - destroyNode(node); - } - if (equinox != null) { - equinox.stop(); - } - } - } - - public void destroy() { - if (equinoxHost != null) { - equinoxHost.stop(); - bundleContext = null; - } - } - - /** - * Stop the given node. - * - * @param node - * @throws Exception - */ - private static void destroyNode(Object node) throws Exception { - try { - node.getClass().getMethod("stop").invoke(node); - node.getClass().getMethod("destroy").invoke(node); - logger.info("SCA Node is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be stopped", e); - throw e; - } - } - - private static class ShutdownThread extends Thread { - private Object node; - private EquinoxHost equinox; - - public ShutdownThread(Object node, EquinoxHost equinox) { - super(); - this.node = node; - this.equinox = equinox; - } - - @Override - public void run() { - try { - destroyNode(node); - } catch (Exception e) { - // Ignore - } - try { - equinox.stop(); - } catch (Exception e) { - // Ignore - } - } - } -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherCommand.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherCommand.java deleted file mode 100644 index f3ddbe0f80..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherCommand.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.osgi.framework.console.CommandInterpreter; -import org.eclipse.osgi.framework.console.CommandProvider; - -/** - * An Equinox console command extension for Tuscany - * http://www.ibm.com/developerworks/library/os-ecl-osgiconsole/index.html - */ -public class NodeLauncherCommand implements CommandProvider { - - public String getHelp() { - return "---Apache Tuscany Commands for Equinox---\n" - + "\ttuscany - Launch an SCA node\n" - + "\tAgruments:\n" - // + " [-config <equinoxConfiguration>]: The configuration folder for Equinox\n" - // + " [-bundles <osgiBundles>]: A list of bundles to be installed\n" - + "\t[-c <compositeURI>]: The composite URI\n" - + "\t[-t <ttl>]: Time to live in milliseconds before the node is stopped\n" - + "\tcontribution1 ... contributionN: A list of contribution files or URLs\n"; - } - - public void _tuscany(CommandInterpreter ci) throws Exception { - List<String> args = new ArrayList<String>(); - while (true) { - String arg = ci.nextArgument(); - if (arg == null) { - break; - } - args.add(arg); - } - NodeLauncher.main(args.toArray(new String[args.size()])); - } - -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java deleted file mode 100644 index cae4b6728e..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java +++ /dev/null @@ -1,1362 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import static org.osgi.framework.Constants.ACTIVATION_LAZY; -import static org.osgi.framework.Constants.BUNDLE_ACTIVATIONPOLICY; -import static org.osgi.framework.Constants.BUNDLE_CLASSPATH; -import static org.osgi.framework.Constants.BUNDLE_MANIFESTVERSION; -import static org.osgi.framework.Constants.BUNDLE_NAME; -import static org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME; -import static org.osgi.framework.Constants.BUNDLE_VENDOR; -import static org.osgi.framework.Constants.BUNDLE_VERSION; -import static org.osgi.framework.Constants.DYNAMICIMPORT_PACKAGE; -import static org.osgi.framework.Constants.EXPORT_PACKAGE; -import static org.osgi.framework.Constants.REQUIRE_BUNDLE; -import static org.osgi.framework.Constants.RESOLUTION_DIRECTIVE; -import static org.osgi.framework.Constants.RESOLUTION_OPTIONAL; -import static org.osgi.framework.Constants.VISIBILITY_DIRECTIVE; -import static org.osgi.framework.Constants.VISIBILITY_REEXPORT; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLClassLoader; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.jar.Attributes; -import java.util.jar.JarFile; -import java.util.jar.JarInputStream; -import java.util.jar.JarOutputStream; -import java.util.jar.Manifest; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; -import org.osgi.framework.Constants; - -/** - * Common functions and constants used by the admin components. - * - * @version $Rev$ $Date$ - */ -final class NodeLauncherUtil { - private static final String NODE_API_BUNDLE = "org.apache.tuscany.sca.node.api"; - private static final String BASE_BUNDLE = "org.apache.tuscany.sca.base"; - - private static final Logger logger = Logger.getLogger(NodeLauncherUtil.class.getName()); - - static final String META_INF_SERVICES = "META-INF.services;partial=true;mandatory:=partial"; - static final String LAUNCHER_EQUINOX_LIBRARIES = "org.apache.tuscany.sca.node.launcher.equinox.libraries"; - static final String GATEWAY_BUNDLE = "org.apache.tuscany.sca.gateway"; - - private static final String NODE_FACTORY = "org.apache.tuscany.sca.node.NodeFactory"; - - private static final String DOMAIN_MANAGER_LAUNCHER_BOOTSTRAP = - "org.apache.tuscany.sca.domain.manager.launcher.DomainManagerLauncherBootstrap"; - - private static final String NODE_IMPLEMENTATION_DAEMON_BOOTSTRAP = - "org.apache.tuscany.sca.implementation.node.launcher.NodeImplementationDaemonBootstrap"; - - private static final String TUSCANY_HOME = "TUSCANY_HOME"; - private static final String TUSCANY_PATH = "TUSCANY_PATH"; - - /** - * Creates a new node. - * - * @param configurationURI - * @param compositeURI - * @param compositeContent - * @param contributions - * @param contributionClassLoader - * @param bundleContext - * @throws LauncherException - */ - static Object node(String configurationURI, - String compositeURI, - String compositeContent, - Contribution[] contributions, - BundleContext bundleContext) throws LauncherException { - try { - - // Get the node runtime bundle. - Bundle bundle = null; - for (Bundle b : bundleContext.getBundles()) { - if (NODE_API_BUNDLE.equals(b.getSymbolicName())) { - bundle = b; - break; - } - if (b.getSymbolicName().contains(BASE_BUNDLE)) { - bundle = b; - break; - } - } - if (bundle == null) { - throw new IllegalStateException("Bundle " + NODE_API_BUNDLE + " is not installed"); - } - - // Use Java reflection to create the node as only the runtime class - // loader knows the runtime classes required by the node - Class<?> bootstrapClass = bundle.loadClass(NODE_FACTORY); - - Object node = createNode(bootstrapClass, configurationURI, compositeURI, compositeContent, contributions); - - // If the SCANodeFactory interface is available in the current classloader, create - // an SCANode proxy around the node we've just create - try { - Class<?> type = Class.forName(NODE_FACTORY); - type = type.getDeclaredClasses()[0]; - return type.getMethod("createProxy", Class.class, Object.class).invoke(null, type, node); - } catch (ClassNotFoundException e) { - // Ignore - } - return node; - - } catch (Exception e) { - NodeLauncher.logger.log(Level.SEVERE, "SCA Node could not be created", e); - throw new LauncherException(e); - } - } - - private static Object createNode(Class<?> bootstrapClass, - String configurationURI, - String compositeURI, - String compositeContent, - Contribution[] contributions) throws NoSuchMethodException, - IllegalAccessException, InvocationTargetException, MalformedURLException { - Method newInstance = bootstrapClass.getMethod("newInstance"); - Object nodeFactory = newInstance.invoke(null); - - Object node; - if (configurationURI != null) { - - // NodeFactory.createNode(URL) - Method create = bootstrapClass.getMethod("createNode", URL.class); - node = create.invoke(nodeFactory, new URL(configurationURI)); - - } else if (compositeContent != null) { - - // NodeFactory.createNode(Reader, Stringp[], String[]) - Method create = bootstrapClass.getMethod("createNode", Reader.class, String[].class, String[].class); - String[] uris = new String[contributions.length]; - String[] locations = new String[contributions.length]; - for (int i = 0; i < contributions.length; i++) { - uris[i] = contributions[i].getURI(); - locations[i] = contributions[i].getLocation(); - } - node = create.invoke(nodeFactory, compositeContent, uris, locations); - - } else { - - // NodeFactory.createNode(String, Stringp[], String[]) - Method create = bootstrapClass.getMethod("createNode", String.class, String[].class, String[].class); - String[] uris = new String[contributions.length]; - String[] locations = new String[contributions.length]; - for (int i = 0; i < contributions.length; i++) { - uris[i] = contributions[i].getURI(); - locations[i] = contributions[i].getLocation(); - } - node = create.invoke(nodeFactory, compositeURI, uris, locations); - } - return node; - } - - /** - * Creates a new node daemon. - * - * @throws LauncherException - */ - static Object nodeDaemon() throws LauncherException { - ClassLoader tccl = Thread.currentThread().getContextClassLoader(); - try { - - // Use Java reflection to create the node daemon as only the runtime class - // loader knows the runtime classes required by the node - String className = NODE_IMPLEMENTATION_DAEMON_BOOTSTRAP; - Class<?> bootstrapClass; - bootstrapClass = Class.forName(className, false, tccl); - Object bootstrap = bootstrapClass.getConstructor().newInstance(); - - Object nodeDaemon = bootstrapClass.getMethod("getNode").invoke(bootstrap); - return nodeDaemon; - - } catch (Exception e) { - NodeDaemonLauncher.logger.log(Level.SEVERE, "SCA Node Daemon could not be created", e); - throw new LauncherException(e); - } finally { - Thread.currentThread().setContextClassLoader(tccl); - } - } - - /** - * Creates a new domain manager. - * - * @throws LauncherException - */ - static Object domainManager(String rootDirectory) throws LauncherException { - ClassLoader tccl = Thread.currentThread().getContextClassLoader(); - try { - - // Use Java reflection to create the node daemon as only the runtime class - // loader knows the runtime classes required by the node - String className = DOMAIN_MANAGER_LAUNCHER_BOOTSTRAP; - Class<?> bootstrapClass; - bootstrapClass = Class.forName(className, false, tccl); - Constructor<?> constructor = bootstrapClass.getConstructor(String.class); - Object bootstrap = constructor.newInstance(rootDirectory); - - Object domainManager = bootstrapClass.getMethod("getNode").invoke(bootstrap); - return domainManager; - - } catch (Exception e) { - DomainManagerLauncher.logger.log(Level.SEVERE, "SCA Domain Manager could not be created", e); - throw new LauncherException(e); - } finally { - Thread.currentThread().setContextClassLoader(tccl); - } - } - - /** - * starting with -, then some digits, then . or - or _, then some digits again - * - */ - // Mike Edwards 13/04/2009 - this original pattern allows for any number of repeated - // groups of digits, so that 1.2.3.4 is legal, for example. The problem with this is - // that OSGi only deals with a maximum of 3 groups of digits... - // private static Pattern pattern = Pattern.compile("-(\\d)+((\\.|-|_)(\\d)+)*"); - // - // This updated version restricts the allowed patterns to a maximum of 3 groups of - // digits so that "1", "1.2" and "1.2.3" are allowed but not "1.2.3.4" etc - private static Pattern pattern = Pattern.compile("-(\\d)+((\\.|-|_)(\\d)+){0,2}"); - - /** - * Returns the version number to use for the given JAR file. - * - * @param jarFile - * @return - */ - static String jarVersion(URL jarFile) { - String name = jarFile.getFile(); - int index = name.lastIndexOf('/'); - if (index != -1) { - // Find the last segment - name = name.substring(index + 1); - } - index = name.lastIndexOf('.'); - if (index != -1) { - // Trim the extension - name = name.substring(0, index); - } - - Matcher matcher = pattern.matcher(name); - String version = "0.0.0"; - if (matcher.find()) { - version = matcher.group(); - // Remove the leading "-" character - version = version.substring(1); - // The Pattern above allows the version string to contain "-" and "_" as digit separators. - // OSGi only allows for "." as a separator thus any "-" and "_" characters in the version string must be replaced by "." - version = version.replace('-', '.'); - version = version.replace('_', '.'); - } - return version; - } - - static String artifactId(URL jarFile) { - String name = jarFile.getFile(); - int index = name.lastIndexOf('/'); - if (index != -1) { - // Find the last segment - name = name.substring(index + 1); - } - index = name.lastIndexOf('.'); - if (index != -1) { - // Trim the extension - name = name.substring(0, index); - } - - Matcher matcher = pattern.matcher(name); - if (matcher.find()) { - return name.substring(0, matcher.start()); - } else { - return name; - } - } - - /** - * Add the packages found in the given JAR to a set. - * - * @param jarFile - * @param packages - * @throws IOException - */ - private static void addPackages(URL jarFile, Set<String> packages, String version) throws IOException { - if (version == null) { - version = ";version=" + jarVersion(jarFile); - } else { - version = ";version=" + version; - } - File file = file(jarFile); - if (file.isDirectory()) { - List<String> classFiles = listClassFiles(file); - for (String cls : classFiles) { - int index = cls.lastIndexOf('/'); - if (index == -1) { - // Default package cannot be exported - continue; - } - String pkg = cls.substring(0, index); - pkg = pkg.replace('/', '.') + version; - // Export META-INF.services - if ("META-INF.services".equals(pkg)) { - packages.add(META_INF_SERVICES); - } else { - packages.add(pkg); - } - } - } else if (file.isFile()) { - ZipInputStream is = new ZipInputStream(new FileInputStream(file)); - ZipEntry entry; - while ((entry = is.getNextEntry()) != null) { - String entryName = entry.getName(); - // Export split packages for META-INF/services - if(entryName.startsWith("META-INF/services/")) { - packages.add("META-INF.services" + ";partial=true;mandatory:=partial"); - } - if (!entry.isDirectory() && entryName != null - && entryName.length() > 0 - && !entryName.startsWith(".") - && entryName.endsWith(".class") // Exclude resources from Export-Package - && entryName.lastIndexOf("/") > 0) { - String pkg = entryName.substring(0, entryName.lastIndexOf("/")).replace('/', '.') + version; - packages.add(pkg); - } - } - is.close(); - } - } - - private static List<String> listClassFiles(File directory) { - List<String> artifacts = new ArrayList<String>(); - traverse(artifacts, directory, directory); - // Add META-INF/services to be exported - if (new File(directory, "META-INF/services").isDirectory()) { - artifacts.add("META-INF/services/"); - } - return artifacts; - } - - /** - * Recursively traverse a root directory - * - * @param fileList - * @param file - * @param root - * @throws IOException - */ - private static void traverse(List<String> fileList, File file, File root) { - if (file.isFile() && file.getName().endsWith(".class")) { - fileList.add(root.toURI().relativize(file.toURI()).toString()); - } else if (file.isDirectory()) { - String uri = root.toURI().relativize(file.toURI()).toString(); - if (uri.endsWith("/")) { - uri = uri.substring(0, uri.length() - 1); - } - fileList.add(uri); - - File[] files = file.listFiles(); - for (File f : files) { - if (!f.getName().startsWith(".")) { - traverse(fileList, f, root); - } - } - } - } - - /** - * Finds the OSGi manifest file for a JAR file, where the manifest file is held in a META-INF directory - * alongside the JAR - * @param jarURL - The URL of the JAR file - * @return - a Manifest object corresponding to the manifest file, or NULL if there is no OSGi manifest - */ - static private Manifest findOSGiManifest(URL jarURL) { - try { - File jarFile = new File(jarURL.toURI()); - File theManifestFile = new File(jarFile.getParent(), "META-INF/MANIFEST.MF"); - if (theManifestFile.exists()) { - // Create manifest object by reading the manifest file - Manifest manifest = new Manifest(new FileInputStream(theManifestFile)); - // Check that this manifest file has the necessary OSGi metadata - String bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); - if (bundleName != null) { - return manifest; - } // end if - } // end if - } catch (Exception e) { - // Could not read the manifest - continue - } - return null; - } // end findOSGiManifest - - /** - * Generate a manifest from a list of third-party JAR files. - * - * @param jarFiles - * @param bundleSymbolicName The Bundle-SymbolicName - * @param bundleVersion The Bundle-Version - * @return - * @throws IllegalStateException - */ - static private Manifest thirdPartyLibraryBundleManifest(Collection<URL> jarFiles, - String bundleSymbolicName, - String bundleVersion) throws IllegalStateException { - try { - - // List exported packages and bundle classpath entries - StringBuffer classpath = new StringBuffer(); - StringBuffer exports = new StringBuffer(); - StringBuffer imports = new StringBuffer(); - Set<String> packages = new HashSet<String>(); - - for (URL jarFile : jarFiles) { - addPackages(jarFile, packages, bundleVersion); - classpath.append("\"external:"); - classpath.append(file(jarFile).getPath().replace(File.separatorChar, '/')); - classpath.append("\","); - } - - Set<String> importPackages = new HashSet<String>(); - for (String pkg : packages) { - - String importPackage = pkg; - int index = pkg.indexOf(';'); - if (index != -1) { - importPackage = pkg.substring(0, index); - } - if (!importPackages.contains(importPackage)) { - // Exclude META-INF.services - if (!"META-INF.services".equals(importPackage)) { - imports.append(pkg); - imports.append(','); - } - importPackages.add(importPackage); - exports.append(pkg); - exports.append(','); - } else { - logger.warning("Duplicate package skipped: " + pkg); - } - } - - // Create a manifest - Manifest manifest = new Manifest(); - Attributes attributes = manifest.getMainAttributes(); - attributes.putValue("Manifest-Version", "1.0"); - attributes.putValue(BUNDLE_MANIFESTVERSION, "2"); - - if (bundleVersion == null) { - bundleVersion = "0.0.0"; - } - attributes.putValue(Constants.BUNDLE_VERSION, bundleVersion); - if (bundleSymbolicName == null) { - bundleSymbolicName = LAUNCHER_EQUINOX_LIBRARIES; - } - attributes.putValue(BUNDLE_SYMBOLICNAME, bundleSymbolicName); - if (exports.length() > 0) { - attributes.putValue(EXPORT_PACKAGE, exports.substring(0, exports.length() - 1)); - } - /* - if (imports.length() > 0) { - attributes.putValue(IMPORT_PACKAGE, imports.substring(0, imports.length() - 1)); - } - */ - if (classpath.length() > 0) { - attributes.putValue(BUNDLE_CLASSPATH, classpath.substring(0, classpath.length() - 1)); - } - // The system bundle has incomplete javax.transaction* packages exported - attributes.putValue(DYNAMICIMPORT_PACKAGE, "javax.transaction;version=\"1.1\",javax.transaction.xa;version=\"1.1\",*"); - - return manifest; - } catch (IOException e) { - throw new IllegalStateException(e); - } - } - - /** - * Generates a library bundle from a list of third-party JARs. - * - * @param jarFiles - * @param bundleSymbolicName The Bundle-SymbolicName - * @param bundleVersion The Bundle-Version - * @return - * @throws IOException - */ - static InputStream thirdPartyLibraryBundle(Collection<URL> jarFiles, String bundleSymbolicName, String bundleVersion) - throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - Manifest mf = thirdPartyLibraryBundleManifest(jarFiles, bundleSymbolicName, bundleVersion); - JarOutputStream jos = new JarOutputStream(bos, mf); - jos.close(); - return new ByteArrayInputStream(bos.toByteArray()); - } - - static InputStream thirdPartyLibraryBundle(Collection<URL> jarFiles, Manifest manifest) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - StringBuffer classpath = new StringBuffer(); - for (URL jarFile : jarFiles) { - classpath.append("\"external:"); - classpath.append(file(jarFile).getPath().replace(File.separatorChar, '/')); - classpath.append("\","); - } - - if (classpath.length() > 0) { - manifest.getMainAttributes().putValue(BUNDLE_CLASSPATH, classpath.substring(0, classpath.length() - 1)); - } - - JarOutputStream jos = new JarOutputStream(bos, manifest); - jos.close(); - return new ByteArrayInputStream(bos.toByteArray()); - } - - /** - * Returns the location of this bundle. - * - * @return - * @throws IOException - */ - static String thisBundleLocation() throws IOException, URISyntaxException { - String resource = NodeLauncherUtil.class.getName().replace('.', '/') + ".class"; - URL url = NodeLauncherUtil.class.getClassLoader().getResource(resource); - if (url == null) { - throw new FileNotFoundException(resource); - } - URI uri = toURI(url); - - String scheme = uri.getScheme(); - if (scheme.equals("jar")) { - String path = uri.toString().substring(4); - int i = path.indexOf("!/"); - path = path.substring(0, i); - return path; - } else { - String path = uri.toString(); - path = path.substring(0, path.length() - resource.length()); - return path; - } - } - - static URI toURI(URL url) { - File file = file(url); - if (file != null) { - return file.toURI(); - } else { - return createURI(url.toString()); - } - } - - /** - * Escape the space in URL string - * @param uri - * @return - */ - static URI createURI(String uri) { - if (uri == null) { - return null; - } - if (uri.indexOf('%') != -1) { - // Avoid double-escaping - return URI.create(uri); - } - int index = uri.indexOf(':'); - String scheme = null; - String ssp = uri; - if (index != -1) { - scheme = uri.substring(0, index); - ssp = uri.substring(index + 1); - } - try { - return new URI(scheme, ssp, null); - } catch (URISyntaxException e) { - throw new IllegalArgumentException(e); - } - } - - /** - * Returns the location of this bundle. - * - * @param bundle - * @return - * @throws IOException - */ - static String thisBundleLocation(Bundle bundle) throws IOException, URISyntaxException, ClassNotFoundException { - String resource = NodeLauncherUtil.class.getName(); - Class<?> clazz = bundle.loadClass(NodeLauncherUtil.class.getName()); - URL url = clazz.getProtectionDomain().getCodeSource().getLocation(); - if (url == null) { - throw new FileNotFoundException(resource); - } - URI uri = toURI(url); - - String scheme = uri.getScheme(); - if (scheme.equals("jar")) { - String path = uri.toString().substring(4); - int i = path.indexOf("!/"); - path = path.substring(0, i); - return path; - } else { - String path = uri.toString(); - //path = path.substring(0, path.length() - resource.length()); - return path; - } - } - - /** - * Install the given bundle. - * - * @param bundleContext - * @param location - * @throws BundleException - * @throws IOException - */ - static void fixupBundle(String location) throws BundleException, IOException { - File target = file(new URL(location)); - if (!target.exists()) { - return; - } - location = target.toURI().toString(); - - // For development mode, copy the MANIFEST.MF file to the bundle location as it's - // initially outside of target/classes, at the root of the project. - if (location.endsWith("/target/classes/")) { - File targetManifest = new File(target, "META-INF/MANIFEST.MF"); - File sourceManifest = new File(target.getParentFile().getParentFile(), "META-INF/MANIFEST.MF"); - if (!sourceManifest.isFile()) { - return; - } - targetManifest.getParentFile().mkdirs(); - OutputStream os = new FileOutputStream(targetManifest); - InputStream is = new FileInputStream(sourceManifest); - byte[] buf = new byte[2048]; - for (;;) { - int l = is.read(buf); - if (l == -1) { - break; - } - os.write(buf, 0, l); - } - is.close(); - os.close(); - } - } - - /** - * Returns a string representation of the given bundle. - * - * @param b - * @param verbose - * @return - */ - static String string(Bundle bundle, boolean verbose) { - StringBuffer sb = new StringBuffer(); - sb.append(bundle.getBundleId()).append(" ").append(bundle.getSymbolicName()); - int s = bundle.getState(); - if ((s & Bundle.UNINSTALLED) != 0) { - sb.append(" UNINSTALLED"); - } - if ((s & Bundle.INSTALLED) != 0) { - sb.append(" INSTALLED"); - } - if ((s & Bundle.RESOLVED) != 0) { - sb.append(" RESOLVED"); - } - if ((s & Bundle.STARTING) != 0) { - sb.append(" STARTING"); - } - if ((s & Bundle.STOPPING) != 0) { - sb.append(" STOPPING"); - } - if ((s & Bundle.ACTIVE) != 0) { - sb.append(" ACTIVE"); - } - - if (verbose) { - sb.append(" ").append(bundle.getLocation()); - sb.append(" ").append(bundle.getHeaders()); - } - return sb.toString(); - } - - /** - * Returns the name of a bundle, or null if the given file is not a bundle. - * - * @param file - * @return - * @throws IOException - */ - static String bundleName(File file) throws IOException { - if (!file.exists()) { - return null; - } - String bundleName = null; - if (file.isDirectory()) { - File mf = new File(file, "META-INF/MANIFEST.MF"); - if (mf.isFile()) { - Manifest manifest = new Manifest(new FileInputStream(mf)); - bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); - } else { - if (file.toURI().getPath().endsWith("/target/classes/")) { - // Development mode, MANIFEST.MF is outside the bundle location - mf = new File(file.getParentFile().getParentFile(), "META-INF/MANIFEST.MF"); - if (mf.isFile()) { - Manifest manifest = new Manifest(new FileInputStream(mf)); - bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); - } - } - } - } else { - JarFile jar = new JarFile(file, false); - Manifest manifest = jar.getManifest(); - if (manifest != null) { - bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); - } - jar.close(); - } - if (bundleName == null) { - return bundleName; - } - int sc = bundleName.indexOf(';'); - if (sc != -1) { - bundleName = bundleName.substring(0, sc); - } - return bundleName; - } - - /** - * Collect JAR files in the given directory. - * - * @param directory - * @param urls - * @param filter - * @throws MalformedURLException - */ - private static void collectClasspathEntries(File directory, Set<URL> urls, FilenameFilter filter, boolean recursive) - throws MalformedURLException { - File[] files = directory.listFiles(filter); - if (files != null) { - int count = 0; - for (File file : files) { - if (recursive && file.isDirectory()) { - collectClasspathEntries(file, urls, filter, recursive); - } else { - urls.add(file.toURI().toURL()); - count++; - } - } - if (count != 0) { - logger.fine("Runtime classpath: " + count - + " JAR" - + (count > 1 ? "s" : "") - + " from " - + directory.toString()); - } - } - } - - /** - * Collect development .../ target/classes directories in the given directory. - * - * @param directory - * @param urls - * @param filter - * @throws MalformedURLException - */ - private static void collectTargetClassesClasspathEntries(File directory, Set<URL> urls, FilenameFilter filter) - throws MalformedURLException { - File[] files = directory.listFiles(); - if (files != null) { - int count = 0; - for (File file : files) { - if (!file.isDirectory()) { - continue; - } - File target = new File(file, "target"); - if (!target.isDirectory()) { - continue; - } - File classes = new File(target, "classes"); - if (classes.isDirectory() && filter.accept(target, "classes")) { - urls.add(classes.toURI().toURL()); - count++; - } - } - if (count != 0 && logger.isLoggable(Level.FINE)) { - logger.fine("Runtime classpath: " + count - + " classes folder" - + (count > 1 ? "s" : "") - + " from " - + directory.toString()); - } - } - } - - /** - * Collect JAR files under the given distribution directory. - * - * @param directory - * @param jarDirectoryURLs - * @param jarURLs - * @param filter - * @throws MalformedURLException - */ - private static void collectDistributionClasspathEntries(String directory, - Set<URL> jarDirectoryURLs, - Set<URL> jarURLs, - FilenameFilter filter) throws MalformedURLException { - File directoryFile = new File(directory); - URL directoryURL = directoryFile.toURI().toURL(); - if (!jarDirectoryURLs.contains(directoryURL) && directoryFile.exists()) { - - // Collect files under the given directory - jarDirectoryURLs.add(directoryURL); - collectClasspathEntries(directoryFile, jarURLs, filter, false); - - // Collect files under <directory>/modules - File modulesDirectory = new File(directoryFile, "modules"); - URL modulesDirectoryURL = modulesDirectory.toURI().toURL(); - if (!jarDirectoryURLs.contains(modulesDirectoryURL) && modulesDirectory.exists()) { - jarDirectoryURLs.add(modulesDirectoryURL); - collectClasspathEntries(modulesDirectory, jarURLs, filter, true); - } - - // Collect files under <directory>/lib -/* SL - this is commented out to prevent the jars in the lib dir being installed as - * OSGi bundles. There must have been a time (1.x?) when lib jars would have been - * installed but now the shaded jars live in lib and we don't want to install them - * - File libDirectory = new File(directoryFile, "lib"); - URL libDirectoryURL = libDirectory.toURI().toURL(); - if (!jarDirectoryURLs.contains(libDirectoryURL) && libDirectory.exists()) { - jarDirectoryURLs.add(libDirectoryURL); - collectClasspathEntries(libDirectory, jarURLs, filter, true); - } -*/ - } - } - - private static boolean isMavenTestMode() { - return getProperty("surefire.test.class.path") != null || getProperty("surefire.real.class.path") != null - || getProperty("localRepository") != null; - } - - /** - * Determine the Tuscany runtime classpath entries. - * - * @param useDistribution - * @param useAppClasspath - * @param useModulesDirectory - * @return - */ - static Set<URL> runtimeClasspathEntries(boolean useDistribution, - boolean useAppClasspath, - boolean useModulesDirectory) throws FileNotFoundException, - URISyntaxException, MalformedURLException { - - // Build list of runtime JARs - Set<URL> jarDirectoryURLs = new HashSet<URL>(); - Set<URL> jarURLs = new HashSet<URL>(); - - // Determine the path to the launcher class - URI uri; - try { - uri = codeLocation(NodeLauncherUtil.class); - } catch (Exception e) { - uri = URI.create(""); - } - - // If the launcher class is in a JAR, add all runtime JARs from directory containing - // that JAR (e.g. the Tuscany modules directory) as well as the ../modules and - // ../lib directories - if (uri.getPath().endsWith(".jar")) { - if (useDistribution) { - - File file = new File(uri); - if (file.exists()) { - File jarDirectory = file.getParentFile(); - if (jarDirectory != null && jarDirectory.exists()) { - - // Collect JAR files from the directory containing the input JAR - // (e.g. the Tuscany modules directory) - URL jarDirectoryURL = jarDirectory.toURI().toURL(); - jarDirectoryURLs.add(jarDirectoryURL); - collectClasspathEntries(jarDirectory, jarURLs, new StandAloneJARFileNameFilter(), true); - - File homeDirectory = jarDirectory.getParentFile(); - if (homeDirectory != null && homeDirectory.exists()) { - collectDistributionClasspathEntries(homeDirectory.getAbsolutePath(), - jarDirectoryURLs, - jarURLs, - new StandAloneJARFileNameFilter()); - } - } - } - } - } else if (uri.getPath().endsWith("/target/classes/")) { - - // Development mode, we're running off classes in a workspace - // and not from Maven surefire, collect all bundles in the workspace - if (useModulesDirectory) { - if (!isMavenTestMode()) { - File file = new File(uri); - if (file.exists()) { - File moduleDirectory = file.getParentFile().getParentFile(); - if (moduleDirectory != null) { - File modulesDirectory = moduleDirectory.getParentFile(); - if (modulesDirectory != null && modulesDirectory.exists() - && modulesDirectory.getName().equals("modules")) { - collectDevelopmentClasspathEntries(modulesDirectory.getAbsolutePath(), - jarDirectoryURLs, - jarURLs, - new StandAloneDevelopmentClassesFileNameFilter()); - // Added Mike Edwards, 09/04/2009 - // Get hold of the Libraries that are used by the Tuscany modules - collectDevelopmentLibraryEntries(modulesDirectory, jarDirectoryURLs, jarURLs); - } // end if - } - } - } - } - } - - // Look for a TUSCANY_HOME system property or environment variable - // Add all the JARs found under $TUSCANY_HOME, $TUSCANY_HOME/modules - // and $TUSCANY_HOME/lib - if (useDistribution) { - String home = getProperty(TUSCANY_HOME); - if (home != null && home.length() != 0) { - logger.info(TUSCANY_HOME + ": " + home); - collectDistributionClasspathEntries(home, jarDirectoryURLs, jarURLs, new StandAloneJARFileNameFilter()); - } - - // Look for a TUSCANY_PATH system property or environment variable - // Add all the JARs found under $TUSCANY_PATH, $TUSCANY_PATH/modules - // and $TUSCANY_PATH/lib - String ext = getProperty(TUSCANY_PATH); - if (ext != null && ext.length() != 0) { - logger.info(TUSCANY_PATH + ": " + ext); - String separator = getProperty("path.separator"); - for (StringTokenizer tokens = new StringTokenizer(ext, separator); tokens.hasMoreTokens();) { - collectDistributionClasspathEntries(tokens.nextToken(), - jarDirectoryURLs, - jarURLs, - new StandAloneJARFileNameFilter()); - } - } - } - - // Add the classpath entries from the current classloader - if (useAppClasspath) { - collectClassLoaderClasspathEntries(jarURLs, NodeLauncherUtil.class.getClassLoader()); - } - - return jarURLs; - - } - - /** - * Returns the JAR files on the classpath used by the given classloader. - * - * @param classLoader - * @return - */ - static List<URL> jarFilesOnClasspath(ClassLoader classLoader) { - Set<URL> entries = new HashSet<URL>(); - collectClassLoaderClasspathEntries(entries, classLoader); - return new ArrayList<URL>(entries); - } - - private static String getProperty(final String prop) { - return AccessController.doPrivileged(new PrivilegedAction<String>() { - public String run() { - String value = System.getProperty(prop); - if (value == null || value.length() == 0) { - return System.getenv(prop); - } else { - return value; - } - } - }); - } - - /** - * Collect JARs on the classpath of a URLClassLoader. - * - * @param urls - * @param cl - */ - private static void collectClassLoaderClasspathEntries(Set<URL> urls, ClassLoader cl) { - if (cl == null) { - return; - } - - int count = urls.size(); - // Collect JARs from the URLClassLoader's classpath - if (cl instanceof URLClassLoader) { - URL[] jarURLs = ((URLClassLoader)cl).getURLs(); - if (jarURLs != null) { - for (URL jarURL : jarURLs) { - urls.add(jarURL); - try { - urls.addAll(manifestClassPath(jarURL)); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - } - } - count = urls.size() - count; - - if (count != 0 && logger.isLoggable(Level.FINE)) { - logger.fine("Runtime classpath: " + count - + " JAR" - + (count > 1 ? "s" : "") - + " from application classpath."); - } - } - } - } - - static Set<URL> manifestClassPath(URL jarFile) throws Exception { - Set<URL> urls = new HashSet<URL>(); - if (jarFile != null) { - Manifest mf = null; - if ("file".equals(jarFile.getProtocol())) { - File f = file(jarFile); - if (f.isDirectory()) { - File mfFile = new File(f, "META-INF/MANIFEST.MF"); - if (mfFile.isFile()) { - FileInputStream is = new FileInputStream(mfFile); - mf = new Manifest(is); - is.close(); - } - } else if (f.isFile()) { - JarInputStream jar = new JarInputStream(jarFile.openStream()); - mf = jar.getManifest(); - jar.close(); - } - } - if (mf != null) { - String cp = mf.getMainAttributes().getValue("Class-Path"); - if (cp != null) { - StringTokenizer st = new StringTokenizer(cp); - while (st.hasMoreTokens()) { - URL entry = new URL(jarFile.toURI().toURL(), st.nextToken()).toURI().toURL(); - urls.add(entry); - } - } - } - } - return urls; - } - - /** - * A file name filter used to filter JAR files. - */ - private static class StandAloneJARFileNameFilter implements FilenameFilter { - - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - - if (new File(dir, name).isDirectory()) { - return true; - } - - // Filter out the Tomcat and Webapp hosts - if (name.startsWith("tuscany-host-tomcat") || name.startsWith("tuscany-host-webapp")) { - //FIXME This is temporary - return false; - } - - // Don't include the sources jar files - if (name.endsWith("-sources.jar")) { - return false; - } - - // Include JAR and MAR files - if (name.endsWith(".jar")) { - return true; - } - if (name.endsWith(".mar")) { - return true; - } - return false; - } - } - - /** - * A file name filter used to filter target/classes directories. - */ - private static class StandAloneDevelopmentClassesFileNameFilter implements FilenameFilter { - - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - if (dir.getName().equals("target") && name.equals("classes")) { - - // Filter out the Tomcat and Webapp hosts - String dirPath = dir.getAbsolutePath(); - if (dirPath.endsWith("host-tomcat/target") || dirPath.endsWith("host-webapp/target")) { - //FIXME This is temporary - return false; - } - return true; - } - - // Filter out the Tomcat and Webapp hosts - if (name.startsWith("tuscany-host-tomcat") || name.startsWith("tuscany-host-webapp")) { - //FIXME This is temporary - return false; - } - - // Include JAR and MAR files - if (name.endsWith(".jar")) { - return true; - } - if (name.endsWith(".mar")) { - return true; - } - return false; - } - } - - /** - * A file name filter used to filter JAR files. - */ - private static class WebAppJARFileNameFilter extends StandAloneJARFileNameFilter { - - @Override - public boolean accept(File dir, String name) { - if (!super.accept(dir, name)) { - return false; - } - name = name.toLowerCase(); - - // Exclude servlet-api JARs - if (name.startsWith("servlet-api")) { - return false; - } - - // Exclude the Tomcat and Jetty hosts - if (name.startsWith("tuscany-host-tomcat") || name.startsWith("tuscany-host-jetty")) { - //FIXME This is temporary - return false; - } - - return true; - } - } - - /** - * A file name filter used to filter the libraries in the \java\sca\distribution\all\target\modules - * directory - */ - private static class DistributionLibsFileNameFilter implements FilenameFilter { - - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - - // Include subdirectories - if (new File(dir, name).isDirectory()) { - return true; - } - - // Filter out the Tuscany SCA jars - since the development versions of these are used - // from the \target\classes directories... - if (name.startsWith("tuscany")) { - // tuscany-sdo jars don't form part of the SCA modules... - if (name.startsWith("tuscany-sdo")) return true; - return false; - } - - // Include JAR and MAR files - if (name.endsWith(".jar")) { - return true; - } - if (name.endsWith(".mar")) { - return true; - } - return false; - } // end accept - } // end DistributionLibsFileNameFilter - - /** - * Returns the File object representing the given URL. - * - * @param url - * @return - */ - static File file(URL url) { - if (url == null || !url.getProtocol().equals("file")) { - return null; - } else { - String filename = url.getFile().replace('/', File.separatorChar); - int pos = 0; - while ((pos = filename.indexOf('%', pos)) >= 0) { - if (pos + 2 < filename.length()) { - String hexStr = filename.substring(pos + 1, pos + 3); - char ch = (char)Integer.parseInt(hexStr, 16); - filename = filename.substring(0, pos) + ch + filename.substring(pos + 3); - } - } - return new File(filename); - } - } - - /** - * Returns the location of the classpath entry, JAR, WAR etc. containing the given class. - * - * @param clazz - * @return - */ - static private URI codeLocation(Class<?> clazz) { - URL url = clazz.getProtectionDomain().getCodeSource().getLocation(); - return toURI(url); - } - - /** - * Collect JAR files under the given distribution directory. - * - * @param directory - * @param jarDirectoryURLs - * @param jarURLs - * @param filter - * @throws MalformedURLException - */ - private static void collectDevelopmentClasspathEntries(String directory, - Set<URL> jarDirectoryURLs, - Set<URL> jarURLs, - FilenameFilter filter) throws MalformedURLException { - File directoryFile = new File(directory); - URL directoryURL = directoryFile.toURI().toURL(); - if (!jarDirectoryURLs.contains(directoryURL) && directoryFile.exists()) { - - // Collect files under the given directory - jarDirectoryURLs.add(directoryURL); - collectTargetClassesClasspathEntries(directoryFile, jarURLs, filter); - - } - } // end collectDevelopmentClasspathEntries - - /** - * Collect the dependent Library JAR files for the development use of Tuscany - * It is assumed that these live in the \java\sca\distribution\all\target\modules - * directory, where the development modules live in \java\sca\modules, but that - * same directory also contains prebuilt versions of the Tuscany JARs, which must be - * filtered out so as not to clash with the development versions of the code - * - * @param directory - the \java\sca\modules directory - * @param jarDirectoryURLs - * @param jarURLs - * @throws MalformedURLException - */ - private static void collectDevelopmentLibraryEntries(File modulesDirectory, - Set<URL> jarDirectoryURLs, - Set<URL> jarURLs) throws MalformedURLException { - // Get the \java\sca directory - File rootDirectory = modulesDirectory.getParentFile(); - // Get the \java\sca\distribution\all\target\modules - String sep = File.separator; - File libsDirectory = new File(rootDirectory, "distribution" + sep + "all" + sep + "target" + sep + "modules"); - URL libsURL = libsDirectory.toURI().toURL(); - if (!jarDirectoryURLs.contains(libsURL) && libsDirectory.exists()) { - // Collect files under the libs module directory - jarDirectoryURLs.add(libsURL); - collectClasspathEntries(libsDirectory, jarURLs, new DistributionLibsFileNameFilter(), true); - } // end if - } // end collectDevelopmentLibraryEntries - - /** - * Generate a gateway bundle that aggregate other bundles to handle split packages - * @param bundleSymbolicNames - * @throws FileNotFoundException - * @throws IOException - */ - static InputStream generateGatewayBundle(Collection<String> bundleSymbolicNames, String bundleVersion, boolean reexport) - throws IOException { - Manifest manifest = new Manifest(); - Attributes attrs = manifest.getMainAttributes(); - StringBuffer requireBundle = new StringBuffer(); - for (String name : new HashSet<String>(bundleSymbolicNames)) { - requireBundle.append(name).append(";").append(RESOLUTION_DIRECTIVE).append(":=") - .append(RESOLUTION_OPTIONAL); - if (reexport) { - requireBundle.append(";").append(VISIBILITY_DIRECTIVE).append(":=").append(VISIBILITY_REEXPORT); - } - requireBundle.append(","); - } - int len = requireBundle.length(); - if (len > 0 && requireBundle.charAt(len - 1) == ',') { - requireBundle.deleteCharAt(len - 1); - attrs.putValue(REQUIRE_BUNDLE, requireBundle.toString()); - attrs.putValue("Manifest-Version", "1.0"); - attrs.putValue("Implementation-Vendor", "The Apache Software Foundation"); - attrs.putValue("Implementation-Vendor-Id", "org.apache"); - if (bundleVersion != null) { - attrs.putValue(BUNDLE_VERSION, bundleVersion); - } - attrs.putValue(BUNDLE_MANIFESTVERSION, "2"); - attrs.putValue(BUNDLE_SYMBOLICNAME, GATEWAY_BUNDLE); - attrs.putValue(BUNDLE_NAME, "Apache Tuscany SCA Gateway Bundle"); - attrs.putValue(BUNDLE_VENDOR, "The Apache Software Foundation"); - attrs.putValue(EXPORT_PACKAGE, "META-INF.services"); - attrs.putValue(DYNAMICIMPORT_PACKAGE, "*"); - attrs.putValue(BUNDLE_ACTIVATIONPOLICY, ACTIVATION_LAZY); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - JarOutputStream jos = new JarOutputStream(bos, manifest); - jos.close(); - return new ByteArrayInputStream(bos.toByteArray()); - } else { - return null; - } - } - -} diff --git a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeMain.java b/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeMain.java deleted file mode 100644 index 4b4c4a8978..0000000000 --- a/sca-java-2.x/tags/2.0-Beta2-RC3/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeMain.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.node.equinox.launcher; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionGroup; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.PosixParser; - - -/** - * Main class for this JAR. - * With a "-nodeDaemon or -nd" this class launches the SCA Node Daemon. - * With a "-domainManager or -dm" argument it launches the SCA domain admin node. - * With any other argument it launches an SCA Node. - * - * @version $Rev$ $Date$ - */ -public class NodeMain { - - public static void main(String[] args) throws Exception { - CommandLineParser parser = new PosixParser(); - Options options = new Options(); - OptionGroup group = new OptionGroup(); - group.addOption(new Option("dm", "domainManager", false, "Domain Manager")); - group.addOption(new Option("nd", "nodeDaemon", false, "Node Domain")); - options.addOptionGroup(group); - - // Add options from NodeLauncher to avoid UnrecognizedOptionException - for (Object o : NodeLauncher.getCommandLineOptions().getOptions()) { - options.addOption((Option)o); - } - - CommandLine cli = parser.parse(options, args); - if (cli.hasOption("nd")) { - NodeDaemonLauncher.main(args); - } else if (cli.hasOption("dm")) { - DomainManagerLauncher.main(args); - } else { - NodeLauncher.main(args); - } - } -} |