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);