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);