You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/09/06 03:46:46 UTC
svn commit: r692604 - in /tuscany/java/sca/modules: extensibility-equinox/
extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/
node-launcher-equinox/
node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/...
Author: rfeng
Date: Fri Sep 5 18:46:45 2008
New Revision: 692604
URL: http://svn.apache.org/viewvc?rev=692604&view=rev
Log:
Starting to add support Classloading for 3rd party jars
Added:
tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/URLClassLoadingHook.java (with props)
Modified:
tuscany/java/sca/modules/extensibility-equinox/pom.xml
tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java
tuscany/java/sca/modules/node-launcher-equinox/pom.xml
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java
tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java
Modified: tuscany/java/sca/modules/extensibility-equinox/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-equinox/pom.xml?rev=692604&r1=692603&r2=692604&view=diff
==============================================================================
--- tuscany/java/sca/modules/extensibility-equinox/pom.xml (original)
+++ tuscany/java/sca/modules/extensibility-equinox/pom.xml Fri Sep 5 18:46:45 2008
@@ -73,15 +73,22 @@
<instructions>
<Bundle-Version>${tuscany.version}</Bundle-Version>
<Bundle-SymbolicName>org.apache.tuscany.sca.extensibility.equinox</Bundle-SymbolicName>
+ <!--
<Fragment-Host>org.eclipse.osgi</Fragment-Host>
- <Import-Package></Import-Package>
+ -->
<Bundle-Description>${pom.name}</Bundle-Description>
<Bundle-Activator>org.apache.tuscany.sca.extensibility.equinox.EquinoxServiceDiscoveryActivator</Bundle-Activator>
<!-- This bundle will be the gateway to all exported packages -->
+ <!--
<DynamicImport-Package>*</DynamicImport-Package>
+ -->
+ <Import-Package>*</Import-Package>
+ <Bundle-BuddyPolicy>global,app</Bundle-BuddyPolicy>
+ <Eclipse-BuddyPolicy>global,app</Eclipse-BuddyPolicy>
+ <Eclipse-AutoStart>true</Eclipse-AutoStart>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
-</project>
\ No newline at end of file
+</project>
Modified: tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java?rev=692604&r1=692603&r2=692604&view=diff
==============================================================================
--- tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java (original)
+++ tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java Fri Sep 5 18:46:45 2008
@@ -28,7 +28,6 @@
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
-import java.security.SecureClassLoader;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
@@ -54,6 +53,7 @@
public EquinoxServiceDiscoverer(BundleContext context) {
this.context = context;
+ // http://wiki.eclipse.org/index.php/Context_Class_Loader_Enhancements
this.classLoader = new ClassLoaderImpl();
}
@@ -116,12 +116,27 @@
}
- public class ClassLoaderImpl extends SecureClassLoader {
-
+ private final static ClassLoader getTCCL() {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+ public ClassLoader run() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ }
+
+ public class ClassLoaderImpl extends ClassLoader {
+ private ClassLoader delegate;
+
public ClassLoaderImpl() {
super(EquinoxServiceDiscoverer.class.getClassLoader());
+ this.delegate = getTCCL();
}
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException {
+ return delegate.loadClass(name);
+ }
+
/**
* Open a back-door to expose the META-INF/services resources
*/
Added: tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/URLClassLoadingHook.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/URLClassLoadingHook.java?rev=692604&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/URLClassLoadingHook.java (added)
+++ tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/URLClassLoadingHook.java Fri Sep 5 18:46:45 2008
@@ -0,0 +1,99 @@
+/*
+ * 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.extensibility.equinox;
+
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
+import org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook;
+import org.eclipse.osgi.baseadaptor.loader.BaseClassLoader;
+import org.eclipse.osgi.baseadaptor.loader.ClasspathEntry;
+import org.eclipse.osgi.baseadaptor.loader.ClasspathManager;
+import org.eclipse.osgi.framework.adaptor.BundleProtectionDomain;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
+
+/**
+ *
+ */
+public class URLClassLoadingHook implements ClassLoadingHook {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook#addClassPathEntry(java.util.ArrayList, java.lang.String, org.eclipse.osgi.baseadaptor.loader.ClasspathManager, org.eclipse.osgi.baseadaptor.BaseData, java.security.ProtectionDomain)
+ */
+ public boolean addClassPathEntry(ArrayList cpEntries,
+ String cp,
+ ClasspathManager hostmanager,
+ BaseData sourcedata,
+ ProtectionDomain sourcedomain) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook#createClassLoader(java.lang.ClassLoader, org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate, org.eclipse.osgi.framework.adaptor.BundleProtectionDomain, org.eclipse.osgi.baseadaptor.BaseData, java.lang.String[])
+ */
+ public BaseClassLoader createClassLoader(ClassLoader parent,
+ ClassLoaderDelegate delegate,
+ BundleProtectionDomain domain,
+ BaseData data,
+ String[] bundleclasspath) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook#findLibrary(org.eclipse.osgi.baseadaptor.BaseData, java.lang.String)
+ */
+ public String findLibrary(BaseData data, String libName) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook#getBundleClassLoaderParent()
+ */
+ public ClassLoader getBundleClassLoaderParent() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook#initializedClassLoader(org.eclipse.osgi.baseadaptor.loader.BaseClassLoader, org.eclipse.osgi.baseadaptor.BaseData)
+ */
+ public void initializedClassLoader(BaseClassLoader baseClassLoader, BaseData data) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook#processClass(java.lang.String, byte[], org.eclipse.osgi.baseadaptor.loader.ClasspathEntry, org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry, org.eclipse.osgi.baseadaptor.loader.ClasspathManager)
+ */
+ public byte[] processClass(String name,
+ byte[] classbytes,
+ ClasspathEntry classpathEntry,
+ BundleEntry entry,
+ ClasspathManager manager) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Propchange: tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/URLClassLoadingHook.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/URLClassLoadingHook.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: tuscany/java/sca/modules/node-launcher-equinox/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/pom.xml?rev=692604&r1=692603&r2=692604&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/pom.xml (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/pom.xml Fri Sep 5 18:46:45 2008
@@ -87,6 +87,7 @@
<build>
<plugins>
+ <!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
@@ -107,7 +108,8 @@
</configuration>
</execution>
</executions>
- </plugin>
+ </plugin>
+ -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
Modified: tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java?rev=692604&r1=692603&r2=692604&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHost.java Fri Sep 5 18:46:45 2008
@@ -20,12 +20,15 @@
package org.apache.tuscany.sca.node.equinox.launcher;
import java.io.File;
+import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.adaptor.EclipseStarter;
import org.eclipse.core.runtime.adaptor.LocationManager;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
/**
* Wraps the Equinox runtime.
@@ -33,7 +36,8 @@
public class EquinoxOSGiHost {
private LauncherBundleActivator activator = new LauncherBundleActivator();
private BundleContext context;
-
+ 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, "
@@ -81,6 +85,26 @@
throw new IllegalStateException(e);
}
}
+
+ public Bundle findBundle(String symbolicName, String version) {
+ if (context == null) {
+ return null;
+ }
+ Bundle[] bundles = context.getBundles();
+ if (version == null) {
+ version = "0.0.0";
+ }
+ for (Bundle b : bundles) {
+ String v = (String)b.getHeaders().get(Constants.BUNDLE_VERSION);
+ if (v == null) {
+ v = "0.0.0";
+ }
+ if (b.getSymbolicName().equals(symbolicName) && (version.equals("0.0.0") || v.equals(version))) {
+ return b;
+ }
+ }
+ return null;
+ }
public void stop() {
try {
@@ -90,6 +114,10 @@
}
}
+ public BundleContext getBundleContext() {
+ return context;
+ }
+
private BundleContext startup() throws Exception {
String args[] = {};
Map<Object, Object> props = new HashMap<Object, Object>();
@@ -101,16 +129,50 @@
props.put(LocationManager.PROP_INSTALL_AREA, new File("target/eclipse/install").toURI().toString());
props.put(LocationManager.PROP_CONFIG_AREA, new File("target/eclipse/config").toURI().toString());
props.put(LocationManager.PROP_USER_AREA, new File("target/eclipse/user").toURI().toString());
-
+
EclipseStarter.setInitialProperties(props);
context = EclipseStarter.startup(args, null);
activator.start(context);
+
+// [rfeng] This is useful to report bundle resolving issues
+// for (Bundle b : context.getBundles()) {
+// System.out.println("Starting: " + b);
+// try {
+// b.start();
+// } catch (BundleException e) {
+// e.printStackTrace();
+// }
+// }
+ tccl = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(getContextClassLoader());
return context;
}
+ private ClassLoader getContextClassLoader() {
+ Bundle b = findBundle("org.apache.tuscany.sca.extensibility.equinox", null);
+ if (b != null) {
+ 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);
+ }
+ }
+ throw new IllegalStateException("Bundle org.apache.tuscany.sca.extensibility.equinox is not installed");
+ }
+
private void shutdown() throws Exception {
activator.stop(context);
EclipseStarter.shutdown();
+ Thread.currentThread().setContextClassLoader(tccl);
}
}
Modified: tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java?rev=692604&r1=692603&r2=692604&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherBundleActivator.java Fri Sep 5 18:46:45 2008
@@ -88,10 +88,12 @@
for (Bundle b : bundleContext.getBundles()) {
try {
- if ("org.apache.tuscany.sca.contribution.osgi".equals(b.getSymbolicName())) {
- b.start();
- logger.info(toString(b, false) + " " + b.getState());
- break;
+ if ("org.apache.tuscany.sca.contribution.osgi".equals(b.getSymbolicName()) || "org.apache.tuscany.sca.extensibility.equinox"
+ .equals(b.getSymbolicName())) {
+ if (b.getHeaders().get("Fragment-Host") == null) {
+ b.start();
+ logger.info(toString(b, false) + " " + b.getState());
+ }
}
} catch (Exception e) {
logger.log(Level.SEVERE, e.getMessage(), e);
@@ -223,11 +225,14 @@
} else {
return null;
}
+ } else if (file != null && !file.exists()) {
+ return null;
}
Manifest manifest = readManifest(bundleFile);
boolean isOSGiBundle = manifest != null && manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME) != null;
if (!isOSGiBundle) {
+ // return null;
manifest = updateBundleManifest(bundleFile, manifest);
}
Modified: tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java?rev=692604&r1=692603&r2=692604&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java Fri Sep 5 18:46:45 2008
@@ -33,11 +33,14 @@
public class NodeLauncher {
static final Logger logger = Logger.getLogger(NodeLauncher.class.getName());
+ private EquinoxOSGiHost host;
/**
* Constructs a new node launcher.
*/
private NodeLauncher() {
+ host = new EquinoxOSGiHost();
+ host.start();
}
/**
@@ -115,15 +118,11 @@
// Create a node launcher
NodeLauncher launcher = newInstance();
- EquinoxOSGiHost equinox = null;
+ EquinoxOSGiHost equinox = launcher.host;
Object node = null;
ShutdownThread shutdown = null;
try {
- // Start the OSGi host
- equinox = new EquinoxOSGiHost();
- equinox.start();
-
if (args.length ==1) {
// Create a node from a configuration URI
@@ -180,6 +179,12 @@
}
}
}
+
+ public void destroy() {
+ if (host != null) {
+ host.stop();
+ }
+ }
/**
* Stop the given node.
Modified: tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java?rev=692604&r1=692603&r2=692604&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java Fri Sep 5 18:46:45 2008
@@ -32,26 +32,23 @@
*
*/
public class NodeLauncherTestCase {
- private static EquinoxOSGiHost equinox;
+ private static NodeLauncher launcher;
@BeforeClass
public static void setUp() {
- // System.setProperty("TUSCANY_HOME", "target/tuscany");
- equinox = new EquinoxOSGiHost();
- equinox.start();
+ launcher = NodeLauncher.newInstance();
}
@AfterClass
public static void tearDown() {
- if (equinox != null) {
- equinox.stop();
+ if (launcher != null) {
+ launcher.destroy();
}
}
@Test
public void testLaunch() throws Exception {
- NodeLauncher launcher = NodeLauncher.newInstance();
SCANode node = launcher.createNodeFromClassLoader("HelloWorld.composite", getClass().getClassLoader());
node.start();