/* * 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.osgi.launcher; import java.lang.reflect.Constructor; import java.util.logging.Level; /** * Common functions and constants used by the admin components. * * @version $Rev$ $Date$ */ final class NodeLauncherUtil { // private static final Logger logger = Logger.getLogger(NodeLauncherUtil.class.getName()); 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 NODE_IMPLEMENTATION_LAUNCHER_BOOTSTRAP = "org.apache.tuscany.sca.implementation.node.launcher.NodeImplementationLauncherBootstrap"; /** * Collect JAR files under the given directory. * * @p @param contributions * @throws LauncherException */ static Object node(String configurationURI, String compositeURI, String compositeContent, Contribution[] contributions, ClassLoader contributionClassLoader) throws LauncherException { ClassLoader tccl = Thread.currentThread().getContextClassLoader(); try { // Use Java reflection to create the node as only the runtime class // loader knows the runtime classes required by the node String className = NODE_IMPLEMENTATION_LAUNCHER_BOOTSTRAP; Class bootstrapClass; bootstrapClass = Class.forName(className, false, tccl); Object bootstrap; if (configurationURI != null) { // Construct the node with a configuration URI bootstrap = bootstrapClass.getConstructor(String.class).newInstance(configurationURI); } else if (contributionClassLoader != null) { // Construct the node with a compositeURI and a classloader Constructor constructor = bootstrapClass.getConstructor(String.class, ClassLoader.class); bootstrap = constructor.newInstance(compositeURI, contributionClassLoader); } else if (compositeContent != null) { // Construct the node with a composite URI, the composite content and // the URIs and locations of a list of contributions Constructor constructor = bootstrapClass.getConstructor(String.class, 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(); } bootstrap = constructor.newInstance(compositeURI, compositeContent, uris, locations); } else { // Construct the node with a composite URI and the URIs and // locations of a list of contributions Constructor constructor = bootstrapClass.getConstructor(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(); } bootstrap = constructor.newInstance(compositeURI, uris, locations); } Object node = bootstrapClass.getMethod("getNode").invoke(bootstrap); try { Class type = Class.forName("org.apache.tuscany.sca.node.SCANodeFactory"); 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); } finally { Thread.currentThread().setContextClassLoader(tccl); } } /** * 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) { NodeLauncher.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) { NodeLauncher.logger.log(Level.SEVERE, "SCA Domain Manager could not be created", e); throw new LauncherException(e); } finally { Thread.currentThread().setContextClassLoader(tccl); } } static OSGiHost startOSGi() { OSGiHost host = new FelixOSGiHost(); host.start(); return host; } static void stopOSGi(OSGiHost host) { host.stop(); } /* static OSGiHost getOSGiHost() throws Exception { ServiceDiscovery discovery = ServiceDiscovery.getInstance(Thread.currentThread().getContextClassLoader()); Class hostClass = discovery.loadFirstServiceClass(OSGiHost.class); if (hostClass != null) { return (OSGiHost) hostClass.newInstance(); } else { return null; } } */ }