summaryrefslogtreecommitdiffstats
path: root/sca-java-1.x/branches/sca-java-1.6.2/modules/node-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-1.x/branches/sca-java-1.6.2/modules/node-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java')
-rw-r--r--sca-java-1.x/branches/sca-java-1.6.2/modules/node-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java174
1 files changed, 174 insertions, 0 deletions
diff --git a/sca-java-1.x/branches/sca-java-1.6.2/modules/node-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java b/sca-java-1.x/branches/sca-java-1.6.2/modules/node-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java
new file mode 100644
index 0000000000..5e4a0ed338
--- /dev/null
+++ b/sca-java-1.x/branches/sca-java-1.6.2/modules/node-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java
@@ -0,0 +1,174 @@
+/*
+ * 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.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.framework.Felix;
+import org.apache.felix.framework.cache.BundleCache;
+import org.apache.felix.framework.util.FelixConstants;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+
+/**
+ *
+ */
+public class FelixOSGiHost implements OSGiHost {
+
+ private Felix felix;
+ private LauncherBundleActivator activator;
+ //private ClassLoader tccl;
+
+ private final static String systemPackages =
+ "org.osgi.framework; version=1.3.0," + "org.osgi.service.packageadmin; version=1.2.0, "
+ + "org.osgi.service.startlevel; version=1.0.0, "
+ + "org.osgi.service.url; version=1.0.0, "
+ + "org.osgi.util.tracker; version=1.3.2, "
+ + "javax.xml, "
+ + "javax.xml.datatype, "
+ + "javax.xml.namespace, "
+ + "javax.xml.parsers, "
+ + "javax.xml.transform, "
+ + "javax.xml.transform.dom, "
+ + "javax.xml.transform.sax, "
+ + "javax.xml.transform.stream, "
+ + "javax.xml.validation, "
+ + "javax.xml.xpath, "
+ // Force the classes to be imported from the system bundle
+ // + "javax.xml.stream, "
+ // + "javax.xml.stream.util, "
+ + "javax.sql,"
+ + "org.w3c.dom, "
+ + "org.xml.sax, "
+ + "org.xml.sax.ext, "
+ + "org.xml.sax.helpers, "
+ + "javax.security.auth, "
+ + "javax.security.cert, "
+ + "javax.security.auth.login, "
+ + "javax.security.auth.callback, "
+ + "javax.naming, "
+ + "javax.naming.spi, "
+ + "javax.naming.directory, "
+ + "javax.management, "
+ + "javax.imageio, "
+ + "sun.misc, "
+ + "javax.net, "
+ + "javax.net.ssl, "
+ + "javax.crypto, "
+ + "javax.rmi, "
+ + "javax.transaction, "
+ + "javax.transaction.xa";
+
+ public LauncherBundleActivator getActivator() {
+ if (activator == null) {
+ activator = new LauncherBundleActivator();
+ }
+ return activator;
+ }
+
+ public void setActivator(LauncherBundleActivator activator) {
+ this.activator = activator;
+ }
+
+ public BundleContext start() {
+ try {
+ startup();
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ BundleContext bundleContext = felix.getBundleContext();
+ return bundleContext;
+ }
+
+ public void stop() {
+ try {
+ shutdown();
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private void startup() throws BundleException {
+ if (felix != null) {
+ throw new IllegalStateException("Felix is already running.");
+ }
+
+ // Create a configuration property map.
+ Map<String, String> configMap = new HashMap<String, String>();
+ // Configure the Felix instance to be embedded.
+ configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true");
+ // Add core OSGi packages to be exported from the class path
+ // via the system bundle.
+ configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES, systemPackages);
+ // Explicitly specify the directory to use for caching bundles.
+ configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "target/.felix");
+ List<BundleActivator> list = new ArrayList<BundleActivator>();
+
+ list.add(getActivator());
+
+ // Now create an instance of the framework with
+ // our configuration properties and activator.
+ felix = new Felix(configMap, list);
+
+ // Now start Felix instance.
+ felix.start();
+
+ //tccl = Thread.currentThread().getContextClassLoader();
+ //Thread.currentThread().setContextClassLoader(getContextClassLoader(felix.getBundleContext()));
+
+ }
+
+ private ClassLoader getContextClassLoader(BundleContext bundleContext) {
+ for (Bundle b : bundleContext.getBundles()) {
+ if ("org.apache.tuscany.sca.extensibility.osgi".equals(b.getSymbolicName())) {
+ try {
+ b.start();
+ Class<?> discovererClass = b.loadClass("org.apache.tuscany.sca.extensibility.ServiceDiscovery");
+ Method getInstance = discovererClass.getMethod("getInstance");
+ Object instance = getInstance.invoke(null);
+ Method getter = discovererClass.getMethod("getServiceDiscoverer");
+ Object discoverer = getter.invoke(instance);
+
+ Method getCL = discoverer.getClass().getMethod("getContextClassLoader");
+ ClassLoader cl = (ClassLoader)getCL.invoke(discoverer);
+ return cl;
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+ return null;
+ }
+
+ private void shutdown() throws BundleException {
+ if (felix != null) {
+ felix.stopAndWait();
+ }
+ //Thread.currentThread().setContextClassLoader(tccl);
+ }
+
+}