You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ti...@apache.org on 2011/06/07 10:56:05 UTC

svn commit: r1132917 - in /aries/trunk/proxy: proxy-api/src/main/java/org/apache/aries/proxy/ proxy-impl/ proxy-impl/src/main/java/org/apache/aries/proxy/impl/ proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ proxy-impl/src/main/java/org/ap...

Author: timothyjward
Date: Tue Jun  7 08:56:04 2011
New Revision: 1132917

URL: http://svn.apache.org/viewvc?rev=1132917&view=rev
Log:
ARIES-671 : Avoid creating multiple proxy ClassLoaders for a single bundle

Added:
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java
      - copied, changed from r1128548, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyMethodAdapter.java
      - copied, changed from r1128548, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyMethodAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java
      - copied, changed from r1128548, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/OSGiFriendlyClassWriter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/TypeMethod.java
      - copied, changed from r1092376, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/TypeMethod.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java
      - copied, changed from r1094472, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceCombiningClassAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyAdapter.java
      - copied, changed from r1092376, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyMethodAdapter.java
      - copied, changed from r1092376, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyMethodAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java
    aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/util/
    aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/util/AriesFrameworkUtil.java
Removed:
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyMethodAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceCombiningClassAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyMethodAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/OSGiFriendlyClassWriter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/TypeMethod.java
Modified:
    aries/trunk/proxy/proxy-api/src/main/java/org/apache/aries/proxy/UnableToProxyException.java
    aries/trunk/proxy/proxy-impl/pom.xml
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/AsmProxyManager.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyAdapter.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyMethodAdapter.java
    aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java

Modified: aries/trunk/proxy/proxy-api/src/main/java/org/apache/aries/proxy/UnableToProxyException.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-api/src/main/java/org/apache/aries/proxy/UnableToProxyException.java?rev=1132917&r1=1132916&r2=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-api/src/main/java/org/apache/aries/proxy/UnableToProxyException.java (original)
+++ aries/trunk/proxy/proxy-api/src/main/java/org/apache/aries/proxy/UnableToProxyException.java Tue Jun  7 08:56:04 2011
@@ -31,7 +31,7 @@ public class UnableToProxyException exte
     this(clazz.getName(), clazz.getName());
   }
 
-  public UnableToProxyException(Class<?> clazz, Exception e)
+  public UnableToProxyException(Class<?> clazz, Throwable e)
   {
     this(clazz.getName(), e);
   }

Modified: aries/trunk/proxy/proxy-impl/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/pom.xml?rev=1132917&r1=1132916&r2=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/pom.xml (original)
+++ aries/trunk/proxy/proxy-impl/pom.xml Tue Jun  7 08:56:04 2011
@@ -109,6 +109,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.aries.testsupport</groupId>
+            <artifactId>org.apache.aries.testsupport.unit</artifactId>
+            <version>0.3.1-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
         	<groupId>org.apache.aries.proxy</groupId>
         	<artifactId>org.apache.aries.proxy.api</artifactId>
         	<scope>compile</scope>

Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/AsmProxyManager.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/AsmProxyManager.java?rev=1132917&r1=1132916&r2=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/AsmProxyManager.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/AsmProxyManager.java Tue Jun  7 08:56:04 2011
@@ -30,7 +30,7 @@ import org.apache.aries.proxy.Invocation
 import org.apache.aries.proxy.ProxyManager;
 import org.apache.aries.proxy.UnableToProxyException;
 import org.apache.aries.proxy.impl.gen.ProxySubclassGenerator;
-import org.apache.aries.proxy.impl.weaving.InterfaceCombiningClassAdapter;
+import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
 import org.apache.aries.proxy.weaving.WovenProxy;
 import org.osgi.framework.Bundle;
 
@@ -99,7 +99,7 @@ public final class AsmProxyManager exten
         proxyObject = ProxySubclassGenerator.newProxySubclassInstance(classToProxy, new ProxyHandler(this, dispatcher, listener));
       }
     } else {
-      proxyObject = InterfaceCombiningClassAdapter.getProxyInstance(classes, dispatcher, listener);
+      proxyObject = InterfaceProxyGenerator.getProxyInstance(clientBundle, classes, dispatcher, listener);
     }
 
     return proxyObject;

Copied: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java (from r1128548, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyAdapter.java)
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java?p2=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java&p1=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyAdapter.java&r1=1128548&r2=1132917&rev=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java Tue Jun  7 08:56:04 2011
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.proxy.impl.weaving;
+package org.apache.aries.proxy.impl.common;
 
 import java.io.IOException;
 import java.lang.reflect.Modifier;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -55,11 +56,11 @@ import org.slf4j.LoggerFactory;
  * classes being written. Classes processed by this adapter will implement 
  * {@link WovenProxy}, and have a static initialiser that populates 
  * {@link java.lang.reflect.Method} fields for use with the 
- * {@link InvocationListener}. Known subclasses are {@link WovenProxyAdapter}, 
- * used to weave classes being loaded by the framework, and {@link InterfaceCombiningClassAdapter}
+ * {@link InvocationListener}. Known subclasses are WovenProxyAdapter, 
+ * used to weave classes being loaded by the framework, and InterfaceCombiningClassAdapter
  * which is used to dynamically create objects that implement multiple interfaces
  */
