User: user57  
  Date: 01/07/10 16:49:14

  Modified:    src/main/org/jboss/ejb/plugins
                        EntitySynchronizationInterceptor.java
  Log:
   o re-indent (no code change)
  
  Revision  Changes    Path
  1.40      +452 -451  
jboss/src/main/org/jboss/ejb/plugins/EntitySynchronizationInterceptor.java
  
  Index: EntitySynchronizationInterceptor.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/EntitySynchronizationInterceptor.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- EntitySynchronizationInterceptor.java     2001/07/03 23:18:11     1.39
  +++ EntitySynchronizationInterceptor.java     2001/07/10 23:49:13     1.40
  @@ -1,9 +1,9 @@
   /**
  -* JBoss, the OpenSource EJB server
  -*
  -* Distributable under LGPL license.
  -* See terms of license at gnu.org.
  -*/
  + * JBoss, the OpenSource EJB server
  + *
  + * Distributable under LGPL license.
  + * See terms of license at gnu.org.
  + */
   package org.jboss.ejb.plugins;
   
   import java.lang.reflect.Method;
  @@ -40,479 +40,480 @@
   import org.jboss.util.Sync;
   
   /**
  -*   
  -*   The role of this interceptor is to synchronize the state of the cache with the 
underlying storage.
  -*   It does this with the ejbLoad and ejbStore semantics of the EJB specification.
  -*   In the presence of a transaction this is triggered by transaction demarcation.
  -*   It registers a callback with the underlying transaction monitor through the JTA 
interfaces.
  -*   If there is no transaction the policy is to store state upon returning from 
invocation.
  -*   The synchronization polices A,B,C of the specification are taken care of here.  
  -*
  -*   <p><b>WARNING: critical code</b>, get approval from senior developers before 
changing.
  -*    
  -*
  -*   @see <related>
  -*   @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
  -*   @version $Revision: 1.39 $
  -*
  -*   <p><b>Revisions:</b><br>
  -*   <p><b>2001/06/28: marcf</b>
  -*   <ol>
  -*   <li>Moved to new synchronization
  -*   <li>afterCompletion doesn't return to pool anymore, idea is to simplify design 
by not
  -*      mucking with reuse of the instances
  -*   <li>before completion checks for a rolledback tx and doesn't call the store in 
case of a rollback
  -*       we are notified but we don't register the resource 
  -*   </ol>
  -*/
  + * The role of this interceptor is to synchronize the state of the cache with
  + * the underlying storage.  It does this with the ejbLoad and ejbStore
  + * semantics of the EJB specification.  In the presence of a transaction this
  + * is triggered by transaction demarcation. It registers a callback with the
  + * underlying transaction monitor through the JTA interfaces.  If there is no
  + * transaction the policy is to store state upon returning from invocation.
  + * The synchronization polices A,B,C of the specification are taken care of
  + * here.  
  + *
  + * <p><b>WARNING: critical code</b>, get approval from senior developers
  + *    before changing.
  + *    
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
  + * @version $Revision: 1.40 $
  + *
  + * <p><b>Revisions:</b><br>
  + * <p><b>2001/06/28: marcf</b>
  + * <ol>
  + *   <li>Moved to new synchronization
  + *   <li>afterCompletion doesn't return to pool anymore, idea is to simplify 
  + *       design by not mucking with reuse of the instances
  + *   <li>before completion checks for a rolledback tx and doesn't call the 
  + *       store in case of a rollback we are notified but we don't register
  + *       the resource
  + * </ol>
  + */
   public class EntitySynchronizationInterceptor
  -extends AbstractInterceptor
  +   extends AbstractInterceptor
   {
  -     // Constants -----------------------------------------------------
  +   // Constants -----------------------------------------------------
        
  -     // Attributes ----------------------------------------------------
  +   // Attributes ----------------------------------------------------
        
  -     /**
  -     *  The current commit option.
  -     */
  -     protected int commitOption;
  -     
  -     /**
  -     *  The refresh rate for commit option d
  -     */
  -     protected long optionDRefreshRate;
  -     
  -     /**
  -     *  The container of this interceptor.
  -     */
  -     protected EntityContainer container;
  -     
  -     /**
  -     *  Optional isModified method
  -     */
  -     protected Method isModified;
  -     
  -     /**
  -     *  For commit option D this is the cache of valid entities
  -     */
  -     protected HashSet validContexts;
  -     
  -     // Static --------------------------------------------------------
  -     
  -     // Constructors --------------------------------------------------
  -     
  -     // Public --------------------------------------------------------
  -     public void setContainer(Container container)
  -     {
  -             this.container = (EntityContainer)container;
  -     }
  -     
  -     public void init()
  -     throws Exception
  -     {
  -             
  -             try{
  -                     
  -                     validContexts = new HashSet();
  -                     ConfigurationMetaData configuration = 
container.getBeanMetaData().getContainerConfiguration();
  -                     commitOption = configuration.getCommitOption();
  -                     optionDRefreshRate = configuration.getOptionDRefreshRate();
  -                     
  -                     //start up the validContexts thread if commit option D
  -                     if(commitOption == ConfigurationMetaData.D_COMMIT_OPTION){
  -                             ValidContextsRefresher vcr = new 
ValidContextsRefresher(validContexts, optionDRefreshRate);
  -                             new Thread(vcr).start();
  -                     }
  -                     
  -                     isModified = container.getBeanClass().getMethod("isModified", 
new Class[0]);
  -                     if (!isModified.getReturnType().equals(Boolean.TYPE))
  -                             isModified = null; // Has to have "boolean" as return 
type!
  -             } catch (Exception e)
  -             {
  -                     System.out.println(e.getMessage());
  -             }
  -     }
  -     
  -     public Container getContainer()
  -     {
  -             return container;
  -     }
  -     
  -     /**
  -     *  Register a transaction synchronization callback with a context.
  -     */
  -     private void register(EntityEnterpriseContext ctx, Transaction tx)
  -     {
  -             // Create a new synchronization
  -             InstanceSynchronization synch = new InstanceSynchronization(tx, ctx);
  -             
  -             try {
  -                     // associate the entity bean with the transaction so that
  -                     // we can do things like synchronizeEntitiesWithinTransaction
  -                     
((EntityContainer)ctx.getContainer()).getTxEntityMap().associate(tx, ctx);  
  +   /**
  +    *  The current commit option.
  +    */
  +   protected int commitOption;
  +     
  +   /**
  +    *  The refresh rate for commit option d
  +    */
  +   protected long optionDRefreshRate;
  +     
  +   /**
  +    *  The container of this interceptor.
  +    */
  +   protected EntityContainer container;
  +     
  +   /**
  +    *  Optional isModified method
  +    */
  +   protected Method isModified;
  +     
  +   /**
  +    *  For commit option D this is the cache of valid entities
  +    */
  +   protected HashSet validContexts;
  +     
  +   // Static --------------------------------------------------------
  +     
  +   // Constructors --------------------------------------------------
  +     
  +   // Public --------------------------------------------------------
  +   
  +   public void setContainer(Container container)
  +   {
  +      this.container = (EntityContainer)container;
  +   }
  +     
  +   public void init()
  +      throws Exception
  +   {
  +             
  +      try{
  +                     
  +         validContexts = new HashSet();
  +         ConfigurationMetaData configuration = 
container.getBeanMetaData().getContainerConfiguration();
  +         commitOption = configuration.getCommitOption();
  +         optionDRefreshRate = configuration.getOptionDRefreshRate();
  +                     
  +         //start up the validContexts thread if commit option D
  +         if(commitOption == ConfigurationMetaData.D_COMMIT_OPTION){
  +            ValidContextsRefresher vcr = new ValidContextsRefresher(validContexts, 
optionDRefreshRate);
  +            new Thread(vcr).start();
  +         }
  +                     
  +         isModified = container.getBeanClass().getMethod("isModified", new 
Class[0]);
  +         if (!isModified.getReturnType().equals(Boolean.TYPE))
  +            isModified = null; // Has to have "boolean" as return type!
  +      } catch (Exception e)
  +      {
  +         System.out.println(e.getMessage());
  +      }
  +   }
  +     
  +   public Container getContainer()
  +   {
  +      return container;
  +   }
  +     
  +   /**
  +    *  Register a transaction synchronization callback with a context.
  +    */
  +   private void register(EntityEnterpriseContext ctx, Transaction tx)
  +   {
  +      // Create a new synchronization
  +      InstanceSynchronization synch = new InstanceSynchronization(tx, ctx);
  +             
  +      try {
  +         // associate the entity bean with the transaction so that
  +         // we can do things like synchronizeEntitiesWithinTransaction
  +         ((EntityContainer)ctx.getContainer()).getTxEntityMap().associate(tx, ctx); 
 
                        
  -                     // We want to be notified when the transaction commits
  -                     tx.registerSynchronization(synch);
  +         // We want to be notified when the transaction commits
  +         tx.registerSynchronization(synch);
                        
  -                     // marcf: rethink the need for synchronization here, who else 
uses it?
  -                     synchronized(ctx.getTxLock()) {ctx.setTxSynchronized(true);}
  +         // marcf: rethink the need for synchronization here, who else uses it?
  +         synchronized(ctx.getTxLock()) {ctx.setTxSynchronized(true);}
                                        
  -             } catch (RollbackException e) {
  +      } catch (RollbackException e) {
                        
  -                     //Indicates that the transaction is already marked for 
rollback 
  -                     
((EntityContainer)ctx.getContainer()).getTxEntityMap().disassociate(tx, ctx);  
  +         //Indicates that the transaction is already marked for rollback 
  +         ((EntityContainer)ctx.getContainer()).getTxEntityMap().disassociate(tx, 
ctx);  
                        
  -                     // The state in the instance is to be discarded, we force a 
reload of state     
  -                     synchronized (ctx) {ctx.setValid(false);}
  +         // The state in the instance is to be discarded, we force a reload of 
state 
  +         synchronized (ctx) {ctx.setValid(false);}
                        
  -                     // This is really a mistake from the JTA spec, the fact that 
the tx is marked rollback should not be relevant
  -                     // We should still hear about the demarcation
  -                     synchronized (ctx.getTxLock()) 
  -                     {       
  -                             // We couldn't register the synchronization            
         
  -                             ctx.setTransaction(null); ctx.setTxSynchronized(false);
  -                             
  -                             // Wake up threads waiting for the transaction 
demarcation, ain't gonna happen
  -                             ctx.getTxLock().notifyAll();
  -                     }
  -             
  -             } catch (Exception e) {
  -                     
  -                     
((EntityContainer)ctx.getContainer()).getTxEntityMap().disassociate(tx, ctx);  
  -                     
  -                     // If anything goes wrong with the association remove the 
ctx-tx association
  -                     synchronized (ctx.getTxLock()) { ctx.setTransaction(null); 
ctx.setTxSynchronized(false);}
  -                     
  -                     throw new EJBException(e);
  -             
  -             }
  -     }
  -     
  -     
  -     /**
  -     * As per the spec 9.6.4, entities must be synchronized with the datastore
  -     * when an ejbFind<METHOD> is called.
  -     */
  -     private void synchronizeEntitiesWithinTransaction(Transaction tx) throws 
Exception
  -     {
  -             Object[] entities = 
((EntityContainer)getContainer()).getTxEntityMap().getEntities(tx);
  -             for (int i = 0; i < entities.length; i++)
  -             {
  -                     EntityEnterpriseContext ctx = 
(EntityEnterpriseContext)entities[i];
  -                     storeEntity(ctx);
  -             }
  -     }
  -     
  -     private void storeEntity(EntityEnterpriseContext ctx) throws Exception
  -     {
  -             if (ctx.getId() != null)
  -             {
  -                     boolean dirty = true;
  -                     // Check isModified bean method flag
  -                     if (isModified != null)
  -                     {
  -                             dirty = ((Boolean)isModified.invoke(ctx.getInstance(), 
new Object[0])).booleanValue();
  -                     }
  -                     
  -                     // Store entity
  -                     if (dirty)
  -                             
((EntityContainer)getContainer()).getPersistenceManager().storeEntity(ctx);
  -             }
  -     }
  -     // Interceptor implementation --------------------------------------
  -     
  -     public Object invokeHome(MethodInvocation mi)
  -     throws Exception
  -     {
  -             
  -             EntityEnterpriseContext ctx = 
(EntityEnterpriseContext)mi.getEnterpriseContext();
  -             Transaction tx = mi.getTransaction();
  -             
  -             try 
  -             {
  -                     if (tx != null && mi.getMethod().getName().startsWith("find"))
  -                     {
  -                             // As per the spec EJB2.0 9.6.4, entities must be 
synchronized with the datastore
  -                             // when an ejbFind<METHOD> is called.
  -                             synchronizeEntitiesWithinTransaction(tx);
  -                     }
  -                     
  -                     return getNext().invokeHome(mi);
  -             
  -             } finally {
  -                     
  -                     // An anonymous context was sent in, so if it has an id it is 
a real instance now
  -                     if (ctx.getId() != null) {
  -                             
  -                             // Currently synched with underlying storage
  -                             ctx.setValid(true);
  -                             
  -                             if (tx!= null) register(ctx, tx); // Set tx
  -                     }
  -             }
  -     }
  -     
  -     public Object invoke(MethodInvocation mi)
  -     throws Exception
  -     {
  -             // We are going to work with the context a lot
  -             EntityEnterpriseContext ctx = 
(EntityEnterpriseContext)mi.getEnterpriseContext();
  -             
  -             // The Tx coming as part of the Method Invocation
  -             Transaction tx = mi.getTransaction();
  -             
  -             //Commit Option D....
  -             if(commitOption == ConfigurationMetaData.D_COMMIT_OPTION && 
!validContexts.contains(ctx.getId())){
  -                     //bean isn't in cache
  -                     //so set valid to false so that we load...
  -                     ctx.setValid(false);
  -             }
  -                             
  -             // Is my state valid?
  -             if (!ctx.isValid()) {
  -                     
  -                     // If not tell the persistence manager to load the state
  -                     
((EntityContainer)getContainer()).getPersistenceManager().loadEntity(ctx);
  -                     
  -                     // Now the state is valid
  -                     ctx.setValid(true);
  -             }
  -             
  -             // So we can go on with the invocation
  -             //DEBUG         Logger.debug("Tx is "+ ((tx == null)? "null" : 
tx.toString()));
  -             
  -             // Invocation with a running Transaction
  -             if (tx != null && tx.getStatus() != Status.STATUS_NO_TRANSACTION) {
  -                     
  -                     try {
  -                             
  -                             //Invoke down the chain
  -                             return getNext().invoke(mi);
  -                     
  -                     }
  -                     
  -                     finally {
  -                             
  -                             //register the wrapper with the transaction monitor 
(but only register once).
  -                             // The transaction demarcation will trigger the 
storage operations
  -                             if (!ctx.isTxSynchronized()) register(ctx,tx);
  -                     }
  -             }
  -             
  -             //
  -             else { // No tx
  -                     try {
  -                             
  -                             Object result = getNext().invoke(mi);
  -                             
  -                             // Store after each invocation -- not on exception 
though, or removal
  -                             // And skip reads too ("get" methods)
  -                             if (ctx.getId() != null)
  -                             {
  -                                     storeEntity(ctx);
  -                             }
  -                             
  -                             return result;
  -                     
  -                     } catch (Exception e) {
  -                             // Exception - force reload on next call
  -                             ctx.setValid(false);
  -                             throw e;
  -                     }
  -             }
  -     }
  -     
  -     
  -     // Protected  ----------------------------------------------------
  -     
  -     // Inner classes -------------------------------------------------
  -     
  -     private class InstanceSynchronization
  -     implements Synchronization
  -     {
  -             /**
  -             *  The transaction we follow.
  -             */
  -             private Transaction tx;
  -             
  -             /**
  -             *  The context we manage.
  -             */
  -             private EntityEnterpriseContext ctx;
  -             
  -             /**
  -             *  Create a new instance synchronization instance.
  -             */
  -             InstanceSynchronization(Transaction tx, EntityEnterpriseContext ctx)
  -             {
  -                     this.tx = tx;
  -                     this.ctx = ctx;
  -             }
  -             
  -             // Synchronization implementation -----------------------------
  -             
  -             public void beforeCompletion()
  -             {
  -                     // DEBUG Logger.debug("beforeCompletion called for ctx 
"+ctx.hashCode());
  -                     
  -                     if (ctx.getId() != null) {
  -                             
  -                             // This is an independent point of entry. We need to 
make sure the
  -                             // thread is associated with the right context class 
loader
  -                             ClassLoader oldCl = 
Thread.currentThread().getContextClassLoader();
  -                             
Thread.currentThread().setContextClassLoader(container.getClassLoader());
  -                             
  -                             try 
  -                             {
  -                                     try 
  -                                     {
  +         // This is really a mistake from the JTA spec, the fact that the tx is 
marked rollback should not be relevant
  +         // We should still hear about the demarcation
  +         synchronized (ctx.getTxLock()) 
  +         {   
  +            // We couldn't register the synchronization                      
  +            ctx.setTransaction(null); ctx.setTxSynchronized(false);
  +                             
  +            // Wake up threads waiting for the transaction demarcation, ain't gonna 
happen
  +            ctx.getTxLock().notifyAll();
  +         }
  +             
  +      } catch (Exception e) {
  +                     
  +         ((EntityContainer)ctx.getContainer()).getTxEntityMap().disassociate(tx, 
ctx);  
  +                     
  +         // If anything goes wrong with the association remove the ctx-tx 
association
  +         synchronized (ctx.getTxLock()) { ctx.setTransaction(null); 
ctx.setTxSynchronized(false);}
  +                     
  +         throw new EJBException(e);
  +             
  +      }
  +   }
  +     
  +     
  +   /**
  +    * As per the spec 9.6.4, entities must be synchronized with the datastore
  +    * when an ejbFind<METHOD> is called.
  +    */
  +   private void synchronizeEntitiesWithinTransaction(Transaction tx) throws 
Exception
  +   {
  +      Object[] entities = 
((EntityContainer)getContainer()).getTxEntityMap().getEntities(tx);
  +      for (int i = 0; i < entities.length; i++)
  +      {
  +         EntityEnterpriseContext ctx = (EntityEnterpriseContext)entities[i];
  +         storeEntity(ctx);
  +      }
  +   }
  +     
  +   private void storeEntity(EntityEnterpriseContext ctx) throws Exception
  +   {
  +      if (ctx.getId() != null)
  +      {
  +         boolean dirty = true;
  +         // Check isModified bean method flag
  +         if (isModified != null)
  +         {
  +            dirty = ((Boolean)isModified.invoke(ctx.getInstance(), new 
Object[0])).booleanValue();
  +         }
  +                     
  +         // Store entity
  +         if (dirty)
  +            
((EntityContainer)getContainer()).getPersistenceManager().storeEntity(ctx);
  +      }
  +   }
  +   
  +   // Interceptor implementation --------------------------------------
  +     
  +   public Object invokeHome(MethodInvocation mi)
  +      throws Exception
  +   {
  +             
  +      EntityEnterpriseContext ctx = 
(EntityEnterpriseContext)mi.getEnterpriseContext();
  +      Transaction tx = mi.getTransaction();
  +             
  +      try 
  +      {
  +         if (tx != null && mi.getMethod().getName().startsWith("find"))
  +         {
  +            // As per the spec EJB2.0 9.6.4, entities must be synchronized with the 
datastore
  +            // when an ejbFind<METHOD> is called.
  +            synchronizeEntitiesWithinTransaction(tx);
  +         }
  +                     
  +         return getNext().invokeHome(mi);
  +             
  +      } finally {
  +                     
  +         // An anonymous context was sent in, so if it has an id it is a real 
instance now
  +         if (ctx.getId() != null) {
  +                             
  +            // Currently synched with underlying storage
  +            ctx.setValid(true);
  +                             
  +            if (tx!= null) register(ctx, tx); // Set tx
  +         }
  +      }
  +   }
  +     
  +   public Object invoke(MethodInvocation mi)
  +      throws Exception
  +   {
  +      // We are going to work with the context a lot
  +      EntityEnterpriseContext ctx = 
(EntityEnterpriseContext)mi.getEnterpriseContext();
  +             
  +      // The Tx coming as part of the Method Invocation
  +      Transaction tx = mi.getTransaction();
  +             
  +      //Commit Option D....
  +      if(commitOption == ConfigurationMetaData.D_COMMIT_OPTION && 
!validContexts.contains(ctx.getId())){
  +         //bean isn't in cache
  +         //so set valid to false so that we load...
  +         ctx.setValid(false);
  +      }
  +                             
  +      // Is my state valid?
  +      if (!ctx.isValid()) {
  +                     
  +         // If not tell the persistence manager to load the state
  +         ((EntityContainer)getContainer()).getPersistenceManager().loadEntity(ctx);
  +                     
  +         // Now the state is valid
  +         ctx.setValid(true);
  +      }
  +             
  +      // So we can go on with the invocation
  +      //DEBUG                Logger.debug("Tx is "+ ((tx == null)? "null" : 
tx.toString()));
  +             
  +      // Invocation with a running Transaction
  +      if (tx != null && tx.getStatus() != Status.STATUS_NO_TRANSACTION) {
  +                     
  +         try {
  +                             
  +            //Invoke down the chain
  +            return getNext().invoke(mi);
  +                     
  +         }
  +                     
  +         finally {
  +                             
  +            //register the wrapper with the transaction monitor (but only register 
once).
  +            // The transaction demarcation will trigger the storage operations
  +            if (!ctx.isTxSynchronized()) register(ctx,tx);
  +         }
  +      }
  +             
  +      //
  +      else { // No tx
  +         try {
  +                             
  +            Object result = getNext().invoke(mi);
  +                             
  +            // Store after each invocation -- not on exception though, or removal
  +            // And skip reads too ("get" methods)
  +            if (ctx.getId() != null)
  +            {
  +               storeEntity(ctx);
  +            }
  +                             
  +            return result;
  +                     
  +         } catch (Exception e) {
  +            // Exception - force reload on next call
  +            ctx.setValid(false);
  +            throw e;
  +         }
  +      }
  +   }
  +     
  +     
  +   // Protected  ----------------------------------------------------
  +     
  +   // Inner classes -------------------------------------------------
  +     
  +   private class InstanceSynchronization
  +      implements Synchronization
  +   {
  +      /**
  +       *  The transaction we follow.
  +       */
  +      private Transaction tx;
  +             
  +      /**
  +       *  The context we manage.
  +       */
  +      private EntityEnterpriseContext ctx;
  +             
  +      /**
  +       *  Create a new instance synchronization instance.
  +       */
  +      InstanceSynchronization(Transaction tx, EntityEnterpriseContext ctx)
  +      {
  +         this.tx = tx;
  +         this.ctx = ctx;
  +      }
  +             
  +      // Synchronization implementation -----------------------------
  +             
  +      public void beforeCompletion()
  +      {
  +         // DEBUG Logger.debug("beforeCompletion called for ctx "+ctx.hashCode());
  +                     
  +         if (ctx.getId() != null) {
  +                             
  +            // This is an independent point of entry. We need to make sure the
  +            // thread is associated with the right context class loader
  +            ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  +            
Thread.currentThread().setContextClassLoader(container.getClassLoader());
  +                             
  +            try 
  +            {
  +               try 
  +               {
                                                
  -                                             // Store instance if business method 
was invoked
  -                                             if (ctx.getTransaction().getStatus() 
!= Status.STATUS_MARKED_ROLLBACK)
  -                                             {
  +                  // Store instance if business method was invoked
  +                  if (ctx.getTransaction().getStatus() != 
Status.STATUS_MARKED_ROLLBACK)
  +                  {
                                                        
  -                                                     //DEBUG 
Logger.debug("EntitySynchronization sync calling store on ctx "+ctx.hashCode());
  +                     //DEBUG Logger.debug("EntitySynchronization sync calling store 
on ctx "+ctx.hashCode());
                                                        
  -                                                     // Check if the bean defines 
the isModified method
  -                                                     boolean dirty = true;
  -                                                     if (isModified != null)
  -                                                     {
  -                                                             try
  -                                                             {
  -                                                                     dirty = 
((Boolean)isModified.invoke(ctx.getInstance(), new Object[0])).booleanValue();
  -                                                             } catch (Exception 
ignored) {}
  -                                                     }
  +                     // Check if the bean defines the isModified method
  +                     boolean dirty = true;
  +                     if (isModified != null)
  +                     {
  +                        try
  +                        {
  +                           dirty = ((Boolean)isModified.invoke(ctx.getInstance(), 
new Object[0])).booleanValue();
  +                        } catch (Exception ignored) {}
  +                     }
                                                        
  -                                                     if (dirty)
  -                                                             
container.getPersistenceManager().storeEntity(ctx);
  -                                             }
  -                                     } catch (NoSuchEntityException ignored) {
  -                                             // Object has been removed -- ignore
  -                                     }
  -                             }
  -                             // EJB 1.1 12.3.2: all exceptions from ejbStore must 
be marked for rollback
  -                             // and the instance must be discarded
  -                             catch (Exception e) {
  -                                     Logger.exception(e);
  +                     if (dirty)
  +                        container.getPersistenceManager().storeEntity(ctx);
  +                  }
  +               } catch (NoSuchEntityException ignored) {
  +                  // Object has been removed -- ignore
  +               }
  +            }
  +            // EJB 1.1 12.3.2: all exceptions from ejbStore must be marked for 
rollback
  +            // and the instance must be discarded
  +            catch (Exception e) {
  +               Logger.exception(e);
                                        
  -                                     // Store failed -> rollback!
  -                                     try {
  -                                             tx.setRollbackOnly();
  -                                     } catch (SystemException ex) {
  -                                             // DEBUG ex.printStackTrace();
  -                                     } catch (IllegalStateException ex) {
  -                                             // DEBUG ex.printStackTrace();
  -                                     }
  -                             }
  -                             finally {
  +               // Store failed -> rollback!
  +               try {
  +                  tx.setRollbackOnly();
  +               } catch (SystemException ex) {
  +                  // DEBUG ex.printStackTrace();
  +               } catch (IllegalStateException ex) {
  +                  // DEBUG ex.printStackTrace();
  +               }
  +            }
  +            finally {
                                        
  -                                     
Thread.currentThread().setContextClassLoader(oldCl);
  -                             }
  -                     }
  -             }
  -             
  -             
  -             public void afterCompletion(int status)
  -             {
  -                     
  -                     // This is an independent point of entry. We need to make sure 
the
  -                     // thread is associated with the right context class loader
  -                     ClassLoader oldCl = 
Thread.currentThread().getContextClassLoader();
  -                     
Thread.currentThread().setContextClassLoader(container.getClassLoader());
  -                     
  -                     synchronized (ctx) 
  -                     {
  -                             try
  -                             {                       
  -                                     // If rolled back -> invalidate instance
  -                                     if (status == Status.STATUS_ROLLEDBACK) {
  +               Thread.currentThread().setContextClassLoader(oldCl);
  +            }
  +         }
  +      }
  +             
  +      public void afterCompletion(int status)
  +      {
  +                     
  +         // This is an independent point of entry. We need to make sure the
  +         // thread is associated with the right context class loader
  +         ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  +         Thread.currentThread().setContextClassLoader(container.getClassLoader());
  +                     
  +         synchronized (ctx) 
  +         {
  +            try
  +            {                        
  +               // If rolled back -> invalidate instance
  +               if (status == Status.STATUS_ROLLEDBACK) {
                                                
  -                                             // remove from the cache
  -                                             
container.getInstanceCache().remove(ctx.getCacheKey());
  +                  // remove from the cache
  +                  container.getInstanceCache().remove(ctx.getCacheKey());
                                                
  -                                             // Wake all those waiting that the 
context is no longer in cache
  -                                             ctx.notifyAll();
  +                  // Wake all those waiting that the context is no longer in cache
  +                  ctx.notifyAll();
                                        
  -                                     } else {
  +               } else {
                                                
  -                                             switch (commitOption) {
  -                                                     // Keep instance cached after 
tx commit
  -                                                     case 
ConfigurationMetaData.A_COMMIT_OPTION:
  -                                                             // The state is still 
valid (only point of access is us)
  -                                                             ctx.setValid(true);
  -                                                     break;
  +                  switch (commitOption) {
  +                     // Keep instance cached after tx commit
  +                   case ConfigurationMetaData.A_COMMIT_OPTION:
  +                      // The state is still valid (only point of access is us)
  +                      ctx.setValid(true);
  +                      break;
                                                        
  -                                                     // Keep instance active, but 
invalidate state
  -                                                     case 
ConfigurationMetaData.B_COMMIT_OPTION:
  -                                                             // Invalidate state 
(there might be other points of entry)
  -                                                             ctx.setValid(false);
  -                                                     break;
  -                                                     // Invalidate everything AND 
Passivate instance
  -                                                     case 
ConfigurationMetaData.C_COMMIT_OPTION:
  -                                                             try {
  -                                                                     
container.getInstanceCache().release(ctx);
  -                                                             } catch (Exception e) {
  -                                                                     
Logger.debug(e);
  -                                                             }
  -                                                     break;
  -                                                     case 
ConfigurationMetaData.D_COMMIT_OPTION:
  -                                                             //if the local cache 
is emptied then valid is set to false(see invoke() )
  -                                                             
validContexts.add(ctx.getId());
  -                                                     break;
  -                                             }
  -                                     }       
  -                             } 
  +                      // Keep instance active, but invalidate state
  +                   case ConfigurationMetaData.B_COMMIT_OPTION:
  +                      // Invalidate state (there might be other points of entry)
  +                      ctx.setValid(false);
  +                      break;
  +                      // Invalidate everything AND Passivate instance
  +                   case ConfigurationMetaData.C_COMMIT_OPTION:
  +                      try {
  +                         container.getInstanceCache().release(ctx);
  +                      } catch (Exception e) {
  +                         Logger.debug(e);
  +                      }
  +                      break;
  +                   case ConfigurationMetaData.D_COMMIT_OPTION:
  +                      //if the local cache is emptied then valid is set to 
false(see invoke() )
  +                      validContexts.add(ctx.getId());
  +                      break;
  +                  }
  +               }     
  +            } 
                                
  -                             finally {
  +            finally {
                                        
  -                                     synchronized(ctx) {
  +               synchronized(ctx) {
                                                
  -                                             // finish the transaction association
  -                                             
((EntityContainer)ctx.getContainer()).getTxEntityMap().disassociate(tx, ctx);  
  -                                     }
  +                  // finish the transaction association
  +                  
((EntityContainer)ctx.getContainer()).getTxEntityMap().disassociate(tx, ctx);  
  +               }
                                        
  -                                     // All the threads waiting for the end of the 
transaction need to wake up and 
  -                                     // go lock on the next thing, either ctx for 
those threads that will win the 
  -                                     // transactional race or ctx.txLock for the 
rest of them (better luck next time)
  -                                     // no-one must stay on this txLock since the 
tx is going away so this is the one 
  -                                     // and only call!.
  -                                     // So don't replace the following by 
"notify()" (!)
  -                                     synchronized(ctx.getTxLock()) 
  -                                     {
  -                                             // The context is no longer 
synchronized on the TX
  -                                             ctx.setTxSynchronized(false); 
ctx.setTransaction(null);
  +               // All the threads waiting for the end of the transaction need to 
wake up and 
  +               // go lock on the next thing, either ctx for those threads that will 
win the 
  +               // transactional race or ctx.txLock for the rest of them (better 
luck next time)
  +               // no-one must stay on this txLock since the tx is going away so 
this is the one 
  +               // and only call!.
  +               // So don't replace the following by "notify()" (!)
  +               synchronized(ctx.getTxLock()) 
  +               {
  +                  // The context is no longer synchronized on the TX
  +                  ctx.setTxSynchronized(false); ctx.setTransaction(null);
                                                
  -                                             ctx.getTxLock().notifyAll();
  -                                     }
  +                  ctx.getTxLock().notifyAll();
  +               }
                                        
  -                                     
Thread.currentThread().setContextClassLoader(oldCl);
  +               Thread.currentThread().setContextClassLoader(oldCl);
                                
  -                             }
  -                     }
  -             }
  -     }
  -     
  -     
  -     class ValidContextsRefresher implements Runnable{
  -             private HashSet validContexts;
  -             private long refreshRate;
  -             
  -             public ValidContextsRefresher(HashSet validContexts,long refreshRate){
  -                     this.validContexts = validContexts;
  -                     this.refreshRate = refreshRate;
  -             }
  -             
  -             public void run(){
  -                     while(true){
  -                             validContexts.clear();
  -                             // debug System.out.println("Flushing the valid 
contexts");
  -                             try{
  -                                     Thread.sleep(refreshRate);
  -                             }catch(Exception e){
  -                                     System.out.println(e.getMessage());
  -                             }
  -                     }
  -             }
  -     }
  +            }
  +         }
  +      }
  +   }
  +     
  +   class ValidContextsRefresher implements Runnable {
  +      private HashSet validContexts;
  +      private long refreshRate;
  +             
  +      public ValidContextsRefresher(HashSet validContexts,long refreshRate){
  +         this.validContexts = validContexts;
  +         this.refreshRate = refreshRate;
  +      }
  +             
  +      public void run(){
  +         while(true){
  +            validContexts.clear();
  +            // debug System.out.println("Flushing the valid contexts");
  +            try{
  +               Thread.sleep(refreshRate);
  +            }catch(Exception e){
  +               System.out.println(e.getMessage());
  +            }
  +         }
  +      }
  +   }
   }
   
  
  
  

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

Reply via email to