User: oberg   
  Date: 00/05/19 01:26:41

  Added:       src/main/org/jboss/ejb/plugins
                        NoPassivationStatefulSessionInstanceCache.java
                        SessionObjectInputStream.java
                        SessionObjectOutputStream.java
  Log:
  Added session streams and session cache manager
  
  Revision  Changes    Path
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/NoPassivationStatefulSessionInstanceCache.java
  
  Index: NoPassivationStatefulSessionInstanceCache.java
  ===================================================================
  /*
   * jBoss, the OpenSource EJB server
   *
   * Distributable under GPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.ejb.plugins;
  
  import java.rmi.RemoteException;
  import java.rmi.ServerException;
  import java.util.Map;
  import java.util.HashMap;
  import java.util.Stack;
  import java.util.Collections;
  
  import javax.transaction.SystemException;
  
  import org.jboss.ejb.Container;
  import org.jboss.ejb.StatefulSessionContainer;
  import org.jboss.ejb.InstanceCache;
  import org.jboss.ejb.InstancePool;
  import org.jboss.ejb.StatefulSessionPersistenceManager;
  import org.jboss.ejb.EnterpriseContext;
  import org.jboss.ejb.StatefulSessionEnterpriseContext;
  
  import org.jboss.ejb.deployment.jBossSession;
  
  /**
   *    <description> 
   *      
   *    @see <related>
   *    @author Rickard �berg ([EMAIL PROTECTED])
   *    @version $Revision: 1.1 $
   */
  public class NoPassivationStatefulSessionInstanceCache
     implements InstanceCache
  {
     // Constants -----------------------------------------------------
      
     // Attributes ----------------------------------------------------
     Container con;
     
     Map active = Collections.synchronizedMap(new HashMap());
  
     // Static --------------------------------------------------------
     
     // Constructors --------------------------------------------------
     
     // Public --------------------------------------------------------
  
     /**
      *   Set the callback to the container. This is for initialization.
      *   The IM may extract the configuration from the container.
      *
      * @param   c  
      */
     public void setContainer(Container c)
     {
        this.con = c;
     }
     
     public void init()
        throws Exception
     {
     }
     
     public void start()
        throws Exception
     {
     }
     
     public void stop()
     {
     }
  
     public void destroy()
     {
     }
     
     public synchronized EnterpriseContext get(Object id)
        throws RemoteException
     {
        // TODO: minimize synchronization of IM
        
        StatefulSessionEnterpriseContext ctx;
        InstanceInfo info = null;
        while ((ctx = (StatefulSessionEnterpriseContext)active.get(id)) != null)
        {
           synchronized(ctx)
           {
              info = (InstanceInfo)ctx.getCacheContext();
              if (info.isLocked())
                 throw new RemoteException("Concurrent call to stateful session is not 
allowed");
           }
        }
        
        if (ctx == null) // Not in cache
        {
           // Get new instance from pool
           ctx = (StatefulSessionEnterpriseContext)con.getInstancePool().get();
           
           // Activate
           ctx.setId(id);
           
((StatefulSessionContainer)con).getPersistenceManager().activateSession(ctx);
           insert(ctx);
        } else
        {
           // Lock the instance
           info.lock();
        }
        
        // At this point we own the instance with the given identity
  //      System.out.println("Got entity:"+ctx.getId());
        return ctx;
     }
  
     public synchronized void insert(EnterpriseContext ctx)
     {
        InstanceInfo info = createInstanceInfo((StatefulSessionEnterpriseContext)ctx);
        ((StatefulSessionEnterpriseContext)ctx).setCacheContext(info);
        info.lock();
        active.put(ctx.getId(), ctx);
     }
     
     public void release(EnterpriseContext ctx)
     {
        // This context is now available for other threads
        synchronized(ctx)
        {
           
((InstanceInfo)((StatefulSessionEnterpriseContext)ctx).getCacheContext()).unlock();
  //         System.out.println("Release entity:"+ctx.getId());
           if 
(!((InstanceInfo)((StatefulSessionEnterpriseContext)ctx).getCacheContext()).isLocked())
              ctx.notify();
        }
     }
     
     public synchronized void remove(Object id)
     {
        Object ctx = active.remove(id);
        synchronized(ctx)
        {
           ctx.notifyAll();
        }
     }
     
     // Z implementation ----------------------------------------------
      
     // Package protected ---------------------------------------------
      
     // Protected -----------------------------------------------------
     protected InstanceInfo createInstanceInfo(StatefulSessionEnterpriseContext ctx)
     {
        return new InstanceInfo(ctx);
     }
     
     // Private -------------------------------------------------------
  
     // Inner classes -------------------------------------------------
     class InstanceInfo
     {
        int locked = 0; // 0 == unlocked, >0 == locked
        
        StatefulSessionEnterpriseContext ctx;
        
        InstanceInfo(StatefulSessionEnterpriseContext ctx)
        {
           this.ctx = ctx;
        }
        
        public void lock()
        {
           locked++;
        }
        
        public void unlock()
        {
           locked--;
        }
        
        public boolean isLocked()
        {
           return locked > 0;
        }
        
        public StatefulSessionEnterpriseContext getContext()
        {
           return ctx;
        }
     }
  }
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/SessionObjectInputStream.java
  
  Index: SessionObjectInputStream.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.File;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.FileOutputStream;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.lang.reflect.Method;
  import java.lang.reflect.Field;
  import java.lang.reflect.InvocationTargetException;
  import java.rmi.RemoteException;
  import java.rmi.ServerException;
  import java.util.Collection;
  import java.util.ArrayList;
  
  import javax.ejb.EJBObject;
  import javax.ejb.EJBHome;
  import javax.ejb.Handle;
  import javax.ejb.HomeHandle;
  import javax.ejb.EntityBean;
  import javax.ejb.SessionContext;
  import javax.ejb.CreateException;
  import javax.ejb.DuplicateKeyException;
  import javax.ejb.FinderException;
  import javax.ejb.RemoveException;
  
  import org.jboss.ejb.Container;
  import org.jboss.ejb.EntityContainer;
  import org.jboss.ejb.EntityPersistenceManager;
  import org.jboss.ejb.StatefulSessionEnterpriseContext;
  
  /**
   *    <description> 
   *      
   *    @see <related>
   *    @author Rickard �berg ([EMAIL PROTECTED])
   *    @version $Revision: 1.1 $
   */
  class SessionObjectInputStream
        extends ObjectInputStream
  {
        StatefulSessionEnterpriseContext ctx;
  
        // Constructors -------------------------------------------------
        public SessionObjectInputStream(StatefulSessionEnterpriseContext ctx, 
InputStream in)
        throws IOException
     {
        super(in);
        enableResolveObject(true);
                
                this.ctx = ctx;
     }
        
     // ObjectInputStream overrides -----------------------------------
     protected Object resolveObject(Object obj)
        throws IOException
     {
        if (obj instanceof Handle)
           return ((Handle)obj).getEJBObject(); // Resolve handle to EJB
        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 obj;
     }
  }
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/SessionObjectOutputStream.java
  
  Index: SessionObjectOutputStream.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.File;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.FileOutputStream;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.lang.reflect.Method;
  import java.lang.reflect.Field;
  import java.lang.reflect.InvocationTargetException;
  import java.rmi.RemoteException;
  import java.rmi.ServerException;
  import java.util.Collection;
  import java.util.ArrayList;
  
  import javax.ejb.EJBObject;
  import javax.ejb.EJBHome;
  import javax.ejb.Handle;
  import javax.ejb.HomeHandle;
  import javax.ejb.EntityBean;
  import javax.ejb.CreateException;
  import javax.ejb.DuplicateKeyException;
  import javax.ejb.FinderException;
  import javax.ejb.RemoveException;
  
  import org.jboss.ejb.Container;
  import org.jboss.ejb.EntityContainer;
  import org.jboss.ejb.EntityPersistenceManager;
  import org.jboss.ejb.EntityEnterpriseContext;
  
  /**
   *    <description> 
   *      
   *    @see <related>
   *    @author Rickard �berg ([EMAIL PROTECTED])
   *    @version $Revision: 1.1 $
   */
  class SessionObjectOutputStream
        extends ObjectOutputStream
  {
        // Constructors -------------------------------------------------
     public SessionObjectOutputStream(OutputStream out)
        throws IOException
     {
        super(out);
        enableReplaceObject(true);
     }
        
     // ObjectOutputStream overrides ----------------------------------
     protected Object replaceObject(Object obj)
        throws IOException
     {
        if (obj instanceof EJBObject)
           return ((EJBObject)obj).getHandle();
        else if (obj instanceof EJBHome)
              return ((EJBHome)obj).getHomeHandle();
           
        return obj;
     }
  }
  
  
  

Reply via email to