User: patriot1burke
Date: 01/08/07 11:06:43
Modified: src/main/org/jboss/ejb TxEntityMap.java EntityContainer.java
Application.java
Added: src/main/org/jboss/ejb GlobalTxEntityMap.java
Log:
- moved EntitySynchronizationInterceptor.storeEntity to EntityContainer
- moved synchronizeEntitiesWithinTransaction to EntityContainer and
made it a static method. Also made this method call EntityContainer.storeEntity
- renamed ApplicationTxEntityMap to GlobalTxEntityMap
The GlobalTxEntityMap holds all entities for all types contained within a transaction
so that find and remove can synch with the database.
Revision Changes Path
1.5 +10 -6 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.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TxEntityMap.java 2001/08/06 16:26:27 1.4
+++ TxEntityMap.java 2001/08/07 18:06:42 1.5
@@ -13,13 +13,14 @@
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
+ * This class provides a way to find out what entities of a certain type that are
contained in
+ * within a transaction. It is attached to a specific instance of a container.
+ * This class interfaces with the static GlobalTxEntityMap.
EntitySynchronizationInterceptor
+ * registers tx/entity pairs through this class.
* Used in EntitySynchronizationInterceptor.
*
* @author <a href="[EMAIL PROTECTED]">Bill Burke</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
*
* Revisions:
*
@@ -27,7 +28,7 @@
* <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
+ * <li>This class now interacts with GlobalTxEntityMap available.
* </ol>
*/
public class TxEntityMap
@@ -47,7 +48,7 @@
m_map.put(tx, entityMap);
tx.registerSynchronization(new TxEntityMapCleanup(this, tx));
}
- entity.getContainer().getApplication().getTxEntityMap().associate(tx, entity);
+ EntityContainer.getGlobalTxEntityMap().associate(tx, entity);
entityMap.put(entity.getCacheKey(), entity);
}
@@ -58,6 +59,9 @@
return (EntityEnterpriseContext)entityMap.get(key);
}
+ /**
+ * Cleanup tx/entity map on tx commit/rollback
+ */
private class TxEntityMapCleanup implements Synchronization
{
TxEntityMap map;
1.51 +94 -12 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.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- EntityContainer.java 2001/08/06 16:26:27 1.50
+++ EntityContainer.java 2001/08/07 18:06:42 1.51
@@ -27,6 +27,7 @@
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
+import javax.transaction.Transaction;
import org.jboss.logging.Logger;
import org.jboss.monitor.StatisticsProvider;
@@ -46,7 +47,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.50 $
+ * @version $Revision: 1.51 $
*
* <p><b>Revisions:</b>
*
@@ -58,6 +59,11 @@
* <ul>
* <li>- Added statistics gathering
* </ul>
+ * <p><b>20010807 bill burke:</b>
+ * <ul>
+ * <li> Moved storeEntity from EntitySynchronization to here so other classes can
use it.
+ * <li> Moved synchronizeEntitiesWithinTransaction to here from Application as a
static method.
+ * </ul>
*/
public class EntityContainer
extends Container
@@ -109,6 +115,48 @@
protected long createCount = 0;
protected long removeCount = 0;
+ /**
+ * Optional isModified method used by storeEntity
+ */
+ protected Method isModified;
+
+ /**
+ * This provides a way to find the entities that are part of a given
+ * transaction EntitySynchronizationInterceptor and InstanceSynchronization
+ * manage this instance.
+ */
+ protected static GlobalTxEntityMap globalTxEntityMap = new GlobalTxEntityMap();
+
+
+ public static GlobalTxEntityMap getGlobalTxEntityMap() { return
globalTxEntityMap; }
+
+ /**
+ * 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
+ */
+ public static void synchronizeEntitiesWithinTransaction(Transaction tx) throws
RemoteException
+ {
+ // If there is no transaction, there is nothing to synchronize.
+ try
+ {
+ if(tx != null)
+ {
+ EntityEnterpriseContext[] entities = globalTxEntityMap.getEntities(tx);
+ for (int i = 0; i < entities.length; i++)
+ {
+ EntityEnterpriseContext ctx = entities[i];
+ EntityContainer container = (EntityContainer)ctx.getContainer();
+ container.storeEntity(ctx);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new RemoteException("synchronizeEntitiesWithTransaction failed");
+ }
+ }
+
// Public --------------------------------------------------------
public void setContainerInvoker(ContainerInvoker ci)
@@ -270,6 +318,15 @@
in = in.getNext();
}
+ try
+ {
+ isModified = getBeanClass().getMethod("isModified", new Class[0]);
+ if (!isModified.getReturnType().equals(Boolean.TYPE))
+ isModified = null; // Has to have "boolean" as return type!
+ }
+ catch (NoSuchMethodException ignored) {}
+
+
// Reset classloader
Thread.currentThread().setContextClassLoader(oldCl);
}
@@ -394,7 +451,7 @@
{
// 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());
+ synchronizeEntitiesWithinTransaction(mi.getTransaction());
// Get the persistence manager to do the dirty work
getPersistenceManager().removeEntity((EntityEnterpriseContext)mi.getEnterpriseContext());
@@ -481,11 +538,11 @@
public Object findLocal(MethodInvocation mi)
throws Exception
{
- /**
- * As per the spec 9.6.4, entities must be synchronized with the
datastore
- * when an ejbFind<METHOD> is called.
- */
-
getApplication().synchronizeEntitiesWithinTransaction(mi.getTransaction());
+ /**
+ * As per the spec 9.6.4, entities must be synchronized with the datastore
+ * when an ejbFind<METHOD> is called.
+ */
+ synchronizeEntitiesWithinTransaction(mi.getTransaction());
// Multi-finder?
if (!mi.getMethod().getReturnType().equals(getLocalClass()))
@@ -533,11 +590,11 @@
*/
public Object find(MethodInvocation mi) throws Exception
{
- /**
- * As per the spec 9.6.4, entities must be synchronized with the
datastore
- * when an ejbFind<METHOD> is called.
- */
-
getApplication().synchronizeEntitiesWithinTransaction(mi.getTransaction());
+ /**
+ * As per the spec 9.6.4, entities must be synchronized with the datastore
+ * when an ejbFind<METHOD> is called.
+ */
+ synchronizeEntitiesWithinTransaction(mi.getTransaction());
// Multi-finder?
if (!mi.getMethod().getReturnType().equals(getRemoteClass()))
@@ -577,6 +634,31 @@
}
}
+
+ /**
+ * store entity
+ */
+ public void storeEntity(EntityEnterpriseContext ctx) throws Exception
+ {
+ if (ctx.getId() != null)
+ {
+ boolean dirty = true;
+ // Check isModified bean method flag
+ if (isModified != null)
+ {
+ Object[] args = {};
+ Boolean modified = (Boolean) isModified.invoke(ctx.getInstance(), args);
+ dirty = modified.booleanValue();
+ }
+
+ // Store entity
+ if (dirty)
+ {
+ getPersistenceManager().storeEntity(ctx);
+ }
+ }
+ }
+
/**
* This method takes care of the wiring of the "EJBObject" trio
* (target, context, proxy). It delegates to the persistence manager.
1.16 +1 -42 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.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- Application.java 2001/08/06 16:26:28 1.15
+++ Application.java 2001/08/07 18:06:42 1.16
@@ -14,7 +14,6 @@
import java.util.Hashtable;
import javax.ejb.EJBLocalHome;
-import javax.transaction.Transaction;
import org.jboss.util.Service;
@@ -25,13 +24,8 @@
* @see Container
* @see ContainerFactory
* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a>
- * @version $Revision: 1.15 $
+ * @version $Revision: 1.16 $
*
- * <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
@@ -53,13 +47,6 @@
// url where this application was deployed from
URL url;
- /**
- * This provides a way to find the entities that are part of a given
- * transaction EntitySynchronizationInterceptor and InstanceSynchronization
- * manage this instance.
- */
- private ApplicationTxEntityMap txEntityMap = new ApplicationTxEntityMap();
-
// Static --------------------------------------------------------
// Public --------------------------------------------------------
@@ -200,34 +187,6 @@
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 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
- */
- public void synchronizeEntitiesWithinTransaction(Transaction tx) throws
RemoteException {
- // 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 ----------------------------------------
/**
1.1 jboss/src/main/org/jboss/ejb/GlobalTxEntityMap.java
Index: GlobalTxEntityMap.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 GlobalTxEntityMap
{
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 GlobalTxEntityMapCleanup(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[entityList.size()]);
}
/**
* Cleanup tx/entity map on tx commit/rollback
*/
private class GlobalTxEntityMapCleanup implements Synchronization
{
GlobalTxEntityMap map;
Transaction tx;
public GlobalTxEntityMapCleanup(GlobalTxEntityMap 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