-abstract class AbstractWovenProxyAdapter extends ClassAdapter implements Opcodes {
+public abstract class AbstractWovenProxyAdapter extends ClassAdapter implements Opcodes {
   private static final Logger LOGGER = LoggerFactory
       .getLogger(AbstractWovenProxyAdapter.class);
 
@@ -77,20 +78,20 @@ abstract class AbstractWovenProxyAdapter
   private static final String[] annotationTypeDescriptors = new String[] { "Ljavax/persistence/Transient;" };
 
   /** the name of the field used to store the {@link InvocationListener} */
-  static final String LISTENER_FIELD = "org_apache_aries_proxy_InvocationListener_"
+  protected static final String LISTENER_FIELD = "org_apache_aries_proxy_InvocationListener_"
       + UU_ID;
   /** the name of the field used to store the dispatcher */
-  static final String DISPATCHER_FIELD = "woven_proxy_dispatcher_" + UU_ID;
+  public static final String DISPATCHER_FIELD = "woven_proxy_dispatcher_" + UU_ID;
 
   /* Useful ASM types */
   /** The ASM type for the {@link InvocationListener} */
   static final Type LISTENER_TYPE = Type.getType(InvocationListener.class);
   /** The ASM type for the dispatcher */
-  static final Type DISPATCHER_TYPE = Type.getType(Callable.class);
+  public static final Type DISPATCHER_TYPE = Type.getType(Callable.class);
   private static final Type CLASS_TYPE = Type.getType(Class.class);
   private static final Type CLASS_ARRAY_TYPE = Type.getType(Class[].class);
   private static final Type STRING_TYPE = Type.getType(String.class);
-  static final Type OBJECT_TYPE = Type.getType(Object.class);
+  public static final Type OBJECT_TYPE = Type.getType(Object.class);
   static final Type METHOD_TYPE = Type.getType(java.lang.reflect.Method.class);
   /** The {@link Type} of the {@link WovenProxy} interface */
   static final Type WOVEN_PROXY_IFACE_TYPE = Type.getType(WovenProxy.class);
@@ -132,22 +133,22 @@ abstract class AbstractWovenProxyAdapter
    * This list is then used to override any methods that would otherwise be missed
    * by the weaving process. 
    */
-  private final List<Class<?>> nonObjectSupers = new ArrayList<Class<?>>();
+  protected final List<Class<?>> nonObjectSupers = new ArrayList<Class<?>>();
   
   /**
    * Methods we have transformed and need to create static fields for.
    * Stored as field name to {@link TypeMethod} so we know which Class to reflect
    * them off
    */
-  private final Map<String, TypeMethod> transformedMethods = new HashMap<String, TypeMethod>();
+  protected final Map<String, TypeMethod> transformedMethods = new HashMap<String, TypeMethod>();
   
   /**
    *  A set of {@link Method} objects identifying the methods that are in this 
    *  class. This is used to prevent us duplicating methods copied from 
-   *  {@link WovenProxyAdapter#nonObjectSupers} that are already overridden in 
+   *  {@link AbstractWovenProxyAdapter#nonObjectSupers} that are already overridden in 
    *  this class.
    */
-  final Set<Method> knownMethods = new HashSet<Method>();
+  private final Set<Method> knownMethods = new HashSet<Method>();
   /** 
    * If our super does not have a no-args constructor then we need to be clever
    * when writing our own constructor.
@@ -159,6 +160,10 @@ abstract class AbstractWovenProxyAdapter
    */
   private boolean hasNoArgsConstructor = false;
 
+  
+  public static final int JAVA_CLASS_VERSION = new BigDecimal(System.getProperty("java.class.version")).intValue();
+  public static final boolean IS_AT_LEAST_JAVA_6 = JAVA_CLASS_VERSION >= Opcodes.V1_6;
+  
   /**
    * Create a new adapter for the supplied class
    * 
@@ -184,7 +189,7 @@ abstract class AbstractWovenProxyAdapter
         name, signature, superName, interfaces });
 
     // always update to the most recent version of the JVM
-    version = WovenProxyGenerator.JAVA_CLASS_VERSION;
+    version = AbstractWovenProxyAdapter.JAVA_CLASS_VERSION;
 
     superType = Type.getType("L" + superName + ";");
 
@@ -256,7 +261,7 @@ abstract class AbstractWovenProxyAdapter
     
     Method currentMethod = new Method(name, desc);
     
-    knownMethods.add(currentMethod);
+    getKnownMethods().add(currentMethod);
     
     MethodVisitor methodVisitorToReturn = null;
 
@@ -292,36 +297,9 @@ abstract class AbstractWovenProxyAdapter
    * Our class may claim to implement WovenProxy, but doesn't have any
    * implementations! We should fix this.
    */
-  public final void visitEnd() {
+  public void visitEnd() {
     LOGGER.debug(Constants.LOG_ENTRY, "visitEnd");
 
-    //first we need to override all the methods that were on non-object parents
-    for(Class<?> c : nonObjectSupers) {
-      try {
-        String className;
-        Class<?> enclosing = c.getEnclosingClass();
-        List<Class<?>> enclosingChain = new ArrayList<Class<?>>();
-        while(enclosing != null) {
-          enclosingChain.add(enclosing);
-          enclosing = enclosing.getEnclosingClass();
-        }
-        StringBuilder sb = new StringBuilder();
-        for(Class<?> clazz : enclosingChain) {
-          sb.append(clazz.getSimpleName()).append('$');
-        }
-        className = sb.append(c.getSimpleName()).append(".class").toString();
-        
-        //Load the class bytes and copy methods across
-        ClassReader cReader = new ClassReader(c.getResourceAsStream(className));
-        //We don't need the method bodies, so skip them for speed
-        cReader.accept(new MethodCopyingClassAdapter(cv, c, typeBeingWoven,
-            knownMethods, transformedMethods), ClassReader.SKIP_CODE | 
-            ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
-      } catch (IOException e) {
-        // This should never happen! <= famous last words (not)
-        throw new RuntimeException(NLS.MESSAGES.getMessage("unexpected.error.processing.class", c.getName(), typeBeingWoven.getClassName()), e);
-      }
-    }
     // If we need to implement woven proxy in this class then write the methods
     if (implementWovenProxy) {
       writeFinalWovenProxyMethods();
@@ -340,6 +318,11 @@ abstract class AbstractWovenProxyAdapter
 
     LOGGER.debug(Constants.LOG_EXIT, "visitEnd");
   }
+  
+  public Set<Method> getKnownMethods() {
+    return knownMethods;
+  }
+
   /**
    * Get the {@link MethodVisitor} that will weave a given method
    * @param access
@@ -588,11 +571,39 @@ abstract class AbstractWovenProxyAdapter
    * 
    * @return
    */
-  static final String getSanitizedUUIDString() {
+  public static final String getSanitizedUUIDString() {
     return UUID.randomUUID().toString().replace('-', '_');
   }
 
   /**
+   * This method will read the bytes for the supplied {@link Class} using the
+   * supplied ASM {@link ClassVisitor}, the reader will skip DEBUG, FRAMES and CODE.
+   * @param c
+   * @param adapter
+   * @throws IOException
+   */
+  public static void readClass(Class<?> c, ClassVisitor adapter) throws IOException {
+    String className;
+    Class<?> enclosing = c.getEnclosingClass();
+    List<Class<?>> enclosingChain = new ArrayList<Class<?>>();
+    while(enclosing != null) {
+      enclosingChain.add(enclosing);
+      enclosing = enclosing.getEnclosingClass();
+    }
+    StringBuilder sb = new StringBuilder();
+    for(Class<?> clazz : enclosingChain) {
+      sb.append(clazz.getSimpleName()).append('$');
+    }
+    className = sb.append(c.getSimpleName()).append(".class").toString();
+    
+    //Load the class bytes and copy methods across
+    ClassReader cReader = new ClassReader(c.getResourceAsStream(className));
+
+    cReader.accept(adapter, ClassReader.SKIP_CODE | 
+        ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
+  }
+
+  /**
    * Generate an instance field that should be "invisible" to normal code
    * 
    * @param fieldName

Copied: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyMethodAdapter.java (from r1128548, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyMethodAdapter.java)
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyMethodAdapter.java?p2=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyMethodAdapter.java&p1=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyMethodAdapter.java&r1=1128548&r2=1132917&rev=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/AbstractWovenProxyMethodAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyMethodAdapter.java Tue Jun  7 08:56:04 2011
@@ -16,16 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.proxy.impl.weaving;
+package org.apache.aries.proxy.impl.common;
 
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.DISPATCHER_FIELD;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.DISPATCHER_TYPE;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.LISTENER_FIELD;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.LISTENER_TYPE;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.METHOD_TYPE;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.NO_ARGS;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.OBJECT_TYPE;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyAdapter.THROWABLE_INAME;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.DISPATCHER_FIELD;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.DISPATCHER_TYPE;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.LISTENER_FIELD;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.LISTENER_TYPE;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.METHOD_TYPE;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.NO_ARGS;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.OBJECT_TYPE;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.THROWABLE_INAME;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.WOVEN_PROXY_IFACE_TYPE;
 import static org.objectweb.asm.Opcodes.ACONST_NULL;
 import static org.objectweb.asm.Opcodes.IFNE;
 
@@ -111,7 +112,7 @@ import org.objectweb.asm.commons.Method;
  *  
  *   
  */
-abstract class AbstractWovenProxyMethodAdapter extends GeneratorAdapter
+public abstract class AbstractWovenProxyMethodAdapter extends GeneratorAdapter
 {
   /** The type of a RuntimeException */
   private static final Type RUNTIME_EX_TYPE = Type.getType(RuntimeException.class);
@@ -255,7 +256,7 @@ abstract class AbstractWovenProxyMethodA
    */
   private final void setupLocals() {
     if (isVoid){
-      normalResult = newLocal(WovenProxyAdapter.OBJECT_TYPE);
+      normalResult = newLocal(OBJECT_TYPE);
     } else{
       normalResult = newLocal(returnType);
     }
@@ -303,7 +304,7 @@ abstract class AbstractWovenProxyMethodA
     loadArgArray();
     
     //invoke it and store the token returned
-    invokeInterface(WovenProxyAdapter.LISTENER_TYPE, PRE_INVOKE_METHOD);
+    invokeInterface(LISTENER_TYPE, PRE_INVOKE_METHOD);
     storeLocal(preInvokeReturnedToken);
     
     mark(nullListener);
@@ -321,7 +322,7 @@ abstract class AbstractWovenProxyMethodA
     
     loadLocal(preInvokeReturnedToken);
     loadLocal(dispatchTarget);
-    getStatic(typeBeingWoven, methodStaticFieldName, WovenProxyAdapter.METHOD_TYPE);
+    getStatic(typeBeingWoven, methodStaticFieldName, METHOD_TYPE);
     loadLocal(normalResult);
     
     //If the result a primitive then we need to box it
@@ -330,7 +331,7 @@ abstract class AbstractWovenProxyMethodA
     }
     
     //invoke the listener
-    invokeInterface(WovenProxyAdapter.LISTENER_TYPE, POST_INVOKE_METHOD);
+    invokeInterface(LISTENER_TYPE, POST_INVOKE_METHOD);
     
     mark(nullListener);
   }
@@ -389,7 +390,7 @@ abstract class AbstractWovenProxyMethodA
     loadLocal(dispatchTarget);
     getStatic(typeBeingWoven, methodStaticFieldName, METHOD_TYPE);
     loadLocal(originalException);
-    invokeInterface(WovenProxyAdapter.LISTENER_TYPE, POST_INVOKE_EXCEPTIONAL_METHOD);
+    invokeInterface(LISTENER_TYPE, POST_INVOKE_EXCEPTIONAL_METHOD);
     goTo(throwSelectedException);
     
     mark(afterInvoke);
@@ -416,7 +417,7 @@ abstract class AbstractWovenProxyMethodA
   protected final void unwrapEqualsArgument() {
     
     //Create and initialize a local for our work
-    int unwrapLocal = newLocal(WovenProxyAdapter.OBJECT_TYPE);
+    int unwrapLocal = newLocal(OBJECT_TYPE);
     visitInsn(ACONST_NULL);
     storeLocal(unwrapLocal);
     
@@ -424,14 +425,14 @@ abstract class AbstractWovenProxyMethodA
     mark(startUnwrap);
     //Load arg and check if it is a WovenProxy instances
     loadArg(0);
-    instanceOf(WovenProxyAdapter.WOVEN_PROXY_IFACE_TYPE);
+    instanceOf(WOVEN_PROXY_IFACE_TYPE);
     Label unwrapFinished = newLabel();
     //Jump if zero (false)
     visitJumpInsn(Opcodes.IFEQ, unwrapFinished);
     //Arg is a wovenProxy, if it is the same as last time then we're done
     loadLocal(unwrapLocal);
     loadArg(0);
-    ifCmp(WovenProxyAdapter.OBJECT_TYPE, EQ, unwrapFinished);
+    ifCmp(OBJECT_TYPE, EQ, unwrapFinished);
     //Not the same, store current arg in unwrapLocal for next loop
     loadArg(0);
     storeLocal(unwrapLocal);
@@ -439,19 +440,19 @@ abstract class AbstractWovenProxyMethodA
     //So arg is a WovenProxy, but not the same as last time, cast it and store 
     //the result of unwrap.call in the arg
     loadArg(0);
-    checkCast(WovenProxyAdapter.WOVEN_PROXY_IFACE_TYPE);
+    checkCast(WOVEN_PROXY_IFACE_TYPE);
     //Now unwrap
-    invokeInterface(WovenProxyAdapter.WOVEN_PROXY_IFACE_TYPE, new Method("org_apache_aries_proxy_weaving_WovenProxy_unwrap",
-        WovenProxyAdapter.DISPATCHER_TYPE, WovenProxyAdapter.NO_ARGS));
+    invokeInterface(WOVEN_PROXY_IFACE_TYPE, new Method("org_apache_aries_proxy_weaving_WovenProxy_unwrap",
+        DISPATCHER_TYPE, NO_ARGS));
     
     //Now we may have a Callable to invoke
-    int callable = newLocal(WovenProxyAdapter.DISPATCHER_TYPE);
+    int callable = newLocal(DISPATCHER_TYPE);
     storeLocal(callable);
     loadLocal(callable);
     ifNull(unwrapFinished);
     loadLocal(callable);
-    invokeInterface(WovenProxyAdapter.DISPATCHER_TYPE, new Method("call",
-        WovenProxyAdapter.OBJECT_TYPE, WovenProxyAdapter.NO_ARGS));
+    invokeInterface(DISPATCHER_TYPE, new Method("call",
+        OBJECT_TYPE, NO_ARGS));
     //Store the result and we're done (for this iteration)
     storeArg(0);
     goTo(startUnwrap);

Copied: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java (from r1128548, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/OSGiFriendlyClassWriter.java)
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java?p2=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java&p1=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/OSGiFriendlyClassWriter.java&r1=1128548&r2=1132917&rev=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/OSGiFriendlyClassWriter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java Tue Jun  7 08:56:04 2011
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.proxy.impl.weaving;
+package org.apache.aries.proxy.impl.common;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -30,9 +30,9 @@ import org.objectweb.asm.ClassWriter;
 /**
  * We need to override ASM's default behaviour in {@link #getCommonSuperClass(String, String)}
  * so that it doesn't load classes (which it was doing on the wrong {@link ClassLoader}
- * anyway...
+ * anyway...)
  */
-final class OSGiFriendlyClassWriter extends ClassWriter {
+public final class OSGiFriendlyClassWriter extends ClassWriter {
 
   private static final String OBJECT_INTERNAL_NAME = "java/lang/Object";
   private final ClassLoader loader;
@@ -65,7 +65,8 @@ final class OSGiFriendlyClassWriter exte
     if(arg0.equals(OBJECT_INTERNAL_NAME) || arg1.equals(OBJECT_INTERNAL_NAME))
       return OBJECT_INTERNAL_NAME;
     
-    //We can't load the class being woven, so call again passing in the supertype
+    // If either of these class names are the current class then we can short
+    // circuit to the superclass (which we already know)
     if(arg0.equals(currentClassInternalName))
       getCommonSuperClass(currentSuperClassInternalName, arg1);
     else if (arg1.equals(currentClassInternalName))
@@ -74,9 +75,8 @@ final class OSGiFriendlyClassWriter exte
     Set<String> names = new HashSet<String>();
     names.add(arg0);
     names.add(arg1);
-    //Try loading the class (in ASM)
+    //Try loading the class (in ASM not for real)
     try {
-      
       boolean bRunning = true;
       boolean aRunning = true;
       InputStream is;
@@ -94,6 +94,7 @@ final class OSGiFriendlyClassWriter exte
             else if(!!!names.add(arg00))
               return arg00;
           } else {
+            //The class file isn't visible on this ClassLoader
             unable = arg0;
             aRunning = false;
           }
@@ -114,11 +115,11 @@ final class OSGiFriendlyClassWriter exte
         }
       }
 
-        if (unable == null) {
-            throw new RuntimeException(NLS.MESSAGES.getMessage("no.common.superclass", arg0, arg1));
-        } else {
-            throw new RuntimeException(new UnableToProxyException(unable, NLS.MESSAGES.getMessage("no.common.superclass", arg0, arg1)));
-        }
+      if (unable == null) {
+          throw new RuntimeException(NLS.MESSAGES.getMessage("no.common.superclass", arg0, arg1));
+      } else {
+          throw new RuntimeException(new UnableToProxyException(unable, NLS.MESSAGES.getMessage("no.common.superclass", arg0, arg1)));
+      }
     } catch (IOException e) {
       throw new RuntimeException(e);
     }

Copied: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/TypeMethod.java (from r1092376, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/TypeMethod.java)
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/TypeMethod.java?p2=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/TypeMethod.java&p1=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/TypeMethod.java&r1=1092376&r2=1132917&rev=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/TypeMethod.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/TypeMethod.java Tue Jun  7 08:56:04 2011
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.proxy.impl.weaving;
+package org.apache.aries.proxy.impl.common;
 
 import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.Method;
@@ -24,7 +24,7 @@ import org.objectweb.asm.commons.Method;
 /**
  * This object stores a {@link Method} and the class that declares it
  */
-final class TypeMethod {
+public final class TypeMethod {
   final Type declaringClass;
   final Method method;
   

Copied: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java (from r1094472, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceCombiningClassAdapter.java)
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java?p2=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java&p1=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceCombiningClassAdapter.java&r1=1094472&r2=1132917&rev=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceCombiningClassAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java Tue Jun  7 08:56:04 2011
@@ -16,24 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.proxy.impl.weaving;
+package org.apache.aries.proxy.impl.interfaces;
 
 import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Queue;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.LinkedBlockingQueue;
 
-import org.apache.aries.proxy.InvocationListener;
 import org.apache.aries.proxy.UnableToProxyException;
-import org.apache.aries.proxy.weaving.WovenProxy;
-import org.objectweb.asm.ClassReader;
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
+import org.apache.aries.proxy.impl.common.OSGiFriendlyClassWriter;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
@@ -44,60 +39,17 @@ import org.objectweb.asm.commons.Method;
 /**
  * This class is used to aggregate several interfaces into a real class which implements all of them
  */
-public final class InterfaceCombiningClassAdapter extends EmptyVisitor implements Opcodes {
+final class InterfaceCombiningClassAdapter extends EmptyVisitor implements Opcodes {
 
-  /** An implementation of ClassLoader that will be used to define our proxy class */
-  private static final class ProxyClassLoader extends ClassLoader {
-    /** A {@link Map} of classes we already know */
-    private final Map<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>();
-    
-    /** The bytes of the proxy class */
-    private byte[] bytesToDefine;
-    /** The name of the proxy class */
-    private String classNameToDefine;
-    
-    public ProxyClassLoader(Collection<Class<?>> ifaces) {
-      for(Class<?> c : ifaces) {
-        classes.put(c.getName(), c);
-      }
-      classes.put(WovenProxy.class.getName(), WovenProxy.class);
-    }
-
-    @Override
-    protected Class<?> findClass(String className) {
-      Class<?> c = findLoadedClass(className);
-      
-      if(c == null) {
-        if(className.equals(classNameToDefine))
-          return defineClass(className, bytesToDefine, 0, bytesToDefine.length);
-        
-        c = classes.get(className);
-        
-        if(c == null) {
-          for(Class<?> iface : classes.values()) {
-            if(iface.getClassLoader() == null)
-              continue;
-            try {
-              c = iface.getClassLoader().loadClass(className);
-              break;
-            } catch (ClassNotFoundException cnfe) {
-              //No op
-            }
-          }
-        }
-      }
-      return c;
-    }
-  }
   /** 
-   * A cache of previously created proxy classes. Because we cache then update
+   * A cache of previously created proxy class loaders. Because we cache then update
    * the {@link InterfaceCombiningClassAdapter#accessList} we might temporarily 
    * end up with more in the cache than the maximum size of the access list. 
    * We therefore initialize this to be double the size of the access list so it
    * should never be necessary to resize
    */
-  private static final ConcurrentMap<HashSet<Class<?>>, Class<?>> cache = 
-    new ConcurrentHashMap<HashSet<Class<?>>, Class<?>>(256);
+  private static final ConcurrentMap<HashSet<Class<?>>, ProxyClassLoader> cache = 
+    new ConcurrentHashMap<HashSet<Class<?>>, ProxyClassLoader>(256);
   /**
    * The access List that determines when we evict things from our cache, items
    * are removed and re-added when accessed so a {@link LinkedBlockingQueue}
@@ -122,7 +74,7 @@ public final class InterfaceCombiningCla
    * @param loader
    * @param interfaces
    */
-  private InterfaceCombiningClassAdapter(String className,
+   InterfaceCombiningClassAdapter(String className,
       ClassLoader loader, Collection<Class<?>> interfaces) {
     writer = new OSGiFriendlyClassWriter(ClassWriter.COMPUTE_FRAMES, loader);
     adapter = new InterfaceUsingWovenProxyAdapter(writer, className, loader);
@@ -149,7 +101,7 @@ public final class InterfaceCombiningCla
     //If we already implement this method (from another interface) then we don't
     //want a duplicate. We also don't want to copy any static init blocks (these
     //initialize static fields on the interface that we don't copy
-    if(adapter.knownMethods.contains(new Method(name, desc)) || 
+    if(adapter.getKnownMethods().contains(new Method(name, desc)) || 
         "<clinit>".equals(name))
       return null;
     else 
@@ -161,16 +113,12 @@ public final class InterfaceCombiningCla
    * @return
    * @throws UnableToProxyException
    */
-  private final byte[] generateBytes() throws UnableToProxyException {
+  final byte[] generateBytes() throws UnableToProxyException {
     if(!!!done) {
       for(Class<?> c : interfaces) {
         adapter.setCurrentInterface(Type.getType(c));
         try {
-          ClassReader reader = new ClassReader(c.getResourceAsStream(
-              c.getSimpleName() + ".class"));
-          reader.accept(this, 
-              ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE);
-          
+          AbstractWovenProxyAdapter.readClass(c, this);
         } catch (IOException e) {
           throw new UnableToProxyException(c, e);
         }
@@ -180,84 +128,4 @@ public final class InterfaceCombiningCla
     }
     return writer.toByteArray();
   }
-
-  /**
-   * Generate a new proxy instance implementing the supplied interfaces and using the supplied
-   * dispatcher and listener
-   * @param ifaces
-   * @param dispatcher
-   * @param listener
-   * @return
-   * @throws UnableToProxyException
-   */
-  public static final Object getProxyInstance(Collection<Class<?>> ifaces, 
-      Callable<Object> dispatcher, InvocationListener listener) throws UnableToProxyException{
-    
-    Class<?> c;
-    
-    HashSet<Class<?>> classes = createSet(ifaces);
-    
-    c = cache.get(classes);
-    
-    if(c == null) {
-      ProxyClassLoader cl = new ProxyClassLoader(classes);
-      
-      String className = "Proxy" + AbstractWovenProxyAdapter.getSanitizedUUIDString();
-      
-      InterfaceCombiningClassAdapter icca = new InterfaceCombiningClassAdapter(
-          className, cl, classes);
-      
-      try {
-        cl.bytesToDefine = icca.generateBytes();
-        cl.classNameToDefine = className;
-        c = cl.loadClass(className);
-        Class<?> tmp = cache.putIfAbsent(classes, c);
-        if(tmp != null) {
-          //Someone beat us to it, just update the location in the access list
-          c = tmp;
-          
-          if(accessList.remove(classes)) {
-            //If we removed it we re-add it
-            while(!!!accessList.offer(classes)) {
-              HashSet<Class<?>> key = accessList.poll();
-              cache.remove(key);
-            }
-          }
-        } else {
-          //We have added a new cache entry
-          while(!!!accessList.offer(classes)) {
-            HashSet<Class<?>> key = accessList.poll();
-            cache.remove(key);
-          }
-        }
-      } catch (Exception re) {
-        throw new UnableToProxyException(classes.iterator().next(), re);
-      }
-    }
-    
-    try {
-      Constructor<?> con = c.getDeclaredConstructor(Callable.class, InvocationListener.class);
-      con.setAccessible(true);
-      return con.newInstance(dispatcher, listener);
-    } catch (Exception e) {
-      throw new UnableToProxyException(classes.iterator().next(), e);
-    }
-  }
-
-  /**
-   * Get the set of interfaces we need to process. This will return a HashSet 
-   * that includes includes the supplied collection and any super-interfaces of 
-   * those classes 
-   * @param ifaces
-   * @return
-   */
-  private static HashSet<Class<?>> createSet(Collection<Class<?>> ifaces) {
-    HashSet<Class<?>> classes = new HashSet<Class<?>>();
-    for(Class<?> c : ifaces) {
-      //If we already have a class contained then we have already covered its hierarchy
-      if(classes.add(c))
-        classes.addAll(createSet(Arrays.asList(c.getInterfaces())));
-    }
-    return classes;
-  }
 }
\ No newline at end of file

Added: 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=1132917&view=auto
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java (added)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java Tue Jun  7 08:56:04 2011
@@ -0,0 +1,96 @@
+/*
+ * 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.aries.proxy.impl.interfaces;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Constructor;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.concurrent.Callable;
+
+import org.apache.aries.proxy.InvocationListener;
+import org.apache.aries.proxy.UnableToProxyException;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.commons.EmptyVisitor;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class is used to aggregate several interfaces into a real class which implements all of them
+ */
+public final class InterfaceProxyGenerator extends EmptyVisitor implements Opcodes {
+
+  private static final Map<Bundle, WeakReference<ProxyClassLoader>> cache = 
+            new WeakHashMap<Bundle, WeakReference<ProxyClassLoader>>(128);
+  
+  /**
+   * Generate a new proxy instance implementing the supplied interfaces and using the supplied
+   * dispatcher and listener
+   * @param ifaces
+   * @param dispatcher
+   * @param listener
+   * @return
+   * @throws UnableToProxyException
+   */
+  public static final Object getProxyInstance(Bundle client, Collection<Class<?>> ifaces, 
+      Callable<Object> dispatcher, InvocationListener listener) throws UnableToProxyException{
+    
+    ProxyClassLoader pcl = null;
+    
+    synchronized (cache) {
+      WeakReference<ProxyClassLoader> ref = cache.get(client);
+      
+      if(ref != null)
+        pcl = ref.get();
+      if(pcl == null) {
+        pcl = new ProxyClassLoader(client);
+        cache.put(client, new WeakReference<ProxyClassLoader>(pcl));
+      }
+    }
+    
+    Class<?> c = pcl.createProxyClass(createSet(ifaces));
+        
+    try {
+      Constructor<?> con = c.getDeclaredConstructor(Callable.class, InvocationListener.class);
+      con.setAccessible(true);
+      return con.newInstance(dispatcher, listener);
+    } catch (Exception e) {
+      throw new UnableToProxyException(ifaces.iterator().next(), e);
+    }
+  }
+
+  /**
+   * Get the set of interfaces we need to process. This will return a HashSet 
+   * that includes includes the supplied collection and any super-interfaces of 
+   * those classes 
+   * @param ifaces
+   * @return
+   */
+  private static HashSet<Class<?>> createSet(Collection<Class<?>> ifaces) {
+    HashSet<Class<?>> classes = new HashSet<Class<?>>();
+    for(Class<?> c : ifaces) {
+      //If we already have a class contained then we have already covered its hierarchy
+      if(classes.add(c))
+        classes.addAll(createSet(Arrays.asList(c.getInterfaces())));
+    }
+    return classes;
+  }
+}
\ No newline at end of file

Copied: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyAdapter.java (from r1092376, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyAdapter.java)
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyAdapter.java?p2=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyAdapter.java&p1=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyAdapter.java&r1=1092376&r2=1132917&rev=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyAdapter.java Tue Jun  7 08:56:04 2011
@@ -16,15 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.proxy.impl.weaving;
+package org.apache.aries.proxy.impl.interfaces;
 
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
+import org.apache.aries.proxy.impl.weaving.ProxyWeavingHook;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.Method;
 
 /**
- * Used to weave classes processed by the {@link ProxyWeavingHook}
+ * Used to copy method signatures into a new class
  */
 final class InterfaceUsingWovenProxyAdapter extends AbstractWovenProxyAdapter {
 

Copied: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyMethodAdapter.java (from r1092376, aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyMethodAdapter.java)
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyMethodAdapter.java?p2=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyMethodAdapter.java&p1=aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyMethodAdapter.java&r1=1092376&r2=1132917&rev=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/InterfaceUsingWovenProxyMethodAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceUsingWovenProxyMethodAdapter.java Tue Jun  7 08:56:04 2011
@@ -16,15 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.proxy.impl.weaving;
+package org.apache.aries.proxy.impl.interfaces;
 
-import static org.apache.aries.proxy.impl.weaving.AbstractWovenProxyAdapter.OBJECT_TYPE;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.OBJECT_TYPE;
 
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyMethodAdapter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.Method;
 
-class InterfaceUsingWovenProxyMethodAdapter extends AbstractWovenProxyMethodAdapter {
+/**
+ * Used to create a delegating method implementation for methods with no body
+ */
+final class InterfaceUsingWovenProxyMethodAdapter extends AbstractWovenProxyMethodAdapter {
 
   private final Type interfaceType;
   public InterfaceUsingWovenProxyMethodAdapter(MethodVisitor mv, int access, String name,

Added: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java?rev=1132917&view=auto
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java (added)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java Tue Jun  7 08:56:04 2011
@@ -0,0 +1,74 @@
+package org.apache.aries.proxy.impl.interfaces;
+
+import java.security.ProtectionDomain;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.aries.proxy.InvocationListener;
+import org.apache.aries.proxy.UnableToProxyException;
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
+import org.apache.aries.proxy.weaving.WovenProxy;
+import org.apache.aries.util.AriesFrameworkUtil;
+import org.apache.aries.util.BundleToClassLoaderAdapter;
+import org.osgi.framework.Bundle;
+
+/** An implementation of ClassLoader that will be used to define our proxy class */
+final class ProxyClassLoader extends ClassLoader {
+  
+  /** A {@link Map} of classes we already know */
+  private final ConcurrentMap<HashSet<Class<?>>, String> classes = 
+                new ConcurrentHashMap<HashSet<Class<?>>, String>();
+  
+  public ProxyClassLoader(Bundle bundle) {
+    super(AriesFrameworkUtil.getClassLoader(bundle));
+  }
+
+  @Override
+  protected Class<?> findClass(String className) {
+    
+    if(WovenProxy.class.getName().equals(className))
+      return WovenProxy.class;
+    else if (InvocationListener.class.getName().equals(className))
+      return InvocationListener.class;
+    else 
+      return null;
+  }
+
+  public Class<?> createProxyClass(HashSet<Class<?>> createSet) throws UnableToProxyException {
+    
+    String className = classes.get(createSet);
+    
+    if(className != null) {
+      try {
+        return Class.forName(className, false, this);
+      } catch (ClassNotFoundException cnfe) {
+        //This is odd, but we should be able to recreate the class, continue
+        classes.remove(createSet);
+      }
+    }
+    
+    className = "Proxy" + AbstractWovenProxyAdapter.getSanitizedUUIDString();
+    
+    InterfaceCombiningClassAdapter icca = new InterfaceCombiningClassAdapter(
+        className, this, createSet);
+    
+    //Use the protection domain of the first interface in the set
+    try {
+      byte[] bytes = icca.generateBytes();
+      ProtectionDomain pd = createSet.iterator().next().getProtectionDomain();
+      Class<?> c = defineClass(className, bytes, 0, bytes.length, pd);
+      String old = classes.putIfAbsent(createSet, className);
+      if(old != null) {
+        c = Class.forName(className, false, this);
+      }
+      return c;
+    } catch (ClassFormatError cfe) {
+      throw new UnableToProxyException(createSet.iterator().next(), cfe);
+    } catch (ClassNotFoundException e) {
+      throw new UnableToProxyException(createSet.iterator().next(), e);
+    }
+  }
+}
\ No newline at end of file

Added: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java?rev=1132917&view=auto
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java (added)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java Tue Jun  7 08:56:04 2011
@@ -0,0 +1,243 @@
+/*
+ * 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.aries.proxy.impl.weaving;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.aries.proxy.FinalModifierException;
+import org.apache.aries.proxy.UnableToProxyException;
+import org.apache.aries.proxy.impl.NLS;
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
+import org.apache.aries.proxy.impl.common.TypeMethod;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.EmptyVisitor;
+import org.objectweb.asm.commons.Method;
+
+/**
+ * This class is used to copy methods from a super-class into a sub-class, but
+ * then delegate up to the super-class implementation. We expect to be called
+ * with {@link ClassReader#SKIP_CODE}. This class is used when we can't weave
+ * all the way up the Class hierarchy and need to override methods on the first
+ * subclass we can weave.
+ */
+final class MethodCopyingClassAdapter extends EmptyVisitor implements Opcodes {
+  /** The sub-class visitor to write to */
+  private final ClassVisitor cv;
+  /** The super-class to copy from */
+  private final Class<?> superToCopy;
+  /** Is the sub-class in the same package as the super */
+  private final boolean samePackage;
+  /** The ASM {@link Type} of the sub-class */
+  private final Type overridingClassType;
+  /** 
+   * The Set of {@link Method}s that exist in the sub-class. This set must be
+   * live so modifications will be reflected in the parent and prevent clashes 
+   */
+  private final Set<Method> knownMethods;
+  /**
+   * The map of field names to methods being added
+   */
+  private final Map<String, TypeMethod> transformedMethods;
+  
+  public MethodCopyingClassAdapter(ClassVisitor cv, Class<?> superToCopy,
+      Type overridingClassType, Set<Method> knownMethods, 
+      Map<String, TypeMethod> transformedMethods) {
+    this.cv = cv;
+    this.superToCopy = superToCopy;
+    this.overridingClassType = overridingClassType;
+    this.knownMethods = knownMethods;
+    this.transformedMethods = transformedMethods;
+    
+    String overridingClassName = overridingClassType.getClassName();
+    int lastIndex1 = superToCopy.getName().lastIndexOf('.');
+    int lastIndex2 = overridingClassName.lastIndexOf('.');
+    
+    samePackage = (lastIndex1 == lastIndex2) &&
+       superToCopy.getName().substring(0, (lastIndex1 == -1)? 1 : lastIndex1)
+       .equals(overridingClassName.substring(0, (lastIndex2 == -1)? 1 : lastIndex2));
+  }
+  
+  @Override
+  public final MethodVisitor visitMethod(final int access, String name, String desc,
+      String sig, String[] exceptions) {
+    
+    MethodVisitor mv = null;
+    //As in WovenProxyAdapter, we only care about "real" methods.
+    if (!!!name.equals("<init>") && !!!name.equals("<clinit>")
+        && (access & (ACC_STATIC | ACC_PRIVATE | ACC_SYNTHETIC | ACC_ABSTRACT
+            | ACC_NATIVE | ACC_BRIDGE)) == 0) {
+
+      // identify the target method parameters and return type
+      Method currentTransformMethod = new Method(name, desc);
+      // We don't want to duplicate a method we already overrode! 
+      if(!!!knownMethods.add(currentTransformMethod))
+        return null;
+      
+      // found a method we should weave
+      // We can't override a final method
+      if((access & ACC_FINAL) != 0)
+        throw new RuntimeException(new FinalModifierException(
+            superToCopy, name));
+      // We can't call up to a package protected method if we aren't in the same
+      // package
+      if((access & (ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE)) == 0) {
+        if(!!!samePackage)
+          throw new RuntimeException(NLS.MESSAGES.getMessage("method.from.superclass.is.hidden", name, superToCopy.getName(), overridingClassType.getClassName()),
+                                     new UnableToProxyException(superToCopy));
+      }
+      //Safe to copy a call to this method!
+      Type superType = Type.getType(superToCopy);
+      
+      // identify the target method parameters and return type
+      String methodStaticFieldName = "methodField" + AbstractWovenProxyAdapter.getSanitizedUUIDString();
+      transformedMethods.put(methodStaticFieldName, new TypeMethod(
+          superType, currentTransformMethod));  
+      
+      //Remember we need to copy the fake method *and* weave it, use a 
+      //WovenProxyMethodAdapter as well as a CopyingMethodAdapter
+      mv = new CopyingMethodAdapter(new WovenProxyMethodAdapter(cv.visitMethod(
+          access, name, desc, sig, exceptions), access, name, desc, exceptions,
+          methodStaticFieldName, currentTransformMethod, overridingClassType),
+          superType, currentTransformMethod);
+    }
+    
+    return mv;
+  }
+  
+  /**
+   * This class is used to prevent any method body being copied, instead replacing
+   * the body with a call to the super-types implementation. The original annotations
+   * attributes etc are all copied.
+   */
+  private static final class CopyingMethodAdapter extends EmptyVisitor {
+    /** The visitor to delegate to */
+    private final MethodVisitor mv;
+    /** The type that declares this method (not the one that will override it) */
+    private final Type superType;
+    /** The method we are weaving */
+    private final Method currentTransformMethod;
+    
+    public CopyingMethodAdapter(MethodVisitor mv, Type superType, 
+        Method currentTransformMethod) {
+      this.mv = mv;
+      this.superType = superType;
+      this.currentTransformMethod = currentTransformMethod;
+    }
+
+    @Override
+    public final AnnotationVisitor visitAnnotation(String arg0, boolean arg1) {
+      return mv.visitAnnotation(arg0, arg1);
+    }
+
+    @Override
+    public final AnnotationVisitor visitAnnotationDefault() {
+      return mv.visitAnnotationDefault();
+    }
+
+    @Override
+    public final AnnotationVisitor visitParameterAnnotation(int arg0, String arg1,
+        boolean arg2) {
+      return mv.visitParameterAnnotation(arg0, arg1, arg2);
+    }
+    
+    @Override
+    public final void visitAttribute(Attribute attr) {
+      mv.visitAttribute(attr);
+    }
+
+    /**
+     * We skip code for speed when processing super-classes, this means we
+     * need to manually drive some methods here!
+     */
+    @Override
+    public final void visitEnd() {
+      mv.visitCode();
+      writeBody();
+      mv.visitMaxs(currentTransformMethod.getArgumentTypes().length + 1, 0);
+      mv.visitEnd();
+    }
+    
+    /**
+     * This method loads this, any args, then invokes the super version of this
+     */
+    private final void writeBody() {
+      mv.visitVarInsn(ALOAD, 0);
+      
+      int nargs = currentTransformMethod.getArgumentTypes().length;
+      
+      for(int i = 1 ; i <= nargs ; i++) {
+        switch(currentTransformMethod.
+               getArgumentTypes()[i - 1].getSort()) {
+          case (Type.BOOLEAN) :
+          case (Type.BYTE) :
+          case (Type.CHAR) :
+          case (Type.SHORT) :
+          case (Type.INT) :
+            mv.visitVarInsn(ILOAD, i);
+            break;
+          case (Type.FLOAT) :
+            mv.visitVarInsn(FLOAD, i);
+            break;
+          case (Type.DOUBLE) :
+            mv.visitVarInsn(DLOAD, i);
+            break;
+          case (Type.LONG) :
+            mv.visitVarInsn(LLOAD, i);
+            break;
+          default :
+            mv.visitVarInsn(ALOAD, i);
+        }
+      }
+      
+      mv.visitMethodInsn(INVOKESPECIAL, superType.getInternalName(),
+          currentTransformMethod.getName(), currentTransformMethod.getDescriptor());
+      
+      switch(currentTransformMethod.getReturnType().getSort()) {
+        case (Type.BOOLEAN) :
+        case (Type.BYTE) :
+        case (Type.CHAR) :
+        case (Type.SHORT) :
+        case (Type.INT) :
+          mv.visitInsn(IRETURN);
+          break;
+        case (Type.VOID) :
+          mv.visitInsn(RETURN);
+          break;
+        case (Type.FLOAT) :
+          mv.visitInsn(FRETURN);
+          break;
+        case (Type.DOUBLE) :
+          mv.visitInsn(DRETURN);
+          break;
+        case (Type.LONG) :
+          mv.visitInsn(LRETURN);
+          break;
+        default :
+          mv.visitInsn(ARETURN);
+      }
+    }
+  }
+}
\ No newline at end of file

Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyAdapter.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyAdapter.java?rev=1132917&r1=1132916&r2=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyAdapter.java Tue Jun  7 08:56:04 2011
@@ -18,6 +18,11 @@
  */
 package org.apache.aries.proxy.impl.weaving;
 
+import java.io.IOException;
+
+import org.apache.aries.proxy.impl.NLS;
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
+import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Type;
@@ -50,4 +55,22 @@ public final class WovenProxyAdapter ext
   protected final Type getDeclaringTypeForCurrentMethod() {
     return typeBeingWoven;
   }
+
+  @Override
+  public void visitEnd() {
+    //first we need to override all the methods that were on non-object parents
+    for(Class<?> c : nonObjectSupers) {
+      try {
+        readClass(c, new MethodCopyingClassAdapter(cv, 
+            c, typeBeingWoven, getKnownMethods(), transformedMethods));
+      } catch (IOException e) {
+        // This should never happen! <= famous last words (not)
+        throw new RuntimeException(NLS.MESSAGES.getMessage("unexpected.error.processing.class", c.getName(), typeBeingWoven.getClassName()), e);
+      }
+    }
+    //Now run the normal visitEnd
+    super.visitEnd();
+  }
+  
+  
 }
\ No newline at end of file

Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java?rev=1132917&r1=1132916&r2=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java Tue Jun  7 08:56:04 2011
@@ -22,12 +22,12 @@ import static org.objectweb.asm.Opcodes.
 import static org.objectweb.asm.Opcodes.ACC_ENUM;
 import static org.objectweb.asm.Opcodes.ACC_INTERFACE;
 
-import java.math.BigDecimal;
 
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
+import org.apache.aries.proxy.impl.common.OSGiFriendlyClassWriter;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.commons.SerialVersionUIDAdder;
 
 /**
@@ -35,9 +35,6 @@ import org.objectweb.asm.commons.SerialV
  */
 public final class WovenProxyGenerator
 {
-  public static final int JAVA_CLASS_VERSION = new BigDecimal(System.getProperty("java.class.version")).intValue();
-  public static final boolean IS_AT_LEAST_JAVA_6 = JAVA_CLASS_VERSION >= Opcodes.V1_6;
-    
   public static final byte[] getWovenProxy(byte[] original, String className, ClassLoader loader){
     ClassReader cReader = new ClassReader(original);
     //Don't weave interfaces, enums or annotations
@@ -46,7 +43,7 @@ public final class WovenProxyGenerator
     
     //If we are Java 1.6 + compiled then we need to compute stack frames, otherwise
     //maxs are fine (and faster)
-    ClassWriter cWriter = new OSGiFriendlyClassWriter(cReader, IS_AT_LEAST_JAVA_6 ? 
+    ClassWriter cWriter = new OSGiFriendlyClassWriter(cReader, AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? 
             ClassWriter.COMPUTE_FRAMES : ClassWriter.COMPUTE_MAXS, loader);
     ClassVisitor weavingAdapter = new WovenProxyAdapter(cWriter, className, loader);
     
@@ -54,7 +51,7 @@ public final class WovenProxyGenerator
     weavingAdapter = new SerialVersionUIDAdder(weavingAdapter);
     
     // If we are Java 1.6 + then we need to skip frames as they will be recomputed
-    cReader.accept(weavingAdapter, IS_AT_LEAST_JAVA_6 ? ClassReader.SKIP_FRAMES : 0);
+    cReader.accept(weavingAdapter, AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? ClassReader.SKIP_FRAMES : 0);
     
     return cWriter.toByteArray();
   }

Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyMethodAdapter.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyMethodAdapter.java?rev=1132917&r1=1132916&r2=1132917&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyMethodAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyMethodAdapter.java Tue Jun  7 08:56:04 2011
@@ -18,11 +18,12 @@
  */
 package org.apache.aries.proxy.impl.weaving;
 
-import static org.apache.aries.proxy.impl.weaving.AbstractWovenProxyAdapter.DISPATCHER_FIELD;
-import static org.apache.aries.proxy.impl.weaving.AbstractWovenProxyAdapter.DISPATCHER_TYPE;
-import static org.apache.aries.proxy.impl.weaving.AbstractWovenProxyAdapter.OBJECT_TYPE;
-import static org.apache.aries.proxy.impl.weaving.WovenProxyGenerator.IS_AT_LEAST_JAVA_6;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.DISPATCHER_FIELD;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.DISPATCHER_TYPE;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.OBJECT_TYPE;
+import static org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6;
 
+import org.apache.aries.proxy.impl.common.AbstractWovenProxyMethodAdapter;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Type;

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=1132917&r1=1132916&r2=1132917&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 Tue Jun  7 08:56:04 2011
@@ -29,12 +29,17 @@ import java.io.Closeable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Hashtable;
 import java.util.Map;
 import java.util.concurrent.Callable;
 
 import org.apache.aries.blueprint.proxy.AbstractProxyTest.TestListener;
-import org.apache.aries.proxy.impl.weaving.InterfaceCombiningClassAdapter;
+import org.apache.aries.mocks.BundleMock;
+import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
+import org.apache.aries.unittest.mocks.Skeleton;
+import org.junit.Before;
 import org.junit.Test;
+import org.osgi.framework.Bundle;
 
 public class InterfaceProxyingTest {
 
@@ -57,12 +62,20 @@ public class InterfaceProxyingTest {
     }
   }
   
+  private Bundle testBundle;
+  
+  @Before
+  public void setup() {
+    testBundle = Skeleton.newMock(new BundleMock("test", 
+        new Hashtable<Object, Object>()), Bundle.class);
+  }
+  
   @Test
   public void testGetProxyInstance1() throws Exception{
     
     Collection<Class<?>> classes = new ArrayList<Class<?>>(Arrays.asList(Closeable.class));
     
-    Object o = InterfaceCombiningClassAdapter.getProxyInstance(classes, 
+    Object o = InterfaceProxyGenerator.getProxyInstance(testBundle, classes, 
         new Callable<Object>() {
 
           @Override
@@ -80,7 +93,7 @@ public class InterfaceProxyingTest {
     Collection<Class<?>> classes = new ArrayList<Class<?>>(Arrays.asList(Closeable.class,
         Iterable.class, Map.class));
     
-    Object o = InterfaceCombiningClassAdapter.getProxyInstance(classes, 
+    Object o = InterfaceProxyGenerator.getProxyInstance(testBundle, classes, 
         new Callable<Object>() {
 
           @Override
@@ -105,7 +118,8 @@ public class InterfaceProxyingTest {
     TestListener tl = new TestListener();
     TestCallable tc = new TestCallable();
     
-    Callable o = (Callable) InterfaceCombiningClassAdapter.getProxyInstance(classes, tc, tl);
+    Callable o = (Callable) InterfaceProxyGenerator.getProxyInstance(testBundle, 
+        classes, tc, tl);
     
     assertCalled(tl, false, false, false);
     
@@ -161,7 +175,7 @@ public class InterfaceProxyingTest {
   public void testCaching() throws Exception {
     Collection<Class<?>> classes = new ArrayList<Class<?>>(Arrays.asList(Closeable.class));
     
-    Object o1 = InterfaceCombiningClassAdapter.getProxyInstance(classes, 
+    Object o1 = InterfaceProxyGenerator.getProxyInstance(testBundle, classes, 
         new Callable<Object>() {
 
           @Override
@@ -170,7 +184,7 @@ public class InterfaceProxyingTest {
           }
     }, null);
     
-    Object o2 = InterfaceCombiningClassAdapter.getProxyInstance(classes, 
+    Object o2 = InterfaceProxyGenerator.getProxyInstance(testBundle, classes, 
         new Callable<Object>() {
 
           @Override
@@ -189,7 +203,7 @@ public class InterfaceProxyingTest {
     final TestCallable tc = new TestCallable();
     tc.setReturn(5);
     
-    Object o = InterfaceCombiningClassAdapter.getProxyInstance(classes, 
+    Object o = InterfaceProxyGenerator.getProxyInstance(testBundle, classes, 
         new Callable<Object>() {
 
           @Override

Added: aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/util/AriesFrameworkUtil.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/util/AriesFrameworkUtil.java?rev=1132917&view=auto
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/util/AriesFrameworkUtil.java (added)
+++ aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/util/AriesFrameworkUtil.java Tue Jun  7 08:56:04 2011
@@ -0,0 +1,36 @@
+/*
+ * 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.aries.util;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * A fake class for testing
+ */
+public final class AriesFrameworkUtil 
+{
+  
+  /**
+   * Mock Classloader for testing
+   */
+  public static ClassLoader getClassLoader(Bundle b) 
+  {
+    return AriesFrameworkUtil.class.getClassLoader();
+  }
+}