[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