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