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.getEnterpriseContext());
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