gdamour     2004/11/07 03:04:27

  Modified:    modules/core/src/java/org/openejb/deployment
                        CMPContainerBuilder.java CMPEntityBuilder.java
                        OpenEJBModuleBuilder.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.2       +10 -31    
openejb/modules/core/src/java/org/openejb/deployment/CMPContainerBuilder.java
  
  Index: CMPContainerBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/deployment/CMPContainerBuilder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- CMPContainerBuilder.java  28 Oct 2004 21:21:26 -0000      1.1
  +++ CMPContainerBuilder.java  7 Nov 2004 08:04:27 -0000       1.2
  @@ -70,10 +70,10 @@
   import org.openejb.dispatch.VirtualOperation;
   import org.openejb.entity.BusinessMethod;
   import org.openejb.entity.EntityInstanceFactory;
  -import org.openejb.entity.EntityInterceptorBuilder;
   import org.openejb.entity.HomeMethod;
   import org.openejb.entity.cmp.CMP1Bridge;
   import org.openejb.entity.cmp.CMPCreateMethod;
  +import org.openejb.entity.cmp.CMPEntityInterceptorBuilder;
   import org.openejb.entity.cmp.CMPGetter;
   import org.openejb.entity.cmp.CMPInstanceContextFactory;
   import org.openejb.entity.cmp.CMPRemoveMethod;
  @@ -144,7 +144,6 @@
       private Schema sqlSchema;
       private GlobalSchema globalSchema;
       private EJB ejb;
  -    private String connectionFactoryName;
       private Map queries;
       private TransactionManagerDelegate tm;
   
  @@ -160,14 +159,6 @@
           return EJBComponentType.CMP_ENTITY;
       }
   
  -//    public String getConnectionFactoryName() {
  -//        return connectionFactoryName;
  -//    }
  -//
  -//    public void setConnectionFactoryName(String connectionFactoryName) {
  -//        this.connectionFactoryName = connectionFactoryName;
  -//    }
  -
       public Map getQueries() {
           return queries;
       }
  @@ -207,7 +198,13 @@
       public void setTransactionManagerDelegate(TransactionManagerDelegate tm) 
{
           this.tm = tm;
       }
  -
  +    
  +    protected InterceptorBuilder 
