[jboss-cvs] JBossAS SVN: r69177 - in projects/aop/trunk/aop/src: test/org/jboss/test/aop/proxy and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Jan 21 12:45:59 EST 2008
Author: kabir.khan at jboss.com
Date: 2008-01-21 12:45:59 -0500 (Mon, 21 Jan 2008)
New Revision: 69177
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ClassProxyContainer.java
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyCacheKey.java
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledContainerProxy.java
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java
projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyOutOfVmTestCase.java
projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyTest.java
Log:
[JBAOP-467] Make sure a proxy that has been serialized from ouutside the JVM survives a further serialization and deserialization
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ClassProxyContainer.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ClassProxyContainer.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ClassProxyContainer.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -21,8 +21,6 @@
*/
package org.jboss.aop.proxy.container;
-import gnu.trove.TLongObjectHashMap;
-
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyCacheKey.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyCacheKey.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyCacheKey.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -28,6 +28,7 @@
import java.util.Comparator;
import org.jboss.metadata.spi.MetaData;
+import org.jboss.util.id.GUID;
/**
*
@@ -48,6 +49,7 @@
private AOPProxyFactoryMixin[] addedMixins = EMPTY_MIXIN_ARRAY;
private int hashcode = 0;
+ private GUID guid = MarshalledContainerProxy.GUID;
public ContainerProxyCacheKey(String managerFqn, Class clazz)
{
@@ -87,7 +89,12 @@
{
return managerFqn;
}
-
+
+ protected GUID getGuid()
+ {
+ return guid;
+ }
+
public boolean equals(Object obj)
{
if (this == obj)
@@ -122,6 +129,10 @@
{
return false;
}
+ if(!guid.equals(other.guid))
+ {
+ return false;
+ }
return true;
}
@@ -243,6 +254,7 @@
private void writeObject(java.io.ObjectOutputStream out) throws IOException
{
out.writeUTF(managerFqn);
+ out.writeObject(guid);
out.writeObject(clazzRef.get());
Class[] ifs = new Class[addedInterfaces.length];
for (int i = 0 ; i < addedInterfaces.length ; i++)
@@ -258,6 +270,7 @@
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
{
managerFqn = in.readUTF();
+ guid = (GUID)in.readObject();
clazzRef = new WeakReference<Class>((Class)in.readObject());
Class[] ifs = (Class[])in.readObject();
addedInterfaces = new WeakReference[ifs.length];
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -74,7 +74,7 @@
public static final String PROXY_NAME_PREFIX = "AOPContainerProxy$";
private static Object maplock = new Object();
- private static WeakHashMap proxyCache = new WeakHashMap();
+ private static WeakHashMap<Class, Map<ContainerProxyCacheKey, Class>> proxyCache = new WeakHashMap<Class, Map<ContainerProxyCacheKey, Class>>();
private static volatile int counter = 0;
private static CtMethod setDelegateMethod;
@@ -125,15 +125,15 @@
Class proxyClass = null;
synchronized (maplock)
{
- Map map = (Map)proxyCache.get(clazz);
+ Map<ContainerProxyCacheKey, Class> map = proxyCache.get(clazz);
if (map == null)
{
- map = new HashMap();
+ map = new HashMap<ContainerProxyCacheKey, Class>();
proxyCache.put(clazz, map);
}
else
{
- proxyClass = (Class) map.get(key);
+ proxyClass = map.get(key);
}
if (proxyClass == null)
@@ -330,7 +330,6 @@
" this.key," +
" this.mixins," +
" this.delegate," +
- " this.classAdvisor.getClazz()," +
" this.currentAdvisor," +
" this.metadata);" +
"}";
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledContainerProxy.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledContainerProxy.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledContainerProxy.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -53,8 +53,7 @@
private static final long serialVersionUID = 1L;
//Fields to check if we are unmarshalling in the same JVM
- private final static GUID GUID = new GUID();
- private GUID guid = GUID;
+ public final static GUID GUID = new GUID();
//Fields from the proxy, used when unmarshalling in the same JVM
private String proxyClassName;
@@ -74,13 +73,13 @@
//The interceptor chains for each method used when unmarshalling in a different JVM
MarshalledInterceptors marshalledInterceptors;
- public MarshalledContainerProxy(Class proxyClass, ContainerProxyCacheKey key, Object[] mixins, Object delegate, Class clazz, Advisor currentAdvisor, SimpleMetaData metadata)
+ public MarshalledContainerProxy(Class proxyClass, ContainerProxyCacheKey key, Object[] mixins, Object delegate, Advisor currentAdvisor, SimpleMetaData metadata)
{
this.proxyClassName = proxyClass.getName();
this.key = key;
this.mixins = mixins;
this.delegate = delegate;
- this.clazz = clazz;
+ this.clazz = currentAdvisor.getClazz();
if (currentAdvisor instanceof InstanceProxyContainer)
{
@@ -149,9 +148,9 @@
}
MarshalledProxyAdvisor advisor = marshalledInterceptors.getMarshalledAdvisor();
+ advisor.setClazz(clazz);
- //TODO Make this take into consideration, the super class
- boolean objectAsSuper = false;
+ boolean objectAsSuper = key.getClazz().equals(Object.class);
Class proxyClass = ContainerProxyFactory.getProxyClass(objectAsSuper, key, advisor, this);
Delegate proxy = (Delegate)proxyClass.newInstance();
@@ -161,7 +160,7 @@
private boolean isLocal()
{
- return guid.equals(GUID);
+ return key.getGuid().equals(GUID);
}
public ContainerProxyCacheKey getKey()
@@ -204,7 +203,7 @@
return targetInterfaces;
}
- private static class MarshalledInterceptors implements Serializable
+ private class MarshalledInterceptors implements Serializable
{
private static final long serialVersionUID = 1L;
transient Advisor currentAdvisor;
@@ -232,7 +231,7 @@
ObjectOutputStream test = new ObjectOutputStream(new ByteArrayOutputStream());
try
{
- MethodInfo[] methodInfos = ((ClassProxyContainer)currentAdvisor).getMethodInfos();
+ MethodInfo[] methodInfos = getMethodInfos();
MarshalledMethodInfo[] marshalledInfos = new MarshalledMethodInfo[methodInfos.length];
for (int i = 0 ; i < methodInfos.length ; i++)
@@ -267,6 +266,15 @@
}
}
+ private MethodInfo[] getMethodInfos()
+ {
+ if (currentAdvisor instanceof MarshalledProxyAdvisor)
+ {
+ return ((MarshalledProxyAdvisor)currentAdvisor).getMethodInfos();
+ }
+ return ((ClassProxyContainer)currentAdvisor).getMethodInfos();
+ }
+
private String getExceptionExpression(MethodInfo info)
{
Method m = info.getMethod();
@@ -340,7 +348,7 @@
throw new MethodHashingException(e);
}
interceptors = info.getInterceptors();
- clazz = info.getClazz();
+ clazz = info.getMethod().getDeclaringClass();
}
public MethodInfo getMethodInfo(Advisor advisor)
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -50,6 +50,11 @@
super(name, manager);
}
+ public void setClazz(Class clazz)
+ {
+ super.clazz = clazz;
+ }
+
public void addMethodInfo(MethodInfo info)
{
methodInfos.put(info.getHash(), info);
@@ -84,6 +89,14 @@
MethodInfo info = (MethodInfo)methodInfos.get(hash);
return info;
}
+
+ public MethodInfo[] getMethodInfos()
+ {
+ Object[] vals = methodInfos.getValues();
+ MethodInfo[] infos = new MethodInfo[vals.length];
+ System.arraycopy(vals, 0, infos, 0, vals.length);
+ return infos;
+ }
public void appendInterceptor(Interceptor interceptor)
{
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -148,7 +148,6 @@
this.key,
this.mixins,
this.delegate,
- this.classAdvisor.getClazz(),
this.currentAdvisor,
this.metadata);
}
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyOutOfVmTestCase.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyOutOfVmTestCase.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyOutOfVmTestCase.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -23,10 +23,6 @@
import java.io.File;
import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
import java.io.Reader;
import java.util.Properties;
import java.util.StringTokenizer;
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyTest.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyTest.java 2008-01-21 15:38:47 UTC (rev 69176)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/proxy/SerializeContainerProxyTest.java 2008-01-21 17:45:59 UTC (rev 69177)
@@ -24,6 +24,7 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
+import java.rmi.MarshalledObject;
import junit.framework.TestCase;
@@ -41,27 +42,33 @@
super(name);
}
+ private SomeInterface getProxy() throws Exception
+ {
+ File proxyFile = createProxyFile();
+
+ ObjectInputStream in = new ObjectInputStream(new FileInputStream(proxyFile));
+ Object o = in.readObject();
+ assertNotNull(o);
+ SomeInterface si = (SomeInterface)o;
+ return si;
+ }
+
public void testContainerProxy() throws Exception
{
try
{
- File proxyFile = createProxyFile();
+ SomeInterface si = getProxy();
- ObjectInputStream in = new ObjectInputStream(new FileInputStream(proxyFile));
- Object o = in.readObject();
- assertNotNull(o);
- SomeInterface si = (SomeInterface)o;
-
TestInterceptor.invoked = false;
TestAspect.invoked = false;
si.helloWorld();
assertTrue(TestInterceptor.invoked);
assertFalse(TestAspect.invoked);
- OtherMixinInterface omi = (OtherMixinInterface)o;
+ OtherMixinInterface omi = (OtherMixinInterface)si;
omi.other();
- OtherMixinInterface2 omi2 = (OtherMixinInterface2)o;
+ OtherMixinInterface2 omi2 = (OtherMixinInterface2)si;
int i = omi2.other2();
assertEquals(20, i);
@@ -79,5 +86,43 @@
}
}
+ public void testReserializeProxy() throws Exception
+ {
+ try
+ {
+ SomeInterface si = getProxy();
+
+ MarshalledObject mo = new MarshalledObject(si);
+ Object o = mo.get();
+ assertNotNull(o);
+ SomeInterface rsi = (SomeInterface)o;
+
+ TestInterceptor.invoked = false;
+ TestAspect.invoked = false;
+ rsi.helloWorld();
+ assertTrue(TestInterceptor.invoked);
+ assertFalse(TestAspect.invoked);
+
+ OtherMixinInterface omi = (OtherMixinInterface)si;
+ omi.other();
+
+ OtherMixinInterface2 omi2 = (OtherMixinInterface2)si;
+ int i = omi2.other2();
+ assertEquals(20, i);
+
+ System.out.println("--- ENABLE CHECKS OF ASPECTS IN SERIALIZECONTAINERPROXYTEST AND OUTOFPROCESSPROXYSERIALIZER");
+// TestInterceptor.invoked = false;
+// TestAspect.invoked = false;
+ rsi.otherWorld();
+// assertFalse(TestInterceptor.invoked);
+// assertTrue(TestAspect.invoked);
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
protected abstract File createProxyFile() throws Exception;
}
More information about the jboss-cvs-commits
mailing list