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 {
  
  
  

Reply via email to