gdamour 2004/12/02 18:14:00
Modified: modules/openejb-builder/src/java/org/openejb/deployment
CMPContainerBuilder.java CMPEntityBuilder.java
Log:
GERONIMO-506: CMP - Dependent Value Classes are not supported
GERONIMO-195: BLOB support for CMP entity bean
Dependent Value Classes, and more generally any classes, can now be stored
by CMP entity beans.
It is even possible to define explicitely the SQL type of the column in which
a CMP field is to be stored and how to store it.
This is achieved via two new optional sub-elements of cmp-field-mapping:
o sql-type: this is an SQL type identifier. It must be a field name of the
java.sql.Types class; and
o type-converter: this is the full class name of a TypeConverter. A
TypeConverter is used to perform Java to SQL types conversions and
SQL to Java types conversions.
Combined together, these features give the flexibility to control explicitely
the storage of CMP fields.
For instance, it is possible to store a byte[] directly into a BLOB by
implementing the adequate TypeConverter.
By default, in other words where none of the above elements are specified,
CMP fields, whose types are not explicitely defined by TranQL, are serialized
and stored in a BLOB.
Revision Changes Path
1.4 +8 -6
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java
Index: CMPContainerBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- CMPContainerBuilder.java 27 Nov 2004 10:55:12 -0000 1.3
+++ CMPContainerBuilder.java 2 Dec 2004 23:13:59 -0000 1.4
@@ -125,6 +125,8 @@
import org.tranql.identity.UndefinedIdentityException;
import org.tranql.identity.UserDefinedIdentity;
import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
+import org.tranql.ql.QueryBinding;
+import org.tranql.ql.QueryBindingImpl;
import org.tranql.ql.QueryException;
import org.tranql.query.AssociationEndFaultHandlerBuilder;
import org.tranql.query.CommandTransform;
@@ -251,19 +253,19 @@
// Parameters
String[] parameterTypes = signature.getParameterTypes();
- FieldTransform[] parameterTransforms = new
FieldTransform[parameterTypes.length];
+ QueryBinding[] parameterTransforms = new
QueryBinding[parameterTypes.length];
for (int i = 0; i < parameterTransforms.length; i++) {
- parameterTransforms[i] = new FieldAccessor(i,
ClassLoading.loadClass(parameterTypes[i], classLoader));
+ parameterTransforms[i] = new QueryBindingImpl(i,
ClassLoading.loadClass(parameterTypes[i], classLoader));
}
// Local Proxy Results
FieldTransform localResultsTransform;
localResultsTransform = new FieldAccessor(0,
proxyFactory.getLocalInterfaceClass());
localResultsTransform = new
IdAsEJBLocalObjectTransform(localResultsTransform, proxyFactory,
ejb.getPrimaryKeyClass());
-
+
QueryCommand localProxyLoad =
sqlSchema.getCommandFactory().createQuery(sql,
parameterTransforms,
- new FieldTransform[]{localResultsTransform});
+ new QueryBinding[]{new
QueryBindingImpl(localResultsTransform)});
QueryCommandView localProxyLoadView = new
QueryCommandView(localProxyLoad, new FieldTransform[] {new FieldAccessor(0,
null)});
// Remote Proxy Results
@@ -273,7 +275,7 @@
QueryCommand remoteProxyLoad =
sqlSchema.getCommandFactory().createQuery(sql,
parameterTransforms,
- new FieldTransform[]{remoteResultsTransform});
+ new QueryBinding[]{new
QueryBindingImpl(remoteResultsTransform)});
QueryCommandView remoteProxyLoadView = new
QueryCommandView(remoteProxyLoad, new FieldTransform[] {new FieldAccessor(0,
null)});
queryCommands.put(new InterfaceMethodSignature(signature, true),
1.8 +60 -20
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java
Index: CMPEntityBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- CMPEntityBuilder.java 19 Nov 2004 03:58:59 -0000 1.7
+++ CMPEntityBuilder.java 2 Dec 2004 23:13:59 -0000 1.8
@@ -51,8 +51,6 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.security.Permissions;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -97,7 +95,6 @@
import org.tranql.ejb.Relationship;
import org.tranql.ejb.TransactionManagerDelegate;
import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
-import org.tranql.schema.Attribute;
import org.tranql.schema.Schema;
import org.tranql.schema.Association.JoinDefinition;
import org.tranql.sql.Column;
@@ -106,6 +103,8 @@
import org.tranql.sql.JoinTable;
import org.tranql.sql.SQLSchema;
import org.tranql.sql.Table;
+import org.tranql.sql.TypeConverter;
+import org.tranql.sql.jdbc.SQLTypeLoader;
import org.tranql.sql.sql92.SQL92Schema;
@@ -136,7 +135,7 @@
public void buildCMPSchema(EARContext earContext, J2eeContext
moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar,
ClassLoader cl, EJBSchema ejbSchema, SQL92Schema sqlSchema, GlobalSchema
globalSchema) throws DeploymentException {
try {
- Collection entities = processEnterpriseBeans(earContext,
moduleJ2eeContext, ejbJar, openejbEjbJar, cl, ejbSchema, sqlSchema);
+ processEnterpriseBeans(earContext, moduleJ2eeContext, ejbJar,
openejbEjbJar, cl, ejbSchema, sqlSchema);
processRelationships(ejbJar, openejbEjbJar, ejbSchema,
sqlSchema);
GlobalSchemaLoader.populateGlobalSchema(globalSchema, ejbSchema,
sqlSchema);
} catch (Exception e) {
@@ -144,9 +143,7 @@
}
}
- private Collection processEnterpriseBeans(EARContext earContext,
J2eeContext moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType
openejbEjbJar, ClassLoader cl, EJBSchema ejbSchema, SQL92Schema sqlSchema)
throws DeploymentException {
- Collection entities = new ArrayList();
-
+ private void processEnterpriseBeans(EARContext earContext, J2eeContext
moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar,
ClassLoader cl, EJBSchema ejbSchema, SQL92Schema sqlSchema) throws
DeploymentException {
Map openEjbEntities = new HashMap();
OpenejbEntityBeanType[] openEJBEntities =
openejbEjbJar.getEnterpriseBeans().getEntityArray();
for (int i = 0; i < openEJBEntities.length; i++) {
@@ -275,7 +272,21 @@
Class fieldType = getCMPFieldType(cmp2, fieldName, ejbClass);
boolean isPKField = pkFieldNames.contains(fieldName);
ejb.addCMPField(new CMPField(fieldName, fieldName,
fieldType, isPKField));
- table.addColumn(new Column(fieldName,
mapping.getTableColumn(), fieldType, isPKField));
+ Column column = new Column(fieldName,
mapping.getTableColumn(), fieldType, isPKField);
+ if (mapping.isSetSqlType()) {
+
column.setSQLType(SQLTypeLoader.getSQLType(mapping.getSqlType()));
+ }
+ if (mapping.isSetTypeConverter()) {
+ TypeConverter typeConverter;
+ try {
+ Class typeConverterClass =
cl.loadClass(mapping.getTypeConverter());
+ typeConverter = (TypeConverter)
typeConverterClass.newInstance();
+ } catch (Exception e) {
+ throw new DeploymentException("Can not create type
converter " + mapping.getTypeConverter(), e);
+ }
+ column.setTypeConverter(typeConverter);
+ }
+ table.addColumn(column);
if (isPKField) {
pkFieldNames.remove(fieldName);
}
@@ -316,10 +327,7 @@
ejbSchema.addEJB(ejb);
sqlSchema.addTable(table);
- entities.add(ejb);
}
-
- return entities;
}
private void processRelationships(EjbJarType ejbJar,
OpenejbOpenejbJarType openejbEjbJar, EJBSchema ejbSchema, SQL92Schema
sqlSchema) throws DeploymentException {
@@ -430,14 +438,21 @@
Table pkTable = mappedRoleInfo[0].table;
EJB pkEJB = mappedRoleInfo[0].ejb;
for (Iterator attIter = pkTable.getPrimaryKeyFields().iterator();
attIter.hasNext();) {
- Attribute att = (Attribute) attIter.next();
+ Column att = (Column) attIter.next();
String pkColumn = att.getPhysicalName();
String fkColumn = (String) pkToFkMap.get(pkColumn);
if (null == fkColumn) {
throw new DeploymentException("Role " + sourceRoleInfo + "
is misconfigured: column [" + pkColumn + "] is not a primary key.");
}
pkToFkMapEJB.put(pkEJB.getAttribute(att.getName()), new
FKField(fkColumn, att.getType()));
- pkToFkMapTable.put(att, new FKColumn(fkColumn, att.getType()));
+ FKColumn column = new FKColumn(fkColumn, att.getType());
+ if (att.isSQLTypeSet()) {
+ column.setSQLType(att.getSQLType());
+ }
+ if (att.isTypeConverterSet()) {
+ column.setTypeConverter(att.getTypeConverter());
+ }
+ pkToFkMapTable.put(att, column);
}
mappedRoleInfo[0].ejbJDef = new
JoinDefinition(mappedRoleInfo[0].ejb, mappedRoleInfo[1].ejb, pkToFkMapEJB);
@@ -465,14 +480,39 @@
}
boolean isVirtual = null == roleInfo[0].cmrFieldName;
- String endName = isVirtual ? "$VirtualEnd" + id :
roleInfo[0].cmrFieldName;
- roleInfo[0].ejb.addCMRField(new CMRField(endName, roleInfo[1].ejb,
roleInfo[1].isOne, roleInfo[1].isCascadeDelete, relationship, isVirtual));
- roleInfo[0].table.addEndTable(new EndTable(endName,
roleInfo[1].table, roleInfo[1].isOne, roleInfo[1].isCascadeDelete, joinTable,
isVirtual));
-
+ String endName0 = isVirtual ? "$VirtualEnd" + id :
roleInfo[0].cmrFieldName;
+ roleInfo[0].ejb.addCMRField(new CMRField(endName0, roleInfo[1].ejb,
roleInfo[1].isOne, roleInfo[1].isCascadeDelete, relationship, isVirtual));
+ roleInfo[0].table.addEndTable(new EndTable(endName0,
roleInfo[1].table, roleInfo[1].isOne, roleInfo[1].isCascadeDelete, joinTable,
isVirtual));
+
isVirtual = null == roleInfo[1].cmrFieldName;
- endName = isVirtual ? "$VirtualEnd" + id : roleInfo[1].cmrFieldName;
- roleInfo[1].ejb.addCMRField(new CMRField(endName, roleInfo[0].ejb,
roleInfo[0].isOne, roleInfo[0].isCascadeDelete, relationship, isVirtual));
- roleInfo[1].table.addEndTable(new EndTable(endName,
roleInfo[0].table, roleInfo[0].isOne, roleInfo[0].isCascadeDelete, joinTable,
isVirtual));
+ String endName1 = isVirtual ? "$VirtualEnd" + id :
roleInfo[1].cmrFieldName;
+ roleInfo[1].ejb.addCMRField(new CMRField(endName1, roleInfo[0].ejb,
roleInfo[0].isOne, roleInfo[0].isCascadeDelete, relationship, isVirtual));
+ roleInfo[1].table.addEndTable(new EndTable(endName1,
roleInfo[0].table, roleInfo[0].isOne, roleInfo[0].isCascadeDelete, joinTable,
isVirtual));
+
+ if (null != mtmEntityName) {
+ EJB mtmEJB = (EJB) ejbSchema.getEJB(mtmEntityName);
+ Relationship mtmRelationship = new
Relationship(relationship.getLeftJoinDefinition());
+ CMRField field = new CMRField(endName0, roleInfo[0].ejb, true,
false, mtmRelationship, true);
+ mtmEJB.addCMRField(field);
+
mtmRelationship.addAssociationEnd(roleInfo[0].ejb.getAssociationEnd(endName0));
+
+ mtmRelationship = new
Relationship(relationship.getRightJoinDefinition());
+ field = new CMRField(endName1, roleInfo[1].ejb, true, false,
mtmRelationship, true);
+ mtmEJB.addCMRField(field);
+
mtmRelationship.addAssociationEnd(roleInfo[1].ejb.getAssociationEnd(endName1));
+
+ Table mtmTable = (Table) sqlSchema.getTable(mtmEntityName);
+ JoinTable mtmJoinTable = new
JoinTable(joinTable.getLeftJoinDefinition());
+ EndTable endTable = new EndTable(endName0, roleInfo[0].table,
true, false, mtmJoinTable, true);
+ mtmTable.addEndTable(endTable);
+
mtmJoinTable.addAssociationEnd(roleInfo[0].table.getAssociationEnd(endName0));
+
+ mtmTable = (Table) sqlSchema.getTable(mtmEntityName);
+ mtmJoinTable = new JoinTable(joinTable.getRightJoinDefinition());
+ endTable = new EndTable(endName1, roleInfo[1].table, true,
false, mtmJoinTable, true);
+ mtmTable.addEndTable(endTable);
+
mtmJoinTable.addAssociationEnd(roleInfo[1].table.getAssociationEnd(endName1));
+ }
}
private Class getCMPFieldType(boolean cmp2, String fieldName, Class
beanClass) throws DeploymentException {