[jboss-cvs] JBossAS SVN: r59289 - in branches/Branch_4_0: server/src/main/org/jboss/invocation/pooled/interfaces testsuite/src/main/org/jboss/test/scoped testsuite/src/main/org/jboss/test/scoped/interfaces/dto testsuite/src/main/org/jboss/test/scoped/test

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Jan 2 16:33:41 EST 2007


Author: tom.elrod at jboss.com
Date: 2007-01-02 16:33:38 -0500 (Tue, 02 Jan 2007)
New Revision: 59289

Added:
   branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/readme.txt
Modified:
   branches/Branch_4_0/server/src/main/org/jboss/invocation/pooled/interfaces/OptimizedObjectInputStream.java
   branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/interfaces/dto/SimpleResponseDTO.java
   branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedBUnitTestCase.java
   branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedUnitTestCase.java
Log:
JBAS-3198 - fix for pooled invoker scoped deployments class caching.

Modified: branches/Branch_4_0/server/src/main/org/jboss/invocation/pooled/interfaces/OptimizedObjectInputStream.java
===================================================================
--- branches/Branch_4_0/server/src/main/org/jboss/invocation/pooled/interfaces/OptimizedObjectInputStream.java	2007-01-02 20:55:29 UTC (rev 59288)
+++ branches/Branch_4_0/server/src/main/org/jboss/invocation/pooled/interfaces/OptimizedObjectInputStream.java	2007-01-02 21:33:38 UTC (rev 59289)
@@ -109,7 +109,10 @@
     	 }
 
          WeakReference ref = (WeakReference) subCache.get(className);
