gdamour     2004/11/07 03:04:27

  Added:       modules/core/src/java/org/openejb/entity/cmp
                        CMPEntityInterceptorBuilder.java
                        InTxCacheInterceptor.java
  Log:

  GERONIMO-429: Foreign key constraints are not enforced for CMP 2.x EntityBean.
  
  o add a new element to openejb-jar.xml, namely 
enforce-foreign-key-constraints,
  indicating if DML operations related to CMP EJB need to be sorted in order to
  enforce foreign key constraints; and
  o add a new Interceptor in charge of defining the InTxCache bound to a
  TransactionContext, if require.
  
  Revision  Changes    Path
  1.1                  
openejb/modules/core/src/java/org/openejb/entity/cmp/CMPEntityInterceptorBuilder.java
  
  Index: CMPEntityInterceptorBuilder.java
  ===================================================================
  /* ====================================================================
   * Redistribution and use of this software and associated documentation
   * ("Software"), with or without modification, are permitted provided
   * that the following conditions are met:
   *
   * 1. Redistributions of source code must retain copyright
   *    statements and notices.  Redistributions must also contain a
   *    copy of this document.
   *
   * 2. Redistributions in binary form must reproduce this list of
   *    conditions and the following disclaimer in the documentation
   *    and/or other materials provided with the distribution.
   *
   * 3. The name "OpenEJB" must not be used to endorse or promote
   *    products derived from this Software without prior written
   *    permission of The OpenEJB Group.  For written permission,
   *    please contact [EMAIL PROTECTED]
   *
   * 4. Products derived from this Software may not be called "OpenEJB"
   *    nor may "OpenEJB" appear in their names without prior written
   *    permission of The OpenEJB Group. OpenEJB is a registered
   *    trademark of The OpenEJB Group.
   *
   * 5. Due credit should be given to the OpenEJB Project
   *    (http://openejb.org/).
   *
   * THIS SOFTWARE IS PROVIDED BY THE OPENEJB GROUP AND CONTRIBUTORS
   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   * THE OPENEJB GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the OpenEJB Project.  For more information
   * please see <http://openejb.org/>.
   *
   * ====================================================================
   */
  package org.openejb.entity.cmp;
  
  import org.apache.geronimo.core.service.Interceptor;
  import org.apache.geronimo.naming.java.ComponentContextInterceptor;
  
  import org.openejb.AbstractInterceptorBuilder;
  import org.openejb.ConnectionTrackingInterceptor;
  import org.openejb.SystemExceptionInterceptor;
  import org.openejb.TwoChains;
  import org.openejb.dispatch.DispatchInterceptor;
  import org.openejb.entity.EntityInstanceInterceptor;
  import org.openejb.security.EJBIdentityInterceptor;
  import org.openejb.security.EJBRunAsInterceptor;
  import org.openejb.security.EJBSecurityInterceptor;
  import org.openejb.security.PolicyContextHandlerEJBInterceptor;
  import org.openejb.transaction.TransactionContextInterceptor;
  import org.tranql.cache.CacheFlushStrategyFactory;
  
  /**
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/11/07 08:04:27 $
   */
  public class CMPEntityInterceptorBuilder extends AbstractInterceptorBuilder {
      private CacheFlushStrategyFactory strategyFactory;
      
      public CacheFlushStrategyFactory getCacheFlushStrategyFactory() {
          return strategyFactory;
      }
  
      public void setCacheFlushStrategyFactory(CacheFlushStrategyFactory 
strategyFactory) {
          this.strategyFactory = strategyFactory;
      }
      
      public TwoChains buildInterceptorChains() {
          if (transactionContextManager == null) {
              throw new IllegalStateException("Transaction context manager must 
be set before building the interceptor chain");
          }
          if (instancePool == null) {
              throw new IllegalStateException("Pool must be set before building 
the interceptor chain");
          }
          if ( null == strategyFactory ) {
              throw new IllegalStateException("Cache flush strategy must be set 
before building the interceptor chain");
          }
  
          Interceptor firstInterceptor;
          firstInterceptor = new DispatchInterceptor(vtable);
          if (doAsCurrentCaller) {
              firstInterceptor = new EJBIdentityInterceptor(firstInterceptor);
          }
  
          // system interceptor only gets only dispatch, ejbIdentity, and 
component context
          Interceptor systemChain = firstInterceptor;
          systemChain = new ComponentContextInterceptor(systemChain, 
componentContext);
  
          if (securityEnabled) {
              firstInterceptor = new EJBSecurityInterceptor(firstInterceptor, 
containerId, permissionManager);
          }
          if (runAs != null) {
              firstInterceptor = new EJBRunAsInterceptor(firstInterceptor, 
runAs);
          }
          if (useContextHandler) {
              firstInterceptor = new 
PolicyContextHandlerEJBInterceptor(firstInterceptor);
          }
          firstInterceptor = new ComponentContextInterceptor(firstInterceptor, 
componentContext);
          if (trackedConnectionAssociator != null) {
              firstInterceptor = new 
ConnectionTrackingInterceptor(firstInterceptor, trackedConnectionAssociator);
          }
          firstInterceptor = new EntityInstanceInterceptor(firstInterceptor, 
instancePool);
          firstInterceptor = new InTxCacheInterceptor(firstInterceptor, 
strategyFactory);
          firstInterceptor = new 
TransactionContextInterceptor(firstInterceptor, transactionContextManager, 
transactionPolicyManager);
          firstInterceptor = new SystemExceptionInterceptor(firstInterceptor, 
ejbName);
          return new TwoChains(firstInterceptor, systemChain);
      }
  }
  
  
  
  1.1                  
openejb/modules/core/src/java/org/openejb/entity/cmp/InTxCacheInterceptor.java
  
  Index: InTxCacheInterceptor.java
  ===================================================================
  /* ====================================================================
   * Redistribution and use of this software and associated documentation
   * ("Software"), with or without modification, are permitted provided
   * that the following conditions are met:
   *
   * 1. Redistributions of source code must retain copyright
   *    statements and notices.  Redistributions must also contain a
   *    copy of this document.
   *
   * 2. Redistributions in binary form must reproduce this list of
   *    conditions and the following disclaimer in the documentation
   *    and/or other materials provided with the distribution.
   *
   * 3. The name "OpenEJB" must not be used to endorse or promote
   *    products derived from this Software without prior written
   *    permission of The OpenEJB Group.  For written permission,
   *    please contact [EMAIL PROTECTED]
   *
   * 4. Products derived from this Software may not be called "OpenEJB"
   *    nor may "OpenEJB" appear in their names without prior written
   *    permission of The OpenEJB Group. OpenEJB is a registered
   *    trademark of The OpenEJB Group.
   *
   * 5. Due credit should be given to the OpenEJB Project
   *    (http://openejb.org/).
   *
   * THIS SOFTWARE IS PROVIDED BY THE OPENEJB GROUP AND CONTRIBUTORS
   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   * THE OPENEJB GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the OpenEJB Project.  For more information
   * please see <http://openejb.org/>.
   *
   * ====================================================================
   */
  package org.openejb.entity.cmp;
  
  import org.apache.geronimo.core.service.Interceptor;
  import org.apache.geronimo.core.service.Invocation;
  import org.apache.geronimo.core.service.InvocationResult;
  import org.apache.geronimo.transaction.context.TransactionContext;
  import org.openejb.EJBInvocation;
  import org.tranql.cache.CacheFlushStrategyFactory;
  import org.tranql.cache.InTxCache;
  
  /**
   * This interceptor defines, if required, the InTxCache of the 
   * TransactionContext bound to the intercepted EJBInvocation. A 
   * CacheFlushStrategyFactory is used to create the CacheFlushStrategy to be
   * used under the cover of the defined InTxCache.
   *
   * @version $Revision: 1.1 $ $Date: 2004/11/07 08:04:27 $
   */
  public final class InTxCacheInterceptor implements Interceptor {
      private final Interceptor next;
      private final CacheFlushStrategyFactory strategyFactory;
  
      public InTxCacheInterceptor(Interceptor next, CacheFlushStrategyFactory 
strategyFactory) {
          this.next = next;
          this.strategyFactory = strategyFactory;
      }
  
      public InvocationResult invoke(final Invocation invocation) throws 
Throwable {
          EJBInvocation ejbInvocation = (EJBInvocation) invocation;
          TransactionContext transactionContext = 
ejbInvocation.getTransactionContext();
          if ( null == transactionContext.getInTxCache() ) {
              transactionContext.setInTxCache(new 
InTxCache(strategyFactory.createCacheFlushStrategy()));
          }
          
          return next.invoke(invocation);
      }
  }
  
  
  

Reply via email to