initializeInterceptorBuilder(CMPEntityInterceptorBuilder interceptorBuilder, 
InterfaceMethodSignature[] signatures, VirtualOperation[] vtable) {
  +        super.initializeInterceptorBuilder(interceptorBuilder, signatures, 
vtable);
  +        
interceptorBuilder.setCacheFlushStrategyFactory(globalSchema.getCacheFlushStrategyFactorr());
  +        return interceptorBuilder;
  +    }
  +    
       protected Object buildIt(boolean buildContainer) throws Exception {
           ejb = ejbSchema.getEJB(getEJBName());
           if (ejb == null) {
  @@ -314,7 +311,7 @@
           VirtualOperation[] vtable = (VirtualOperation[]) 
vopMap.values().toArray(new VirtualOperation[vopMap.size()]);
   
           // create and intitalize the interceptor moduleBuilder
  -        InterceptorBuilder interceptorBuilder = 
initializeInterceptorBuilder(new EntityInterceptorBuilder(), signatures, 
vtable);
  +        InterceptorBuilder interceptorBuilder = 
initializeInterceptorBuilder(new CMPEntityInterceptorBuilder(), signatures, 
vtable);
   
           InstanceContextFactory contextFactory = new 
CMPInstanceContextFactory(getContainerId(), cmp1Bridge, primaryKeyTransform, 
faultHandler, beanClass, instanceMap, getUnshareableResources(), 
getApplicationManagedSecurityResources());
           EntityInstanceFactory instanceFactory = new 
EntityInstanceFactory(contextFactory);
  @@ -435,24 +432,6 @@
                   identityDefiner,
                   new ReferenceAccessor(relatedIdentityDefiner));
       }
  -
  -    private static final Map DEFAULTS = new HashMap();
  -
  -    static {
  -        DEFAULTS.put(Boolean.TYPE, Boolean.FALSE);
  -        DEFAULTS.put(Byte.TYPE, new Byte((byte) 0));
  -        DEFAULTS.put(Short.TYPE, new Short((short) 0));
  -        DEFAULTS.put(Integer.TYPE, new Integer(0));
  -        DEFAULTS.put(Long.TYPE, new Long(0L));
  -        DEFAULTS.put(Float.TYPE, new Float(0.0f));
  -        DEFAULTS.put(Double.TYPE, new Double(0.0d));
  -        DEFAULTS.put(Character.TYPE, new Character(Character.MIN_VALUE));
  -    }
  -
  -//    private Object getDefault(Class type) {
  -//        // assumes get returns null and that is valid ...
  -//        return DEFAULTS.get(type);
  -//    }
   
       private Map buildInstanceMap(Class beanClass, LinkedHashMap cmpFields, 
LinkedHashMap cmrFields) {
           Map instanceMap;
  
  
  
  1.13      +8 -73     
openejb/modules/core/src/java/org/openejb/deployment/CMPEntityBuilder.java
  
  Index: CMPEntityBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- CMPEntityBuilder.java     5 Nov 2004 19:14:03 -0000       1.12
  +++ CMPEntityBuilder.java     7 Nov 2004 08:04:27 -0000       1.13
  @@ -58,9 +58,9 @@
   import java.util.HashSet;
   import java.util.Iterator;
   import java.util.LinkedHashMap;
  -import java.util.List;
   import java.util.Map;
   import java.util.Set;
  +
   import javax.management.ObjectName;
   
   import org.apache.geronimo.deployment.DeploymentException;
  @@ -86,29 +86,19 @@
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.CmpFieldMapping;
   import org.openejb.xbeans.ejbjar.OpenejbOpenejbJarType;
   import org.openejb.xbeans.ejbjar.OpenejbQueryType;
  -import org.tranql.cache.CacheSlot;
  -import org.tranql.cache.CacheTable;
   import org.tranql.cache.GlobalSchema;
  +import org.tranql.cache.GlobalSchemaLoader;
   import org.tranql.ejb.CMPField;
   import org.tranql.ejb.CMRField;
   import org.tranql.ejb.EJB;
  -import org.tranql.ejb.EJBQueryBuilder;
   import org.tranql.ejb.EJBSchema;
   import org.tranql.ejb.FKField;
   import org.tranql.ejb.Relationship;
   import org.tranql.ejb.TransactionManagerDelegate;
  -import org.tranql.identity.IdentityDefinerBuilder;
   import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
  -import org.tranql.ql.QueryException;
  -import org.tranql.query.CommandTransform;
  -import org.tranql.query.SchemaMapper;
  -import org.tranql.query.UpdateCommand;
  -import org.tranql.schema.Association;
  -import org.tranql.schema.Association.JoinDefinition;
  -import org.tranql.schema.AssociationEnd;
   import org.tranql.schema.Attribute;
  -import org.tranql.schema.Entity;
   import org.tranql.schema.Schema;
  +import org.tranql.schema.Association.JoinDefinition;
   import org.tranql.sql.Column;
   import org.tranql.sql.EndTable;
   import org.tranql.sql.FKColumn;
  @@ -123,7 +113,7 @@
           super(builder);
       }
   
  -    protected void buildBeans(EARContext earContext, J2eeContext 
moduleJ2eeContext, ClassLoader cl, EJBModule ejbModule, String 
connectionFactoryName, EJBSchema ejbSchema, SQL92Schema sqlSchema, GlobalSchema 
globalSchema, Map openejbBeans, TransactionPolicyHelper 
transactionPolicyHelper, Security security, EnterpriseBeansType 
enterpriseBeans, TransactionManagerDelegate tmDelegate) throws 
DeploymentException {
  +    protected void buildBeans(EARContext earContext, J2eeContext 
moduleJ2eeContext, ClassLoader cl, EJBModule ejbModule, EJBSchema ejbSchema, 
SQL92Schema sqlSchema, GlobalSchema globalSchema, Map openejbBeans, 
TransactionPolicyHelper transactionPolicyHelper, Security security, 
EnterpriseBeansType enterpriseBeans, TransactionManagerDelegate tmDelegate) 
throws DeploymentException {
           // CMP Entity Beans
           EntityBeanType[] entityBeans = enterpriseBeans.getEntityArray();
           for (int i = 0; i < entityBeans.length; i++) {
  @@ -136,7 +126,7 @@
               OpenejbEntityBeanType openejbEntityBean = 
(OpenejbEntityBeanType) openejbBeans.get(getString(entityBean.getEjbName()));
               ObjectName entityObjectName = 
super.createEJBObjectName(moduleJ2eeContext, entityBean);
   
  -            GBeanMBean entityGBean = createBean(earContext, ejbModule, 
entityObjectName.getCanonicalName(), entityBean, openejbEntityBean, ejbSchema, 
sqlSchema, globalSchema, connectionFactoryName, transactionPolicyHelper, 
security, cl, tmDelegate);
  +            GBeanMBean entityGBean = createBean(earContext, ejbModule, 
entityObjectName.getCanonicalName(), entityBean, openejbEntityBean, ejbSchema, 
sqlSchema, globalSchema, transactionPolicyHelper, security, cl, tmDelegate);
   
               earContext.addGBean(entityObjectName, entityGBean);
           }
  @@ -147,7 +137,7 @@
           try {
               Collection entities = processEnterpriseBeans(earContext, 
moduleJ2eeContext, ejbJar, openejbEjbJar, cl, ejbSchema, sqlSchema);
               processRelationships(ejbJar, openejbEjbJar, ejbSchema, 
sqlSchema);
  -            populateGlobalSchema(entities, globalSchema, ejbSchema, 
sqlSchema);
  +            GlobalSchemaLoader.populateGlobalSchema(globalSchema, ejbSchema, 
sqlSchema);
           } catch (Exception e) {
               throw new DeploymentException("Module [" + 
moduleJ2eeContext.getJ2eeModuleName() + "]", e);
           }
  @@ -462,7 +452,7 @@
                   joinTable = new JoinTable(roleInfo[1].tableJDef);
               }
           } else {
  -            EJB mtmEJB = new EJB(mtmEntityName, mtmEntityName, null, null);
  +            EJB mtmEJB = new EJB(mtmEntityName, mtmEntityName);
               relationship = new Relationship(mtmEJB, roleInfo[0].ejbJDef, 
roleInfo[1].ejbJDef);
               Table mtmTable = new Table(mtmEntityName);
               joinTable = new JoinTable(mtmTable, roleInfo[0].tableJDef, 
roleInfo[1].tableJDef);
  @@ -481,60 +471,6 @@
           roleInfo[1].table.addEndTable(new EndTable(endName, 
roleInfo[0].table, roleInfo[0].isOne, joinTable, isVirtual));
       }
   
  -    private void populateGlobalSchema(Collection entities, GlobalSchema 
globalSchema, EJBSchema ejbSchema, SQL92Schema sqlSchema) throws QueryException 
{
  -        EJBQueryBuilder queryBuilder = new EJBQueryBuilder(ejbSchema, new 
IdentityDefinerBuilder(globalSchema));
  -        CommandTransform mapper = new SchemaMapper(sqlSchema);
  -
  -        Set mtmEntities = new HashSet();
  -
  -        for (Iterator iter = entities.iterator(); iter.hasNext();) {
  -            EJB ejb = (EJB) iter.next();
  -
  -            String name = ejb.getName();
  -
  -            List attributes = ejb.getAttributes();
  -            List associationEnds = ejb.getAssociationEnds();
  -            CacheSlot[] slots = new CacheSlot[attributes.size() + 
associationEnds.size()];
  -            for (int i = 0; i < attributes.size(); i++) {
  -                Attribute attr = (Attribute) attributes.get(i);
  -                slots[i] = new CacheSlot(attr.getName(), attr.getType(), 
getDefault(attr.getType()));
  -            }
  -
  -            for (int i = 0; i < associationEnds.size(); i++) {
  -                AssociationEnd end = (AssociationEnd) associationEnds.get(i);
  -                Association association = end.getAssociation();
  -                if (association.isManyToMany()) {
  -                    mtmEntities.add(association);
  -                }
  -                EJB targetEJB = (EJB) end.getEntity();
  -                Class type = 
targetEJB.getProxyFactory().getLocalInterfaceClass();
  -                Object defaultValue = null;
  -                if (end.isMulti()) {
  -                    defaultValue = new HashSet();
  -                }
  -                slots[i + attributes.size()] = new CacheSlot(end.getName(), 
type, defaultValue);
  -            }
  -
  -            UpdateCommand createCommand = 
mapper.transform(queryBuilder.buildCreate(name));
  -            UpdateCommand storeCommand = 
mapper.transform(queryBuilder.buildStore(name));
  -            UpdateCommand removeCommand = 
mapper.transform(queryBuilder.buildRemove(name));
  -
  -            globalSchema.addCacheTable(new CacheTable(name, slots, 
createCommand, storeCommand, removeCommand));
  -        }
  -
  -        for (Iterator iter = mtmEntities.iterator(); iter.hasNext();) {
  -            Association association = (Association) iter.next();
  -            Entity mtmEntity = association.getManyToManyEntity();
  -            AssociationEnd ends[] = association.getAssociationEnds();
  -            CacheSlot[] mtmSlots = new CacheSlot[]{
  -                new CacheSlot(ends[0].getName(), null, null),
  -                new CacheSlot(ends[1].getName(), null, null)};
  -            UpdateCommand mtmCreate = 
mapper.transform(queryBuilder.buildMTMCreate(association));
  -            UpdateCommand mtmRemove = 
mapper.transform(queryBuilder.buildMTMRemove(association));
  -            globalSchema.addCacheTable(new CacheTable(mtmEntity.getName(), 
mtmSlots, mtmCreate, null, mtmRemove));
  -        }
  -    }
  -
       private Class getCMPFieldType(boolean cmp2, String fieldName, Class 
beanClass) throws DeploymentException {
           if (cmp2) {
               try {
  @@ -588,7 +524,7 @@
       }
   
   
  -    public GBeanMBean createBean(EARContext earContext, EJBModule ejbModule, 
String containerId, EntityBeanType entityBean, OpenejbEntityBeanType 
openejbEntityBean, EJBSchema ejbSchema, Schema sqlSchema, GlobalSchema 
globalSchema, String connectionFactoryName, TransactionPolicyHelper 
transactionPolicyHelper, Security security, ClassLoader cl, 
TransactionManagerDelegate tmDelegate) throws DeploymentException {
  +    public GBeanMBean createBean(EARContext earContext, EJBModule ejbModule, 
String containerId, EntityBeanType entityBean, OpenejbEntityBeanType 
openejbEntityBean, EJBSchema ejbSchema, Schema sqlSchema, GlobalSchema 
globalSchema, TransactionPolicyHelper transactionPolicyHelper, Security 
security, ClassLoader cl, TransactionManagerDelegate tmDelegate) throws 
DeploymentException {
           String ejbName = getString(entityBean.getEjbName());
           CMPContainerBuilder builder = new CMPContainerBuilder();
           builder.setClassLoader(cl);
  @@ -625,7 +561,6 @@
           builder.setEJBSchema(ejbSchema);
           builder.setSQLSchema(sqlSchema);
           builder.setGlobalSchema(globalSchema);
  -//        builder.setConnectionFactoryName(connectionFactoryName);
           builder.setTransactionManagerDelegate(tmDelegate);
   
           Map queries = new HashMap();
  
  
  
  1.46      +12 -4     
openejb/modules/core/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java
  
  Index: OpenEJBModuleBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- OpenEJBModuleBuilder.java 5 Nov 2004 23:41:42 -0000       1.45
  +++ OpenEJBModuleBuilder.java 7 Nov 2004 08:04:27 -0000       1.46
  @@ -95,7 +95,10 @@
   import org.openejb.xbeans.ejbjar.OpenejbOpenejbJarDocument;
   import org.openejb.xbeans.ejbjar.OpenejbOpenejbJarType;
   import org.openejb.xbeans.ejbjar.OpenejbSessionBeanType;
  +import org.tranql.cache.CacheFlushStrategyFactory;
  +import org.tranql.cache.EnforceRelationshipsFlushStrategyFactory;
   import org.tranql.cache.GlobalSchema;
  +import org.tranql.cache.SimpleFlushStrategyFactory;
   import org.tranql.ejb.EJBSchema;
   import org.tranql.ejb.TransactionManagerDelegate;
   import org.tranql.sql.DataSourceDelegate;
  @@ -335,11 +338,17 @@
   
           // EJBModule GBean
           GerResourceLocatorType connectionFactoryLocator = 
openejbEjbJar.getCmpConnectionFactory();
  +        CacheFlushStrategyFactory flushStrategyFactory;
  +        if ( openejbEjbJar.isSetEnforceForeignKeyConstraints() ) {
  +            flushStrategyFactory = new 
EnforceRelationshipsFlushStrategyFactory();
  +        } else {
  +            flushStrategyFactory = new SimpleFlushStrategyFactory();
  +        }
           EJBSchema ejbSchema = new EJBSchema(module.getName());
           TransactionManagerDelegate tmDelegate = new 
TransactionManagerDelegate();
           DataSourceDelegate delegate = new DataSourceDelegate();
           SQL92Schema sqlSchema = new SQL92Schema(module.getName(), delegate);
  -        GlobalSchema globalSchema = new GlobalSchema(module.getName());
  +        GlobalSchema globalSchema = new GlobalSchema(module.getName(), 
flushStrategyFactory);
   
           GBeanMBean ejbModuleGBean = new GBeanMBean(EJBModuleImpl.GBEAN_INFO, 
cl);
           try {
  @@ -403,8 +412,7 @@
   
           entityBuilder.buildBeans(earContext, moduleJ2eeContext, cl, 
ejbModule, openejbBeans, transactionPolicyHelper, security, enterpriseBeans);
   
  -        //TODO appears that connectionFactoryName is not used -- this is the 
null parameter
  -        cmpEntityBuilder.buildBeans(earContext, moduleJ2eeContext, cl, 
ejbModule, null, ejbSchema, sqlSchema, globalSchema, openejbBeans, 
transactionPolicyHelper, security, enterpriseBeans, tmDelegate);
  +        cmpEntityBuilder.buildBeans(earContext, moduleJ2eeContext, cl, 
ejbModule, ejbSchema, sqlSchema, globalSchema, openejbBeans, 
transactionPolicyHelper, security, enterpriseBeans, tmDelegate);
   
           mdbBuilder.buildBeans(earContext, moduleJ2eeContext, cl, ejbModule, 
openejbBeans, transactionPolicyHelper, security, enterpriseBeans);
   
  
  
  

Reply via email to