[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