Author: timothyjward
Date: Fri Aug  2 13:27:33 2013
New Revision: 1509694

URL: http://svn.apache.org/r1509694
Log:
ARIES-1093 - Avoid errors when reinstalling the proxy component

Modified:
    
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/ProxyManagerActivator.java
    
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java
    
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java

Modified: 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/ProxyManagerActivator.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/ProxyManagerActivator.java?rev=1509694&r1=1509693&r2=1509694&view=diff
==============================================================================
--- 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/ProxyManagerActivator.java
 (original)
+++ 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/ProxyManagerActivator.java
 Fri Aug  2 13:27:33 2013
@@ -38,7 +38,7 @@ public class ProxyManagerActivator imple
     try {
       // Try load load a asm class (to make sure it's actually available
       // then create the asm factory
-      Class.forName("org.objectweb.asm.ClassVisitor");
+      Class.forName("org.objectweb.asm.ClassVisitor", false, 
ProxyManagerActivator.class.getClassLoader());
       classProxy = true;
     } catch (Throwable t) {
     }
@@ -53,7 +53,8 @@ public class ProxyManagerActivator imple
       
       try {
         //if ASM is available then we should also try weaving
-        Class<?> cls = 
Class.forName("org.apache.aries.proxy.impl.weaving.ProxyWeavingHook");
+        Class<?> cls = 
Class.forName("org.apache.aries.proxy.impl.weaving.ProxyWeavingHook",
+                       true, ProxyManagerActivator.class.getClassLoader());
         Dictionary<String,String> props = new Hashtable<String,String>();
         // SubsystemResource.java also uses this constant. 
         //   While it could be turned into a static final constant, note that 
this

Modified: 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java?rev=1509694&r1=1509693&r2=1509694&view=diff
==============================================================================
--- 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java
 (original)
+++ 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java
 Fri Aug  2 13:27:33 2013
@@ -71,8 +71,14 @@ public abstract class AbstractWovenProxy
       | ACC_SYNTHETIC;
   /** The internal name for Throwable */
   static final String THROWABLE_INAME = Type.getInternalName(Throwable.class);
-  /** A UUID for adding to our method names */
-  private static final String UU_ID = getSanitizedUUIDString();
+  /** 
+   * A static UUID for adding to our method names. 
+   * This must not change over time, otherwise uninstalling
+   * and reinstalling the proxy component with a separate
+   * API bundle will cause BIG trouble (NoSuchFieldError)
+   * with subclasses that get woven by the "new" hook
+   */
+  private static final String UU_ID = "04df3c80_2877_4f6c_99e2_5a25e11d5535";
   /** A constant for No Args methods */
   static final Type[] NO_ARGS = new Type[0];
 

Modified: 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java?rev=1509694&r1=1509693&r2=1509694&view=diff
==============================================================================
--- 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java
 (original)
+++ 
aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java
 Fri Aug  2 13:27:33 2013
@@ -43,6 +43,7 @@ public class ProxySubclassAdapter extend
 
   private static final Type STRING_TYPE = Type.getType(String.class);
   private static final Type CLASS_TYPE = Type.getType(Class.class);
+  private static final Type CLASSLOADER_TYPE = Type.getType(ClassLoader.class);
   private static final Type OBJECT_TYPE = Type.getType(Object.class);
   private static final Type METHOD_TYPE = 
Type.getType(java.lang.reflect.Method.class);
   private static final Type IH_TYPE = Type.getType(InvocationHandler.class);
@@ -618,7 +619,7 @@ public class ProxySubclassAdapter extend
      * 
      * produces bytecode for retrieving the superclass and storing in a
      * private static field: private static Class superClass = null; static{
-     * superClass = Class.forName(superclass); }
+     * superClass = Class.forName(superclass, true, 
TYPE_BEING_PROXIED.class.getClassLoader()); }
      */
 
     // add a private static field for the superclass Class
@@ -627,10 +628,15 @@ public class ProxySubclassAdapter extend
 
     // push the String arg for the Class.forName onto the stack
     staticAdapter.push(classBinaryName);
+    //push the boolean arg for the Class.forName onto the stack
+    staticAdapter.push(true);
+    //get the classloader
+    staticAdapter.push(newClassType);
+    staticAdapter.invokeVirtual(CLASS_TYPE, new Method("getClassLoader", 
CLASSLOADER_TYPE, NO_ARGS));
 
     // invoke the Class forName putting the Class on the stack
     staticAdapter.invokeStatic(CLASS_TYPE, new Method("forName", CLASS_TYPE,
-        new Type[] { STRING_TYPE }));
+        new Type[] { STRING_TYPE, Type.BOOLEAN_TYPE, CLASSLOADER_TYPE }));
 
     // put the Class in the static field
     staticAdapter.putStatic(newClassType, currentClassFieldName, CLASS_TYPE);


Reply via email to