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.getTransaction());
> + // 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.getTransaction());
>
> // Get the persistence manager to do the dirty work
>
getPersistenceManager().removeEntity((EntityEnterpriseContext)mi.getEnterpri
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