-         if (ref != null) clazz = (Class) ref.get();
+         if (ref != null)
+         {
+            clazz = (Class) ref.get();
+         }
          if (clazz == null)
          {
             if (ref != null) subCache.remove(className);

Modified: branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/interfaces/dto/SimpleResponseDTO.java
===================================================================
--- branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/interfaces/dto/SimpleResponseDTO.java	2007-01-02 20:55:29 UTC (rev 59288)
+++ branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/interfaces/dto/SimpleResponseDTO.java	2007-01-02 21:33:38 UTC (rev 59289)
@@ -5,7 +5,7 @@
 
 public class SimpleResponseDTO implements Serializable
 {
-   private static final long serialVersionUID = 2L;
+   private static final long serialVersionUID = 1L;
 //   private static final long serialVersionUID = new Random().nextLong();
 
    private String firstName;

Added: branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/readme.txt
===================================================================
--- branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/readme.txt	2007-01-02 20:55:29 UTC (rev 59288)
+++ branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/readme.txt	2007-01-02 21:33:38 UTC (rev 59289)
@@ -0,0 +1,15 @@
+This test is for JBAS-3198.  The bug that is being tested for is when using two scoped ejb deployments and
+the pooled invoker, the OptimizedObjectInputStream was caching the class definitions when loaded in a static
+cache without regard to which classloader the class was originally loaded from.  Therefore, if ejbA made a call
+and loaded class Foo (with serialVersionUID = 1L) and then ejbB tried to load class Foo (which would have
+a serialVerionUID = 2L), the first Foo class loaded (i.e. serialVersionUID = 1L) would be retreived from the
+cache and used instead of loading the correct class.
+
+For the tests themselves, have created two ejb deployments, A and B, which are both scoped deployments.
+Both return SimpleResponseDTO.  The test clients (ScopedUnitTestCase and ScopedBUnitTestCase) use
+javassist to create a new copy of the SimpleResponseDTO class (one with serialiVersionUID = 1L and the other
+with serialVersionUID = 2L) that gets included its ejb deployment and on local classpath (for the client).
+
+To properly test, have to run both ScopedUnitTestCase and then ScopedBUnitTestCase (or vise versa) against
+same running instance of JBoss server (i.e. running one, then re-booting JBossAS and running the other does
+not test for this bug fix).
\ No newline at end of file

Modified: branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedBUnitTestCase.java
===================================================================
--- branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedBUnitTestCase.java	2007-01-02 20:55:29 UTC (rev 59288)
+++ branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedBUnitTestCase.java	2007-01-02 21:33:38 UTC (rev 59289)
@@ -1,22 +1,22 @@
 package org.jboss.test.scoped.test;
 
-import org.jboss.test.JBossTestCase;
-import org.jboss.test.scoped.interfaces.a.SessionAHome;
-import org.jboss.test.scoped.interfaces.a.SessionA;
-import org.jboss.test.scoped.interfaces.dto.SimpleRequestDTO;
-import org.jboss.test.scoped.interfaces.dto.SimpleResponseDTO;
-import org.jboss.test.scoped.interfaces.b.SessionBHome;
-import org.jboss.test.scoped.interfaces.b.SessionB;
-import org.jboss.deployment.EARDeployerMBean;
-
-import java.io.File;
-
 import javassist.ClassPool;
 import javassist.CtClass;
 import javassist.CtField;
+import javassist.CtMethod;
+import javassist.CtNewMethod;
 import javassist.Modifier;
+import org.jboss.deployment.EARDeployerMBean;
+import org.jboss.test.JBossTestCase;
+import org.jboss.test.scoped.interfaces.b.SessionB;
+import org.jboss.test.scoped.interfaces.b.SessionBHome;
+import org.jboss.test.scoped.interfaces.dto.SimpleRequestDTO;
 
 import javax.management.Attribute;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 
 /**
  * @author <a href="mailto:tom at jboss.org">Tom Elrod</a>
@@ -30,35 +30,68 @@
 
    public void testScoped() throws Exception
    {
-      isolateDeployments(Boolean.TRUE);
+//      isolateDeployments(Boolean.TRUE);
 
       // scoped deployment B
 
       // have to create response classes with different serialVersionUID for each deployment
       String jbosstestDeployDir = System.getProperty("jbosstest.deploy.dir");
       System.out.println("jbosstestDeployDir = " + jbosstestDeployDir);
-      String deployADir = "/scopedA.ear/scopedB.jar";
-      File libDir = new File(jbosstestDeployDir, deployADir);
+      String deployBDir = "/scopedB.ear/scopedB.jar";
+      File libDir = new File(jbosstestDeployDir, deployBDir);
       System.out.println("libDir = " + libDir.getAbsolutePath());
       // Create a SimpleResponseDTO class with a static serialVersionUID of 1L
       //ClassPool defaultPool = ClassPool.getDefault();
       ClassPool classes1Pool = ClassPool.getDefault();
       //ClassPool classes1Pool = new ClassPool(defaultPool);
       CtClass info = classes1Pool.makeClass("org.jboss.test.scoped.interfaces.dto.SimpleResponseDTO");
+      info.addInterface(classes1Pool.get("java.io.Serializable"));
       CtClass s = classes1Pool.get("java.lang.String");
       CtField firstName = new CtField(s, "firstName", info);
-      firstName.setModifiers(Modifier.PUBLIC);
+      firstName.setModifiers(Modifier.PRIVATE);
+      info.addField(firstName);
+      CtMethod getFirstName = CtNewMethod.getter("getFirstName", firstName);
+      getFirstName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(getFirstName);
+      CtMethod setFirstName = CtNewMethod.setter("setFirstName", firstName);
+      setFirstName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(setFirstName);
       CtClass s2 = classes1Pool.get("java.lang.String");
       CtField lastName = new CtField(s2, "lastName", info);
-      lastName.setModifiers(Modifier.PUBLIC);
-      CtClass s3 = classes1Pool.get("java.lang.Long");
-      CtField serialVersion = new CtField(s3, "serialVersionUID", info);
-      serialVersion.setModifiers(Modifier.PUBLIC | Modifier.STATIC);
+      lastName.setModifiers(Modifier.PRIVATE);
+      info.addField(lastName);
+      CtMethod getLastName = CtNewMethod.getter("getLastName", lastName);
+      getLastName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(getLastName);
+      CtMethod setLastName = CtNewMethod.setter("setLastName", lastName);
+      setLastName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(setLastName);
+      //CtClass s3 = classes1Pool.get("java.lang.Long");
+      //CtField serialVersion = new CtField(s3, "serialVersionUID", info);
+      CtField serialVersion = new CtField(CtClass.longType, "serialVersionUID", info);
+      serialVersion.setModifiers(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL);
       long serialVerionUID = 2L;
       info.addField(serialVersion, CtField.Initializer.constant(serialVerionUID));
 
       info.writeFile(libDir.getAbsolutePath());
 
+
+      String classesBDir = "/classes";
+      File rootDeployDir = new File(jbosstestDeployDir);
+      String rootDeployDirPath = rootDeployDir.getParent();
+      File classesDir = new File(rootDeployDirPath, classesBDir);
+      System.out.println("classesDir = " + classesDir.getAbsolutePath());
+
+//      info.writeFile(classesDir.getAbsolutePath());
+
+      // copy the generated file in deploy to the classes directory
+      SimpleRequestDTO tmpFile = new SimpleRequestDTO();
+      String classPath = tmpFile.getClass().getResource("SimpleResponseDTO.class").getPath();
+      File fileSrc = new File(libDir.getAbsolutePath() + "/org/jboss/test/scoped/interfaces/dto/SimpleResponseDTO.class");
+      File fileDest = new File(classPath);
+      copyFiles(fileSrc, fileDest);
+
+
       try
       {
 //         deploy("scopedA.ear");
@@ -97,6 +130,20 @@
       }
    }
 
+   private void copyFiles(File fileSrc, File fileDest) throws IOException
+   {
+      FileInputStream fis = new FileInputStream(fileSrc);
+      FileOutputStream fos = new FileOutputStream(fileDest);
+      byte[] buf = new byte[1024];
+      int i = 0;
+      while ((i = fis.read(buf)) != -1)
+      {
+         fos.write(buf, 0, i);
+      }
+      fis.close();
+      fos.close();
+   }
+
    private void doTest() throws Exception
    {
 //      Properties env = new Properties();
@@ -111,12 +158,14 @@
       SessionB session = home.create();
 
 
-         SimpleRequestDTO requestDTO = new SimpleRequestDTO();
-         requestDTO.setFirstName("Daffy");
-         requestDTO.setLastName("Duck");
-         SimpleResponseDTO result = session.runSimpleTest(requestDTO);
+      SimpleRequestDTO requestDTO = new SimpleRequestDTO();
+      requestDTO.setFirstName("Daffy");
+      requestDTO.setLastName("Duck");
+      //SimpleResponseDTO result = session.runSimpleTest(requestDTO);
+      Object result = session.runSimpleTest(requestDTO);
 
-         System.out.println(result.getFirstName() + " " + result.getLastName());
+      System.out.println("result was " + result);
+      //System.out.println(result.getFirstName() + " " + result.getLastName());
 
    }
 

Modified: branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedUnitTestCase.java
===================================================================
--- branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedUnitTestCase.java	2007-01-02 20:55:29 UTC (rev 59288)
+++ branches/Branch_4_0/testsuite/src/main/org/jboss/test/scoped/test/ScopedUnitTestCase.java	2007-01-02 21:33:38 UTC (rev 59289)
@@ -32,6 +32,9 @@
 
 import javax.management.Attribute;
 import java.io.File;
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 
 import java.net.URL;
 import java.lang.reflect.Field;
@@ -49,6 +52,8 @@
 import javassist.CtClass;
 import javassist.CtField;
 import javassist.Modifier;
+import javassist.CtMethod;
+import javassist.CtNewMethod;
 
 
 /**
@@ -63,7 +68,7 @@
 
    public void testScoped() throws Exception
    {
-      isolateDeployments(Boolean.TRUE);
+//      isolateDeployments(Boolean.TRUE);
 
       // scoped deployment A
 
@@ -78,20 +83,51 @@
       ClassPool classes1Pool = ClassPool.getDefault();
       //ClassPool classes1Pool = new ClassPool(defaultPool);
       CtClass info = classes1Pool.makeClass("org.jboss.test.scoped.interfaces.dto.SimpleResponseDTO");
+      info.addInterface(classes1Pool.get("java.io.Serializable"));
       CtClass s = classes1Pool.get("java.lang.String");
       CtField firstName = new CtField(s, "firstName", info);
-      firstName.setModifiers(Modifier.PUBLIC);
+      firstName.setModifiers(Modifier.PRIVATE);
+      info.addField(firstName);
+      CtMethod getFirstName = CtNewMethod.getter("getFirstName", firstName);
+      getFirstName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(getFirstName);
+      CtMethod setFirstName = CtNewMethod.setter("setFirstName", firstName);
+      setFirstName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(setFirstName);
       CtClass s2 = classes1Pool.get("java.lang.String");
       CtField lastName = new CtField(s2, "lastName", info);
-      lastName.setModifiers(Modifier.PUBLIC);
-      CtClass s3 = classes1Pool.get("java.lang.Long");
-      CtField serialVersion = new CtField(s3, "serialVersionUID", info);
-      serialVersion.setModifiers(Modifier.PUBLIC | Modifier.STATIC);
+      lastName.setModifiers(Modifier.PRIVATE);
+      info.addField(lastName);
+      CtMethod getLastName = CtNewMethod.getter("getLastName", lastName);
+      getLastName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(getLastName);
+      CtMethod setLastName = CtNewMethod.setter("setLastName", lastName);
+      setLastName.setModifiers(Modifier.PUBLIC);
+      info.addMethod(setLastName);
+      //CtClass s3 = classes1Pool.get("java.lang.Long");
+      CtField serialVersion = new CtField(CtClass.longType, "serialVersionUID", info);
+      serialVersion.setModifiers(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL);
       long serialVerionUID = 1L;
       info.addField(serialVersion, CtField.Initializer.constant(serialVerionUID));
 
       info.writeFile(libDir.getAbsolutePath());
 
+      String classesBDir = "/classes";
+      File rootDeployDir = new File(jbosstestDeployDir);
+      String rootDeployDirPath = rootDeployDir.getParent();
+      File classesDir = new File(rootDeployDirPath, classesBDir);
+      System.out.println("classesDir = " + classesDir.getAbsolutePath());
+
+//      info.writeFile(classesDir.getAbsolutePath());
+
+      // copy the generated file in deploy to the classes directory
+      SimpleRequestDTO tmpFile = new SimpleRequestDTO();
+      String classPath = tmpFile.getClass().getResource("SimpleResponseDTO.class").getPath();
+      File fileSrc = new File(libDir.getAbsolutePath() + "/org/jboss/test/scoped/interfaces/dto/SimpleResponseDTO.class");
+      File fileDest = new File(classPath);
+      copyFiles(fileSrc, fileDest);
+
+
       try
       {
          deploy("scopedA.ear");
@@ -126,10 +162,25 @@
       }
       finally
       {
-         isolateDeployments(Boolean.FALSE);
+//         isolateDeployments(Boolean.FALSE);
       }
    }
 
+   private void copyFiles(File fileSrc, File fileDest) throws IOException
+   {
+      FileInputStream fis = new FileInputStream(fileSrc);
+      FileOutputStream fos = new FileOutputStream(fileDest);
+      byte[] buf = new byte[1024];
+      int i = 0;
+      while ((i = fis.read(buf)) != -1)
+      {
+         fos.write(buf, 0, i);
+      }
+      fis.close();
+      fos.close();
+   }
+
+
    private void doTest() throws Exception
    {
 //      Properties env = new Properties();




More information about the jboss-cvs-commits mailing list