see my TxEntityMap improvements email.

Bill

> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED]]On Behalf Of Dain
> Sundstrom
> Sent: Monday, August 06, 2001 12:41 PM
> To: [EMAIL PROTECTED]
> Subject: Re: [JBoss-dev] CVS update: jboss/src/main/org/jboss/ejb
> ApplicationTxEntityMap.java TxEntityMap.java EntityContainer.java
> Application.java
>
>
>  Bill, why this change?
>
>
> ----- Original Message -----
> From: "Bill Burke" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Monday, August 06, 2001 11:26 AM
> Subject: [JBoss-dev] CVS update: jboss/src/main/org/jboss/ejb
> ApplicationTxEntityMap.java TxEntityMap.java EntityContainer.java
> Application.java
>
>
> >   User: patriot1burke
> >   Date: 01/08/06 09:26:28
> >
> >   Modified:    src/main/org/jboss/ejb TxEntityMap.java
> EntityContainer.java
> >                         Application.java
> >   Added:       src/main/org/jboss/ejb ApplicationTxEntityMap.java
> >   Log:
> >   - put TxEntityMap back into EntityContainer
> >   - added ApplicationTxEntityMap to Application.  This class returns a
> list of entites
> >   involved with a transaction in the specific order in which they were
> accessed.
> >
> >   Revision  Changes    Path
> >   1.4       +45 -28    jboss/src/main/org/jboss/ejb/TxEntityMap.java
> >
> >   Index: TxEntityMap.java
> >   ===================================================================
> >   RCS file:
> /cvsroot/jboss/jboss/src/main/org/jboss/ejb/TxEntityMap.java,v
> >   retrieving revision 1.3
> >   retrieving revision 1.4
> >   diff -u -r1.3 -r1.4
> >   --- TxEntityMap.java 2001/08/03 17:15:43 1.3
> >   +++ TxEntityMap.java 2001/08/06 16:26:27 1.4
> >   @@ -8,6 +8,9 @@
> >
> >    import java.util.HashMap;
> >    import javax.transaction.Transaction;
> >   +import javax.transaction.RollbackException;
> >   +import javax.transaction.SystemException;
> >   +import javax.transaction.Synchronization;
> >
> >    /**
> >     * This class provides a way to find out what entities are
> contained in
> >   @@ -16,7 +19,16 @@
> >     * Used in EntitySynchronizationInterceptor.
> >     *
> >     * @author <a href="[EMAIL PROTECTED]">Bill Burke</a>
> >   - * @version $Revision: 1.3 $
> >   + * @version $Revision: 1.4 $
> >   + *
> >   + * Revisions:
> >   + *
> >   + * <p><b>Revisions:</b><br>
> >   + * <p><b>2001/08/06: marcf</b>
> >   + * <ol>
> >   + *   <li>Got rid of disassociate and added a
> javax.transaction.Synchronization.  The sync will clean up the map now.
> >   + *   <li>This class now interacts with
> ApplicationTxEntityMap available
> in Application
> >   + * </ol>
> >     */
> >    public class TxEntityMap
> >    {
> >   @@ -26,50 +38,55 @@
> >        * associate entity with transaction
> >        */
> >       public synchronized void associate(Transaction tx,
> >   -                                      EntityEnterpriseContext entity)
> >   +                                      EntityEnterpriseContext entity)
> throws RollbackException, SystemException
> >       {
> >          HashMap entityMap = (HashMap)m_map.get(tx);
> >          if (entityMap == null)
> >          {
> >             entityMap = new HashMap();
> >             m_map.put(tx, entityMap);
> >   +         tx.registerSynchronization(new
> TxEntityMapCleanup(this, tx));
> >          }
> >   +
> entity.getContainer().getApplication().getTxEntityMap().associate(tx,
> entity);
> >          entityMap.put(entity.getCacheKey(), entity);
> >       }
> >
> >   -   /**
> >   -    * Disassociate entity with transaction.  When the transaction has
> no
> >   -    * more entities.  it is removed from this class's
> internal HashMap.
> >   -    */
> >   -   public synchronized void disassociate(Transaction tx,
> >   -                                         EntityEnterpriseContext ctx)
> >   +   public synchronized EntityEnterpriseContext getCtx(Transaction tx,
> >   +                                                      CacheKey key)
> >       {
> >          HashMap entityMap = (HashMap)m_map.get(tx);
> >   -      if (entityMap == null)
> >   +      return (EntityEnterpriseContext)entityMap.get(key);
> >   +   }
> >   +
> >   +   private class TxEntityMapCleanup implements Synchronization
> >   +   {
> >   +      TxEntityMap map;
> >   +      Transaction tx;
> >   +
> >   +      public TxEntityMapCleanup(TxEntityMap map,
> >   +                                Transaction tx)
> >          {
> >   -         return;
> >   +         this.map = map;
> >   +         this.tx = tx;
> >          }
> >   -      entityMap.remove(ctx.getCacheKey());
> >   -
> >   -      // When all entities are gone, cleanup!
> >   -      // cleanup involves removing the transaction
> >   -      // from the map
> >   -      if (entityMap.size() <= 0)
> >   +
> >   +      // Synchronization implementation -----------------------------
> >   +
> >   +      public void beforeCompletion()
> >          {
> >   -         m_map.remove(tx);
> >   +         /* complete */
> >          }
> >   -   }
> >   -
> >   -   /**
> >   -    * get all EntityEnterpriseContext that are involved with a
> transaction.
> >   -    */
> >   -   public synchronized Object[] getEntities(Transaction tx)
> >   -   {
> >   -      HashMap entityMap = (HashMap)m_map.get(tx);
> >   -      if (entityMap == null) // there are no entities associated
> >   +
> >   +      public void afterCompletion(int status)
> >          {
> >   -         return new Object[0];
> >   +         synchronized(map)
> >   +         {
> >   +            HashMap entityMap = (HashMap)m_map.remove(tx);
> >   +            if (entityMap != null)
> >   +            {
> >   +               entityMap.clear();
> >   +            }
> >   +         }
> >          }
> >   -      return entityMap.values().toArray();
> >       }
> >    }
> >
> >
> >
> >   1.50      +11 -4     jboss/src/main/org/jboss/ejb/EntityContainer.java
> >
> >   Index: EntityContainer.java
> >   ===================================================================
> >   RCS file:
> /cvsroot/jboss/jboss/src/main/org/jboss/ejb/EntityContainer.java,v
> >   retrieving revision 1.49
> >   retrieving revision 1.50
> >   diff -u -r1.49 -r1.50
> >   --- EntityContainer.java 2001/08/05 19:32:19 1.49
> >   +++ EntityContainer.java 2001/08/06 16:26:27 1.50
> >   @@ -46,7 +46,7 @@
> >     * @author <a href="mailto:[EMAIL PROTECTED]";>Daniel OConnor</a>
> >     * @author <a href="[EMAIL PROTECTED]">Bill Burke</a>
> >     * @author <a href="mailto:[EMAIL PROTECTED]";>Andreas
> Schaefer</a>
> >   - * @version $Revision: 1.49 $
> >   + * @version $Revision: 1.50 $
> >     *
> >     * <p><b>Revisions:</b>
> >     *
> >   @@ -97,6 +97,8 @@
> >       /** This is the instancepool that is to be used */
> >       protected InstancePool instancePool;
> >
> >   +   protected TxEntityMap txEntityMap = new TxEntityMap();
> >   +
> >       /**
> >        * This is the first interceptor in the chain. The last
> interceptor
> must
> >        * be provided by the container itself.
> >   @@ -142,6 +144,11 @@
> >          return instancePool;
> >       }
> >
> >   +   public TxEntityMap getTxEntityMap()
> >   +   {
> >   +      return txEntityMap;
> >   +   }
> >   +
> >       public void setInstanceCache(InstanceCache ic)
> >       {
> >          if (ic == null)
> >   @@ -385,9 +392,9 @@
> >       public void remove(MethodInvocation mi)
> >          throws RemoteException, RemoveException
> >       {
> >   - // synchronize entities with the datastore before the bean
> is removed
> >   - // this will write queued updates so datastore will be consistent
> before removal
> >   -
> getApplication().synchronizeEntitiesWithinTransaction(mi.getTransa
> ction());
> >   +      // synchronize entities with the datastore before the bean is
> removed
> >   +      // this will write queued updates so datastore will be
> consistent
> before removal
> >   +
> getApplication().synchronizeEntitiesWithinTransaction(mi.getTransa
> ction());
> >
> >          // Get the persistence manager to do the dirty work
> >
> getPersistenceManager().removeEntity((EntityEnterpriseContext)mi.g
> etEnterpri
> seContext());
> >
> >
> >
> >   1.15      +123 -115  jboss/src/main/org/jboss/ejb/Application.java
> >
> >   Index: Application.java
> >   ===================================================================
> >   RCS file:
> /cvsroot/jboss/jboss/src/main/org/jboss/ejb/Application.java,v
> >   retrieving revision 1.14
> >   retrieving revision 1.15
> >   diff -u -r1.14 -r1.15
> >   --- Application.java 2001/08/05 19:32:19 1.14
> >   +++ Application.java 2001/08/06 16:26:28 1.15
> >   @@ -25,10 +25,16 @@
> >     *   @see Container
> >     *   @see ContainerFactory
> >     *   @author <a href="mailto:[EMAIL PROTECTED]";>Rickard
> Öberg</a>
> >   - *   @version $Revision: 1.14 $
> >   + *   @version $Revision: 1.15 $
> >   + *
> >   + * <p><b>Revisions:</b><br>
> >   + * <p><b>2001/08/06: dain</b>
> >   + * <ol>
> >   + *   <li>Moved synchronizeEntitiesWithinTransaction to this class.
> >   + * </ol>
> >     */
> >    public class Application
> >   - implements Service
> >   +   implements Service
> >    {
> >       // Constants -----------------------------------------------------
> >
> >   @@ -52,7 +58,7 @@
> >        * transaction EntitySynchronizationInterceptor and
> InstanceSynchronization
> >        * manage this instance.
> >        */
> >   -   private TxEntityMap txEntityMap = new TxEntityMap();
> >   +   private ApplicationTxEntityMap txEntityMap = new
> ApplicationTxEntityMap();
> >
> >       // Static --------------------------------------------------------
> >
> >   @@ -66,16 +72,16 @@
> >    */
> >       public void addContainer(Container con)
> >       {
> >   -       containers.put(con.getBeanMetaData().getEjbName(), con);
> >   -    con.setApplication(this);
> >   +      containers.put(con.getBeanMetaData().getEjbName(), con);
> >   +      con.setApplication(this);
> >       }
> >
> >
> >   - /**
> >   - * Remove a container from this application.
> >   - *
> >   - * @param   con
> >   - */
> >   +   /**
> >   +    * Remove a container from this application.
> >   +    *
> >   +    * @param   con
> >   +    */
> >       public void removeContainer(Container con)
> >       {
> >          containers.remove(con.getBeanMetaData().getEjbName());
> >   @@ -97,95 +103,95 @@
> >       }
> >
> >
> >   - /**
> >   - * Get a container from this Application that corresponds to a given
> name
> >   - *
> >   - * @param   name  ejb-name name defined in ejb-jar.xml
> >   -     *
> >   - * @return  container for the named bean, or null if the
> container was
> not found
> >   - */
> >   +   /**
> >   +    * Get a container from this Application that corresponds
> to a given
> name
> >   +    *
> >   +    * @param   name  ejb-name name defined in ejb-jar.xml
> >   +    *
> >   +    * @return  container for the named bean, or null if the container
> was not found
> >   +    */
> >       public Container getContainer(String name)
> >       {
> >          return (Container)containers.get(name);
> >       }
> >
> >
> >   - /**
> >   - * Get all containers in this Application.
> >   - *
> >   - * @return  a collection of containers for each enterprise
> bean in this
> application
> >   -     *          unit.
> >   - */
> >   +   /**
> >   +    * Get all containers in this Application.
> >   +    *
> >   +    * @return  a collection of containers for each enterprise bean in
> this application
> >   +    *          unit.
> >   +    */
> >       public Collection getContainers()
> >       {
> >          return containers.values();
> >       }
> >
> >
> >   - /**
> >   - * Get the class loader of this Application.
> >   - *
> >   - * @return
> >   - */
> >   +   /**
> >   +    * Get the class loader of this Application.
> >   +    *
> >   +    * @return
> >   +    */
> >       public ClassLoader getClassLoader()
> >       {
> >          return classLoader;
> >       }
> >
> >
> >   - /**
> >   - * Set the class loader of this Application
> >   - *
> >   - * @param   name
> >   - */
> >   +   /**
> >   +    * Set the class loader of this Application
> >   +    *
> >   +    * @param   name
> >   +    */
> >       public void setClassLoader(ClassLoader cl)
> >       {
> >          this.classLoader = cl;
> >       }
> >
> >
> >   - /**
> >   - * Get the name of this Application.
> >   - *
> >   - * @return
> >   - */
> >   +   /**
> >   +    * Get the name of this Application.
> >   +    *
> >   +    * @return
> >   +    */
> >       public String getName()
> >       {
> >          return name;
> >       }
> >
> >
> >   - /**
> >   - * Set the name of this Application
> >   - *
> >   - * @param   name
> >   - */
> >   +   /**
> >   +    * Set the name of this Application
> >   +    *
> >   +    * @param   name
> >   +    */
> >       public void setName(String name)
> >       {
> >          this.name = name;
> >       }
> >
> >
> >   - /**
> >   - * Get the URL from which this Application was deployed
> >   - *
> >   - * @return
> >   - */
> >   +   /**
> >   +    * Get the URL from which this Application was deployed
> >   +    *
> >   +    * @return
> >   +    */
> >       public URL getURL()
> >       {
> >          return url;
> >       }
> >
> >
> >   - /**
> >   - * Set the URL that was used to deploy this Application
> >   - *
> >   - * @param   url
> >   - */
> >   +   /**
> >   +    * Set the URL that was used to deploy this Application
> >   +    *
> >   +    * @param   url
> >   +    */
> >       public void setURL(URL url)
> >       {
> >   - if (url == null)
> >   - throw new IllegalArgumentException("Null URL");
> >   +      if (url == null)
> >   +         throw new IllegalArgumentException("Null URL");
> >
> >          this.url = url;
> >
> >   @@ -194,89 +200,91 @@
> >             name = url.toString();
> >       }
> >
> >   - /**
> >   - * Gets the transaction to entity map object, which contains
> a map from
> >   - * a transaction to every entity used in that transaction.
> >   - * @return the transaction to entity map for this application
> >   - */
> >   -   public TxEntityMap getTxEntityMap() {
> >   +   /**
> >   +    * Gets the transaction to entity map object, which contains a map
> from
> >   +    * a transaction to every entity used in that transaction.
> >   +    * @return the transaction to entity map for this application
> >   +    */
> >   +   public ApplicationTxEntityMap getTxEntityMap() {
> >          return txEntityMap;
> >       }
> >
> >       /**
> >        * Stores all of the entities associated with the specified
> transaction.
> >   - * @param tx the transaction that associated entites will be stored
> >   - * @throws Exception if an problem occures while storing the entities
> >   +    * @param tx the transaction that associated entites will
> be stored
> >   +    * @throws Exception if an problem occures while storing the
> entities
> >        */
> >       public void synchronizeEntitiesWithinTransaction(Transaction tx)
> throws RemoteException {
> >   - // If there is no transaction, there is nothing to synchronize.
> >   - if(tx != null) {
> >   - Object[] entities = getTxEntityMap().getEntities(tx);
> >   - for (int i = 0; i < entities.length; i++) {
> >   - EntityEnterpriseContext ctx = (EntityEnterpriseContext)entities[i];
> >   - EntityContainer container = (EntityContainer)ctx.getContainer();
> >   - container.getPersistenceManager().storeEntity(ctx);
> >   - }
> >   - }
> >   +      // If there is no transaction, there is nothing to synchronize.
> >   +      if(tx != null)
> >   +      {
> >   +         EntityEnterpriseContext[] entities =
> getTxEntityMap().getEntities(tx);
> >   +         for (int i = 0; i < entities.length; i++)
> >   +         {
> >   +            EntityEnterpriseContext ctx = entities[i];
> >   +            EntityContainer container =
> (EntityContainer)ctx.getContainer();
> >   +            container.getPersistenceManager().storeEntity(ctx);
> >   +         }
> >   +      }
> >       }
> >
> >   - // Service implementation ----------------------------------------
> >   +   // Service implementation ----------------------------------------
> >
> >        /**
> >         * Initializes all the containers of this application.
> >         *
> >         * @exception Exception
> >         */
> >   - public void init()
> >   -    throws Exception
> >   - {
> >   - Iterator enum = containers.values().iterator();
> >   - while (enum.hasNext())
> >   - {
> >   - Container con = (Container)enum.next();
> >   - con.init();
> >   - }
> >   - }
> >   -
> >   -    /**
> >   +   public void init()
> >   +      throws Exception
> >   +   {
> >   +      Iterator enum = containers.values().iterator();
> >   +      while (enum.hasNext())
> >   +      {
> >   +         Container con = (Container)enum.next();
> >   +         con.init();
> >   +      }
> >   +   }
> >   +
> >   +   /**
> >         * Starts all the containers of this application.
> >         *
> >         * @exception Exception
> >         */
> >   - public void start()
> >   -    throws Exception
> >   - {
> >   - Iterator enum = containers.values().iterator();
> >   - while (enum.hasNext())
> >   - {
> >   - Container con = (Container)enum.next();
> >   -            con.start();
> >   - }
> >   - }
> >   +   public void start()
> >   +      throws Exception
> >   +   {
> >   +      Iterator enum = containers.values().iterator();
> >   +      while (enum.hasNext())
> >   +      {
> >   +         Container con = (Container)enum.next();
> >   +         con.start();
> >   +      }
> >   +   }
> >
> >   -    /**
> >   +   /**
> >         * Stops all the containers of this application.
> >         */
> >   - public void stop()
> >   - {
> >   - Iterator enum = containers.values().iterator();
> >   - while (enum.hasNext())
> >   - {
> >   - Container con = (Container)enum.next();
> >   -            con.stop();
> >   - }
> >   - }
> >   +   public void stop()
> >   +   {
> >   +      Iterator enum = containers.values().iterator();
> >   +      while (enum.hasNext())
> >   +      {
> >   +         Container con = (Container)enum.next();
> >   +         con.stop();
> >   +      }
> >   +   }
> >
> >   -    /**
> >   +   /**
> >         * Destroys all the containers of this application.
> >         */
> >   - public void destroy()
> >   - {
> >   - Iterator enum = containers.values().iterator();
> >   - while (enum.hasNext())
> >   - {
> >   - Container con = (Container)enum.next();
> >   - con.destroy();
> >   - }
> >   - }
> >   +   public void destroy()
> >   +   {
> >   +      Iterator enum = containers.values().iterator();
> >   +      while (enum.hasNext())
> >   +      {
> >   +         Container con = (Container)enum.next();
> >   +         con.destroy();
> >   +      }
> >   +   }
> >    }
> >
> >
> >
> >   1.1
> jboss/src/main/org/jboss/ejb/ApplicationTxEntityMap.java
> >
> >   Index: ApplicationTxEntityMap.java
> >   ===================================================================
> >   /*
> >    * JBoss, the OpenSource J2EE webOS
> >    *
> >    * Distributable under LGPL license.
> >    * See terms of license at gnu.org.
> >    */
> >   package org.jboss.ejb;
> >
> >   import java.util.ArrayList;
> >   import java.util.HashMap;
> >   import javax.transaction.Transaction;
> >   import javax.transaction.RollbackException;
> >   import javax.transaction.SystemException;
> >   import javax.transaction.Synchronization;
> >
> >
> >   /**
> >    * This class provides a way to find out what entities are
> contained in
> >    * what transaction.  It is used, to find which entities to call
> ejbStore()
> >    * on when a ejbFind() method is called within a transaction. EJB 2.0-
> 9.6.4
> >    * also, it is used to synchronize on a remove.
> >    * Used in EntitySynchronizationInterceptor, EntityContainer
> >    *
> >    * Entities are stored in an ArrayList to ensure specific ordering.
> >    *
> >    * @author <a href="[EMAIL PROTECTED]">Bill Burke</a>
> >    * @version $Revision: 1.1 $
> >    */
> >   public class ApplicationTxEntityMap
> >   {
> >      protected HashMap m_map = new HashMap();
> >
> >      /**
> >       * associate entity with transaction
> >       */
> >      public synchronized void associate(Transaction tx,
> >                                         EntityEnterpriseContext entity)
> throws RollbackException, SystemException
> >      {
> >         ArrayList entityList = (ArrayList)m_map.get(tx);
> >         if (entityList == null)
> >         {
> >            entityList = new ArrayList();
> >            m_map.put(tx, entityList);
> >            tx.registerSynchronization(new
> ApplicationTxEntityMapCleanup(this, tx));
> >         }
> >         entityList.add(entity);
> >      }
> >
> >      /**
> >       * get all EntityEnterpriseContext that are involved with a
> transaction.
> >       */
> >      public synchronized EntityEnterpriseContext[]
> getEntities(Transaction
> tx)
> >      {
> >         ArrayList entityList = (ArrayList)m_map.get(tx);
> >         if (entityList == null) // there are no entities associated
> >         {
> >            return new EntityEnterpriseContext[0];
> >         }
> >         return (EntityEnterpriseContext[])entityList.toArray(new
> EntityEnterpriseContext[0]);
> >      }
> >
> >      private class ApplicationTxEntityMapCleanup implements
> Synchronization
> >      {
> >         ApplicationTxEntityMap map;
> >         Transaction tx;
> >
> >         public ApplicationTxEntityMapCleanup(ApplicationTxEntityMap map,
> >                                              Transaction tx)
> >         {
> >            this.map = map;
> >            this.tx = tx;
> >         }
> >
> >         // Synchronization implementation -----------------------------
> >
> >         public void beforeCompletion()
> >         {
> >            /* complete */
> >         }
> >
> >         public void afterCompletion(int status)
> >         {
> >            synchronized(map)
> >            {
> >               ArrayList entityList = (ArrayList)m_map.remove(tx);
> >               if (entityList != null)
> >               {
> >                  entityList.clear();
> >               }
> >            }
> >         }
> >      }
> >
> >
> >   }
> >
> >
> >
> >
> > _______________________________________________
> > Jboss-development mailing list
> > [EMAIL PROTECTED]
> > http://lists.sourceforge.net/lists/listinfo/jboss-development
> >
>
>
> _______________________________________________
> Jboss-development mailing list
> [EMAIL PROTECTED]
> http://lists.sourceforge.net/lists/listinfo/jboss-development
>



_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to