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;
     }
  }
  
  
  

Reply via email to