aries-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gno...@apache.org
Subject svn commit: r1635466 - in /aries/trunk/proxy/proxy-impl/src: main/java/org/apache/aries/proxy/impl/interfaces/ test/java/org/apache/aries/blueprint/proxy/
Date Thu, 30 Oct 2014 11:23:37 GMT
Author: gnodet
Date: Thu Oct 30 11:23:37 2014
New Revision: 1635466

URL: http://svn.apache.org/r1635466
Log:
[ARIES-1161] Use BundleWiring as the key for proxy classloaders

Modified:
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
    aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java
    aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyGeneratorTest.java
    aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyPlusSubclassGeneratorTest.java

Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java?rev=1635466&r1=1635465&r2=1635466&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
(original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
Thu Oct 30 11:23:37 2014
@@ -36,6 +36,7 @@ import org.apache.aries.proxy.UnableToPr
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.Opcodes;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.wiring.BundleWiring;
 
 /**
  * This class is used to aggregate several interfaces into a real class which implements
all of them
@@ -51,8 +52,8 @@ public final class InterfaceProxyGenerat
     
   }
 
-  private static final Map<Bundle, WeakReference<ProxyClassLoader>> cache = 
-            new WeakHashMap<Bundle, WeakReference<ProxyClassLoader>>(128);
+  private static final Map<BundleWiring, WeakReference<ProxyClassLoader>> cache
=
+            new WeakHashMap<BundleWiring, WeakReference<ProxyClassLoader>>(128);
   
   /**
    * Generate a new proxy instance implementing the supplied interfaces and using the supplied
@@ -65,7 +66,7 @@ public final class InterfaceProxyGenerat
    * @return
    * @throws UnableToProxyException
    */
-  public static final Object getProxyInstance(Bundle client, Class<?> superclass,
+  public static Object getProxyInstance(Bundle client, Class<?> superclass,
       Collection<Class<?>> ifaces, Callable<Object> dispatcher, InvocationListener
listener) throws UnableToProxyException{
     
     if(superclass != null && (superclass.getModifiers() & Modifier.FINAL) !=
0)
@@ -76,24 +77,25 @@ public final class InterfaceProxyGenerat
     SortedSet<Class<?>> interfaces = createSet(ifaces);
     
     synchronized (cache) {
-      WeakReference<ProxyClassLoader> ref = cache.get(client);
+      BundleWiring wiring = client == null ? null : (BundleWiring)client.adapt(BundleWiring.class);
+      WeakReference<ProxyClassLoader> ref = cache.get(wiring);
       
       if(ref != null)
         pcl = ref.get();
       
       if (pcl != null && pcl.isInvalid(interfaces)) {
           pcl = null;
-          cache.remove(client);
+          cache.remove(wiring);
       }
       
       if(pcl == null) {
         pcl = new ProxyClassLoader(client);
-        cache.put(client, new WeakReference<ProxyClassLoader>(pcl));
+        cache.put(wiring, new WeakReference<ProxyClassLoader>(pcl));
       }
     }
-    
+
     Class<?> c = pcl.createProxyClass(superclass, interfaces);
-        
+
     try {
       Constructor<?> con = c.getDeclaredConstructor(Callable.class, InvocationListener.class);
       con.setAccessible(true);

Modified: aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java?rev=1635466&r1=1635465&r2=1635466&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java
(original)
+++ aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java
Thu Oct 30 11:23:37 2014
@@ -27,10 +27,12 @@ import static org.junit.Assert.fail;
 
 import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
+import java.io.File;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
@@ -45,6 +47,9 @@ import org.apache.aries.util.ClassLoader
 import org.junit.Before;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWiring;
 
 
 public class InterfaceProxyingTest {
@@ -67,12 +72,34 @@ public class InterfaceProxyingTest {
       list = o;
     }
   }
-  
+
   private Bundle testBundle;
-  
+
+  /**
+   * Extended BundleMock which handles update() and adapt() methods
+   */
+  public static class BundleMockEx extends BundleMock {
+    private BundleWiring currentWiring = Skeleton.newMock(BundleWiring.class);
+
+    public BundleMockEx(String name, Dictionary<?, ?> properties) {
+      super(name, properties);
+    }
+
+    public <A> A adapt(Class<A> type) {
+      if (type == BundleWiring.class) {
+        return (A) currentWiring;
+      }
+      return null;
+    }
+
+    public void update() throws BundleException {
+      this.currentWiring = Skeleton.newMock(BundleWiring.class);
+    }
+  }
+
   @Before
   public void setup() {
-    testBundle = Skeleton.newMock(new BundleMock("test", 
+    testBundle = Skeleton.newMock(new BundleMockEx("test",
         new Hashtable<Object, Object>()), Bundle.class);
   }
   
@@ -249,25 +276,35 @@ public class InterfaceProxyingTest {
       TestClassLoader loader = new TestClassLoader();
       skel.setReturnValue(new MethodCall(ClassLoaderProxy.class, "getClassLoader"), loader);
       skel.setReturnValue(new MethodCall(Bundle.class, "getLastModified"), 10l);
-      
+      skel.setReturnValue(new MethodCall(Bundle.class, "adapt", BundleWiring.class), Skeleton.newMock(BundleWiring.class));
+
       Class<?> clazz = loader.loadClass("org.apache.aries.blueprint.proxy.TestInterface");
       
       Object proxy = InterfaceProxyGenerator.getProxyInstance(bundle, null, Arrays.<Class<?>>asList(clazz),
constantly(null), null);
       assertTrue(clazz.isInstance(proxy));
+
+      ClassLoader parent1 = proxy.getClass().getClassLoader().getParent();
       
       /* Now again but with a changed classloader as if the bundle had refreshed */
       
       TestClassLoader loaderToo = new TestClassLoader();
       skel.setReturnValue(new MethodCall(ClassLoaderProxy.class, "getClassLoader"), loaderToo);
       skel.setReturnValue(new MethodCall(Bundle.class, "getLastModified"), 20l);
+
+      // let's change the returned revision
+      skel.setReturnValue(new MethodCall(Bundle.class, "adapt", BundleWiring.class), Skeleton.newMock(BundleWiring.class));
       
       Class<?> clazzToo = loaderToo.loadClass("org.apache.aries.blueprint.proxy.TestInterface");
       
       Object proxyToo = InterfaceProxyGenerator.getProxyInstance(bundle, null, Arrays.<Class<?>>asList(clazzToo),
constantly(null), null);
       assertTrue(clazzToo.isInstance(proxyToo));
+
+      ClassLoader parent2= proxyToo.getClass().getClassLoader().getParent();
+
+      // parents should be different, as the are the classloaders of different bundle revisions
+      assertTrue(parent1 != parent2);
   }
-  
-  
+
   protected void assertCalled(TestListener listener, boolean pre, boolean post, boolean ex)
{
     assertEquals(pre, listener.preInvoke);
     assertEquals(post, listener.postInvoke);

Modified: aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyGeneratorTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyGeneratorTest.java?rev=1635466&r1=1635465&r2=1635466&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyGeneratorTest.java
(original)
+++ aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyGeneratorTest.java
Thu Oct 30 11:23:37 2014
@@ -55,6 +55,7 @@ import org.apache.aries.util.ClassLoader
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.wiring.BundleWiring;
 
 
 public class WovenProxyGeneratorTest extends AbstractProxyTest
@@ -496,10 +497,13 @@ public class WovenProxyGeneratorTest ext
   @Test
   public void testWovenClassPlusInterfaces() throws Exception {
     Bundle b = (Bundle) Skeleton.newMock(new Class<?>[] {Bundle.class, ClassLoaderProxy.class});
-    
+    BundleWiring bw = (BundleWiring) Skeleton.newMock(BundleWiring.class);
+
     Skeleton.getSkeleton(b).setReturnValue(new MethodCall(
         ClassLoaderProxy.class, "getClassLoader"), weavingLoader);
-    
+    Skeleton.getSkeleton(b).setReturnValue(new MethodCall(
+        ClassLoaderProxy.class, "adapt", BundleWiring.class), bw);
+
     Object toCall = new AsmProxyManager().createDelegatingProxy(b, Arrays.asList(
         getProxyClass(ProxyTestClassAbstract.class), Callable.class), new Callable() {
 

Modified: aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyPlusSubclassGeneratorTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyPlusSubclassGeneratorTest.java?rev=1635466&r1=1635465&r2=1635466&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyPlusSubclassGeneratorTest.java
(original)
+++ aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/WovenProxyPlusSubclassGeneratorTest.java
Thu Oct 30 11:23:37 2014
@@ -49,6 +49,7 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.wiring.BundleWiring;
 
 /**
  * This class uses the {@link ProxySubclassGenerator} to test
@@ -64,13 +65,17 @@ public class WovenProxyPlusSubclassGener
   private Callable<Object> testCallable = null;
   
   private static Bundle testBundle;
-  
+  private static BundleWiring testBundleWiring;
+
   @BeforeClass
   public static void createTestBundle() {
 	  testBundle = (Bundle) Skeleton.newMock(new Class<?>[] {Bundle.class, ClassLoaderProxy.class});
-	    
+	  testBundleWiring = (BundleWiring) Skeleton.newMock(BundleWiring.class);
+
 	    Skeleton.getSkeleton(testBundle).setReturnValue(new MethodCall(
 	        ClassLoaderProxy.class, "getClassLoader"), weavingLoader);
+	    Skeleton.getSkeleton(testBundle).setReturnValue(new MethodCall(
+	        ClassLoaderProxy.class, "adapt", BundleWiring.class), testBundleWiring);
   }
 
   //Avoid running four weaving tests that don't apply to us



Mime
View raw message