User: salborini
Date: 00/11/13 10:57:20
Modified: src/main/org/jboss/ejb/plugins SessionObjectInputStream.java
SessionObjectOutputStream.java
StatefulSessionFilePersistenceManager.java
Added: src/main/org/jboss/ejb/plugins StatefulSessionBeanField.java
Log:
Fixed the passivation of stateful session beans. The whole instance is now
serialized.
Revision Changes Path
1.2 +44 -7
jboss/src/main/org/jboss/ejb/plugins/SessionObjectInputStream.java
Index: SessionObjectInputStream.java
===================================================================
RCS file:
/products/cvs/ejboss/jboss/src/main/org/jboss/ejb/plugins/SessionObjectInputStream.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SessionObjectInputStream.java 2000/05/19 08:26:41 1.1
+++ SessionObjectInputStream.java 2000/11/13 18:57:19 1.2
@@ -11,6 +11,7 @@
import java.io.OutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.io.ObjectStreamClass;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
@@ -32,6 +33,8 @@
import javax.ejb.DuplicateKeyException;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
+import javax.naming.Context;
+import javax.transaction.UserTransaction;
import org.jboss.ejb.Container;
import org.jboss.ejb.EntityContainer;
@@ -39,16 +42,18 @@
import org.jboss.ejb.StatefulSessionEnterpriseContext;
/**
- * <description>
+ * The SessionObjectInputStream is used to deserialize stateful session beans when
they are activated
*
- * @see <related>
+ * @see org.jboss.ejb.plugins.SessionObjectOutputStream
* @author Rickard �berg ([EMAIL PROTECTED])
- * @version $Revision: 1.1 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sebastien Alborini</a>
+ * @version $Revision: 1.2 $
*/
class SessionObjectInputStream
extends ObjectInputStream
{
StatefulSessionEnterpriseContext ctx;
+ ClassLoader appCl;
// Constructors -------------------------------------------------
public SessionObjectInputStream(StatefulSessionEnterpriseContext ctx,
InputStream in)
@@ -58,18 +63,50 @@
enableResolveObject(true);
this.ctx = ctx;
+
+ // cache the application classloader
+ appCl = Thread.currentThread().getContextClassLoader();
}
// ObjectInputStream overrides -----------------------------------
protected Object resolveObject(Object obj)
throws IOException
{
+ // section 6.4.1 of the ejb1.1 specification states what must be taken care
of
+
+ // ejb reference (remote interface) : resolve handle to EJB
if (obj instanceof Handle)
- return ((Handle)obj).getEJBObject(); // Resolve handle to EJB
+ return ((Handle)obj).getEJBObject();
+
+ // ejb reference (home interface) : resolve handle to EJB Home
else if (obj instanceof HomeHandle)
- return ((HomeHandle)obj).getEJBHome(); // Resolve handle to EJB Home
- else if (obj instanceof SessionContext)
- return ctx.getSessionContext(); // Resolve session context of this instance
+ return ((HomeHandle)obj).getEJBHome();
+
+ // naming context: the jnp implementation of contexts is serializable, do
nothing
+
+ else if (obj instanceof StatefulSessionBeanField) {
+ byte type = ((StatefulSessionBeanField)obj).type;
+
+ // session context: recreate it
+ if (type == StatefulSessionBeanField.SESSION_CONTEXT)
+ return ctx.getSessionContext();
+
+ // user transaction: restore it
+ else if (type == StatefulSessionBeanField.USER_TRANSACTION)
+ return ctx.getSessionContext().getUserTransaction();
+ }
return obj;
}
+
+ protected Class resolveClass(ObjectStreamClass v) throws IOException,
ClassNotFoundException {
+ try {
+ // use the application classloader to resolve the class
+ return appCl.loadClass(v.getName());
+
+ } catch (ClassNotFoundException e) {
+ // we should probably never get here
+ return super.resolveClass(v);
+ }
+ }
+
}
1.2 +23 -4
jboss/src/main/org/jboss/ejb/plugins/SessionObjectOutputStream.java
Index: SessionObjectOutputStream.java
===================================================================
RCS file:
/products/cvs/ejboss/jboss/src/main/org/jboss/ejb/plugins/SessionObjectOutputStream.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SessionObjectOutputStream.java 2000/05/19 08:26:41 1.1
+++ SessionObjectOutputStream.java 2000/11/13 18:57:19 1.2
@@ -31,6 +31,9 @@
import javax.ejb.DuplicateKeyException;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
+import javax.ejb.SessionContext;
+import javax.naming.Context;
+import javax.transaction.UserTransaction;
import org.jboss.ejb.Container;
import org.jboss.ejb.EntityContainer;
@@ -38,11 +41,12 @@
import org.jboss.ejb.EntityEnterpriseContext;
/**
- * <description>
+ * The SessionObjectOutputStream is used to serialize stateful session beans when
they are passivated
*
- * @see <related>
+ * @see org.jboss.ejb.plugins.SessionObjectInputStream
* @author Rickard �berg ([EMAIL PROTECTED])
- * @version $Revision: 1.1 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sebastien Alborini</a>
+ * @version $Revision: 1.2 $
*/
class SessionObjectOutputStream
extends ObjectOutputStream
@@ -59,11 +63,26 @@
protected Object replaceObject(Object obj)
throws IOException
{
+ // section 6.4.1 of the ejb1.1 specification states what must be taken care
of
+
+ // ejb reference (remote interface) : store handle
if (obj instanceof EJBObject)
return ((EJBObject)obj).getHandle();
+
+ // ejb reference (home interface) : store handle
else if (obj instanceof EJBHome)
return ((EJBHome)obj).getHomeHandle();
-
+
+ // session context : store a typed dummy object
+ else if (obj instanceof SessionContext)
+ return new
StatefulSessionBeanField(StatefulSessionBeanField.SESSION_CONTEXT);
+
+ // naming context : the jnp implementation is serializable, do nothing
+
+ // user transaction : store a typed dummy object
+ else if (obj instanceof UserTransaction)
+ return new
StatefulSessionBeanField(StatefulSessionBeanField.USER_TRANSACTION);
+
return obj;
}
}
1.14 +9 -13
jboss/src/main/org/jboss/ejb/plugins/StatefulSessionFilePersistenceManager.java
Index: StatefulSessionFilePersistenceManager.java
===================================================================
RCS file:
/products/cvs/ejboss/jboss/src/main/org/jboss/ejb/plugins/StatefulSessionFilePersistenceManager.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- StatefulSessionFilePersistenceManager.java 2000/11/09 19:49:56 1.13
+++ StatefulSessionFilePersistenceManager.java 2000/11/13 18:57:19 1.14
@@ -62,7 +62,8 @@
* @see <related>
* @author Rickard �berg ([EMAIL PROTECTED])
* @author <a href="[EMAIL PROTECTED]">Marc Fleury</a>
- * @version $Revision: 1.13 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sebastien Alborini</a>
+ * @version $Revision: 1.14 $
*/
public class StatefulSessionFilePersistenceManager
implements StatefulSessionPersistenceManager
@@ -209,15 +210,16 @@
{
try
{
-
ObjectInputStream in;
// Load state
in = new SessionObjectInputStream(ctx, new FileInputStream(new File(dir,
ctx.getId()+".ser")));
- for (int i = 0; i < fields.size(); i++)
- ((Field)fields.get(i)).set(ctx.getInstance(), in.readObject());
-
+
+ ctx.setInstance(in.readObject());
+
+ in.close();
+
// Call bean
ejbActivate.invoke(ctx.getInstance(), new Object[0]);
} catch (ClassNotFoundException e)
@@ -266,16 +268,10 @@
// Store state
ObjectOutputStream out = new SessionObjectOutputStream(new
FileOutputStream(new File(dir, ctx.getId()+".ser")));
- for (int i = 0; i < fields.size(); i++) {
-
- // skip the sessionContext, we can't read the value (inner class, no
constructor available)
- // (it will be restored by the SessionObjectInputStream upon activation)
- if (!
SessionContext.class.isAssignableFrom(((Field)fields.get(i)).getType()))
-
- out.writeObject(((Field)fields.get(i)).get(ctx.getInstance()));
- }
+ out.writeObject(ctx.getInstance());
out.close();
+
} catch (IOException e)
{
throw new ServerException("Could not passivate", e);
1.1
jboss/src/main/org/jboss/ejb/plugins/StatefulSessionBeanField.java
Index: StatefulSessionBeanField.java
===================================================================
/*
* jBoss, the OpenSource EJB server
*
* Distributable under GPL license.
* See terms of license at gnu.org.
*/
package org.jboss.ejb.plugins;
import java.io.Serializable;
/**
* A helper class for serializing stateful session beans.
*
* Instances of this class are used to replace the non-serializable fields of
StatefulSessionBean
* during serialization (passivation) and deserialization (activation)
* Section 6.4.1 of the ejb1.1 specification states when this can happen.
*
* @see org.jboss.ejb.plugins.SessionObjectOutputStream,
org.jboss.ejb.plugins.SessionObjectInputStream
* @author <a href="mailto:[EMAIL PROTECTED]">Sebastien Alborini</a>
* @version $Revision: 1.1 $
*/
class StatefulSessionBeanField implements java.io.Serializable {
static final byte SESSION_CONTEXT = 0;
static final byte USER_TRANSACTION = 1;
byte type;
StatefulSessionBeanField(byte type) {
this.type = type;
}
}