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();
+ }
+}