You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jg...@apache.org on 2010/08/06 02:00:18 UTC
svn commit: r982836 - in
/openejb/branches/openejb-3.1.x/container/openejb-core/src:
main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java
test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java
Author: jgallimore
Date: Fri Aug 6 00:00:17 2010
New Revision: 982836
URL: http://svn.apache.org/viewvc?rev=982836&view=rev
Log:
Copied LocalBean proxy changes from trunk. OPENEJB-1321, OPENEJB-1323
Modified:
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java
openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java
Modified: openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java?rev=982836&r1=982835&r2=982836&view=diff
==============================================================================
--- openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java (original)
+++ openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java Fri Aug 6 00:00:17 2010
@@ -16,14 +16,17 @@
*/
package org.apache.openejb.util.proxy;
-import org.apache.xbean.asm.*;
-
-import java.lang.reflect.Method;
import java.lang.reflect.Field;
-import java.net.URLClassLoader;
+import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import org.apache.xbean.asm.ClassWriter;
+import org.apache.xbean.asm.FieldVisitor;
+import org.apache.xbean.asm.Label;
+import org.apache.xbean.asm.MethodVisitor;
+import org.apache.xbean.asm.Opcodes;
+import org.apache.xbean.asm.Type;
public class LocalBeanProxyGeneratorImpl implements LocalBeanProxyGenerator, Opcodes {
@@ -62,7 +65,7 @@ public class LocalBeanProxyGeneratorImpl
try {
byte[] proxyBytes = generateProxy(clsToProxy, clsName);
- return (Class<?>) unsafe.defineClass(proxyName, proxyBytes, 0, proxyBytes.length, cl, this.getClass().getProtectionDomain());
+ return (Class<?>) unsafe.defineClass(proxyName, proxyBytes, 0, proxyBytes.length, clsToProxy.getClassLoader(), clsToProxy.getProtectionDomain());
} catch (ProxyGenerationException e) {
throw new InternalError(e.toString());
}
@@ -523,10 +526,16 @@ public class LocalBeanProxyGeneratorImpl
}
} else {
if (! parameterType.isPrimitive()) {
- if (wrap) {
- return "L" + parameterType.getCanonicalName().replaceAll("\\.", "/") + ";";
+ String clsName = parameterType.getCanonicalName();
+
+ if (parameterType.isMemberClass()) {
+ int lastDot = clsName.lastIndexOf(".");
+ clsName = clsName.substring(0, lastDot) + "$" + clsName.substring(lastDot + 1);
+ }
+ if (wrap) {
+ return "L" + clsName.replaceAll("\\.", "/") + ";";
} else {
- return parameterType.getCanonicalName().replaceAll("\\.", "/");
+ return clsName.replaceAll("\\.", "/");
}
} else {
return getPrimitiveLetter(parameterType);
Modified: openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java?rev=982836&r1=982835&r2=982836&view=diff
==============================================================================
--- openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java (original)
+++ openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java Fri Aug 6 00:00:17 2010
@@ -23,7 +23,6 @@ import org.junit.Test;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
-import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -33,8 +32,8 @@ public class LocalBeanProxyGeneratorImpl
public class Call {
private String methodName;
private Class<?>[] parameterTypes;
-
- public String getMethodName() {
+
+ public String getMethodName() {
return methodName;
}
@@ -51,14 +50,33 @@ public class LocalBeanProxyGeneratorImpl
}
public Call() {
- super();
}
- public Call(String methodName, Class<?>[] parameterTypes) {
+ public Call(String methodName, Class<?>... parameterTypes) {
this.parameterTypes = parameterTypes;
this.methodName = methodName;
}
- }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Call call = (Call) o;
+
+ if (!methodName.equals(call.methodName)) return false;
+ if (!Arrays.equals(parameterTypes, call.parameterTypes)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = methodName.hashCode();
+ result = 31 * result + Arrays.hashCode(parameterTypes);
+ return result;
+ }
+ }
private class TestInvocationHandler implements InvocationHandler {
@@ -835,4 +853,61 @@ public class LocalBeanProxyGeneratorImpl
assertEquals("java/lang/Integer", proxyGenerator.getCastType(Integer.class));
assertEquals("org/apache/openejb/util/proxy/ProxyTestObject", proxyGenerator.getCastType(ProxyTestObject.class));
}
+
+
+ @Test
+ public void testEnumParam() throws Exception {
+ TestInvocationHandler invocationHandler = new TestInvocationHandler(new EnumParams());
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+
+ Class cls = new LocalBeanProxyGeneratorImpl().createProxy(EnumParams.class, cl);
+ EnumParams proxy = (EnumParams) cls.getConstructor(new Class[] { InvocationHandler.class }).newInstance(invocationHandler);
+
+ proxy.someStringMethod(Color.GREEN.name());
+ proxy.someEnumMethod(Color.RED);
+ proxy.someInnerClassMethod(new Name(Color.BLUE.name()));
+
+ Call[] calls = invocationHandler.getCalls();
+
+ assertEquals(3, calls.length);
+
+ assertEquals(new Call("someStringMethod", String.class), calls[0]);
+ assertEquals(new Call("someEnumMethod", Color.class), calls[1]);
+ assertEquals(new Call("someInnerClassMethod", Name.class), calls[2]);
+ }
+
+ public void testGetEnumType() throws Exception {
+ System.out.println(Color.class.getCanonicalName());
+ LocalBeanProxyGeneratorImpl localBeanProxyGenerator = new LocalBeanProxyGeneratorImpl();
+ assertEquals("Lorg/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest$Color;", localBeanProxyGenerator.getAsmTypeAsString(Color.class, true));
+ }
+
+
+ public static class EnumParams {
+
+ public void someEnumMethod(Color s){
+ }
+
+ public void someStringMethod(String s){
+ }
+
+ public void someInnerClassMethod(Name s){
+ }
+ }
+
+ public static enum Color {
+ RED, GREEN, BLUE;
+ }
+
+ public static class Name {
+ private final String name;
+
+ public Name(String name) {
+ this.name = name;
+ }
+
+ public String get() {
+ return name;
+ }
+ }
}