You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by da...@apache.org on 2010/12/04 16:09:53 UTC
svn commit: r1042199 - in
/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly:
META-INF/ src/org/apache/aries/spifly/
Author: davidb
Date: Sat Dec 4 15:09:52 2010
New Revision: 1042199
URL: http://svn.apache.org/viewvc?rev=1042199&view=rev
Log:
Work in progress. Generating an additional method in the calling class that can pass appropriate information to the classloader lookup component.
Modified:
incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/META-INF/MANIFEST.MF
incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java
incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/MyWeavingHook.java
incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/TCCLSetterVisitor.java
incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java
Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/META-INF/MANIFEST.MF?rev=1042199&r1=1042198&r2=1042199&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/META-INF/MANIFEST.MF (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/META-INF/MANIFEST.MF Sat Dec 4 15:09:52 2010
@@ -1,7 +1,7 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: SpiFly
-Bundle-SymbolicName: SpiFly
+Bundle-SymbolicName: SpiFly;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: org.apache.aries.spifly.Activator
Import-Package: org.objectweb.asm;version="[3.2.0,4.0.0)",
Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java?rev=1042199&r1=1042198&r2=1042199&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java Sat Dec 4 15:09:52 2010
@@ -32,6 +32,8 @@ import org.osgi.util.tracker.BundleTrack
import org.osgi.util.tracker.ServiceTracker;
public class Activator implements BundleActivator {
+ static Activator activator;
+
private ServiceRegistration<WeavingHook> weavingHookService;
private LogServiceTracker lst;
private List<LogService> logServices = new CopyOnWriteArrayList<LogService>();
@@ -41,16 +43,19 @@ public class Activator implements Bundle
lst = new LogServiceTracker(context);
lst.open();
- WeavingHook wh = new MyWeavingHook();
+ WeavingHook wh = new MyWeavingHook(context);
weavingHookService = context.registerService(WeavingHook.class, wh,
null);
bt = new BundleTracker<List<ServiceRegistration<?>>>(context,
Bundle.ACTIVE, new SPIBundleTrackerCustomizer(this, context.getBundle()));
bt.open();
+
+ activator = this;
}
public synchronized void stop(BundleContext context) throws Exception {
+ activator = null;
bt.close();
weavingHookService.unregister();
lst.close();
Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/MyWeavingHook.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/MyWeavingHook.java?rev=1042199&r1=1042198&r2=1042199&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/MyWeavingHook.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/MyWeavingHook.java Sat Dec 4 15:09:52 2010
@@ -20,21 +20,37 @@ package org.apache.aries.spifly;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.hooks.weaving.WeavingHook;
import org.osgi.framework.hooks.weaving.WovenClass;
public class MyWeavingHook implements WeavingHook {
+ private final String addedImport;
+
+ MyWeavingHook(BundleContext context) {
+ Bundle b = context.getBundle();
+ String bver = b.getVersion().toString();
+ String bsn = b.getSymbolicName();
+
+ addedImport = Util.class.getPackage().getName() +
+ ";bundle-symbolic-name=" + bsn +
+ ";bundle-version=" + bver;
+ }
+
@Override
public void weave(WovenClass wovenClass) {
+ // TODO base this on SPI-Consumer header
if (wovenClass.getBundleWiring().getBundle().getSymbolicName().equals("MyTestBundle"))
{
System.out.println("*** WovenClass: " + wovenClass.getClassName());
ClassReader cr = new ClassReader(wovenClass.getBytes());
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- TCCLSetterVisitor tsv = new TCCLSetterVisitor(cw);
+ TCCLSetterVisitor tsv = new TCCLSetterVisitor(cw, wovenClass.getClassName());
cr.accept(tsv, 0);
wovenClass.setBytes(cw.toByteArray());
+ wovenClass.getDynamicImports().add(addedImport);
}
}
}
Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/TCCLSetterVisitor.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/TCCLSetterVisitor.java?rev=1042199&r1=1042198&r2=1042199&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/TCCLSetterVisitor.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/TCCLSetterVisitor.java Sat Dec 4 15:09:52 2010
@@ -25,13 +25,19 @@ import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
public class TCCLSetterVisitor extends ClassAdapter implements ClassVisitor, Opcodes {
+ private static final String GENERATED_METHOD_NAME = "$$fixContextClassLoader$$";
+
private static final String UTIL_CLASS = Util.class.getName().replace('.', '/');
private static final String VOID_RETURN_TYPE = "()V";
+
+ private final String targetClass;
- public TCCLSetterVisitor(ClassVisitor cv) {
+ public TCCLSetterVisitor(ClassVisitor cv, String className) {
super(cv);
+ this.targetClass = className.replace('.', '/');
}
@Override
@@ -42,8 +48,32 @@ public class TCCLSetterVisitor extends C
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
return new TCCLSetterMethodVisitor(mv);
}
+
+ @Override
+ public void visitEnd() {
+ // Add generated static method
+ MethodVisitor mv = cv.visitMethod(ACC_PRIVATE + ACC_STATIC,
+ GENERATED_METHOD_NAME, "()V", null, null);
+ mv.visitCode();
+ mv.visitLdcInsn("java.util.ServiceLoader");
+ mv.visitLdcInsn("load");
+ String typeIdentifier = "L" + targetClass + ";";
+ mv.visitLdcInsn(Type.getType(typeIdentifier));
+ mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class",
+ "getClassLoader", "()Ljava/lang/ClassLoader;");
+ mv.visitMethodInsn(INVOKESTATIC, "org/apache/aries/spifly/Util",
+ "fixContextClassloader",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V");
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(3, 0);
+ mv.visitEnd();
+
+ super.visitEnd();
+ }
+
- private static class TCCLSetterMethodVisitor extends MethodAdapter implements MethodVisitor
+
+ private class TCCLSetterMethodVisitor extends MethodAdapter implements MethodVisitor
{
public TCCLSetterMethodVisitor(MethodVisitor mv) {
super(mv);
@@ -61,8 +91,8 @@ public class TCCLSetterVisitor extends C
mv.visitMethodInsn(INVOKESTATIC, UTIL_CLASS,
"storeContextClassloader", VOID_RETURN_TYPE);
- mv.visitMethodInsn(INVOKESTATIC, UTIL_CLASS,
- "fixContextClassloader", VOID_RETURN_TYPE);
+ mv.visitMethodInsn(INVOKESTATIC, targetClass,
+ GENERATED_METHOD_NAME, VOID_RETURN_TYPE);
super.visitMethodInsn(opcode, owner, name, desc);
Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java?rev=1042199&r1=1042198&r2=1042199&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java Sat Dec 4 15:09:52 2010
@@ -34,11 +34,15 @@ public class Util {
classLoaders.set(null);
}
- public static void fixContextClassloader() {
+ public static void fixContextClassloader(String cls, String method, ClassLoader loader) {
+ System.out.println("~~~ cls: " + cls + " method: " + method + " cl:" + loader);
+
Thread.currentThread().setContextClassLoader(findClassLoader());
}
private static ClassLoader findClassLoader() {
+// Activator.activator.getClassloaderAdvice()
+
ClassLoader cl = Activator.class.getClassLoader();
if (!(cl instanceof BundleReference)) {
return null;