ammulder    2005/07/07 17:37:07

  Modified:    modules/openejb-builder/src/java/org/openejb/deployment
                        CMPContainerBuilder.java CMPEntityBuilder.java
                        OpenEJBModuleBuilder.java
  Log:

  Add option to configure PK generation via direct schema elements instead
    of only using references to GBeans.
  The old style configuration is still supported, though the syntax is
    different (if you want to use a GBean reference, put it in a
    key-generator/custom-generator element)
  There's also a placeholder commented out of the XML Schema for key
    generation using IDs inserted directly into the target table by the
    database (using AUTO_INCREMENT columns or triggers) though that
    requires additional features from TranQL before it works.
  
  Revision  Changes    Path
  1.22      +4 -3      
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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- CMPContainerBuilder.java  3 Jul 2005 10:08:39 -0000       1.21
  +++ CMPContainerBuilder.java  7 Jul 2005 21:37:07 -0000       1.22
  @@ -129,6 +129,7 @@
   import org.tranql.identity.IdentityTransform;
   import org.tranql.identity.UserDefinedIdentity;
   import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
  +import org.tranql.pkgenerator.PrimaryKeyGenerator;
   import org.tranql.ql.QueryException;
   import org.tranql.query.QueryCommand;
   import org.tranql.schema.Association;
  @@ -292,7 +293,7 @@
           }
   
           // build the vop table
  -        LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable, 
cmrNoPrefetchFieldAccessors[1], cmp1Bridge, identityDefiner, 
ejb.getPrimaryKeyGeneratorDelegate(), primaryKeyTransform, localProxyTransform, 
remoteProxyTransform, finders);
  +        LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable, 
cmrNoPrefetchFieldAccessors[1], cmp1Bridge, identityDefiner, 
ejb.getPrimaryKeyGenerator(), primaryKeyTransform, localProxyTransform, 
remoteProxyTransform, finders);
   
           InterfaceMethodSignature[] signatures = (InterfaceMethodSignature[]) 
vopMap.keySet().toArray(new InterfaceMethodSignature[vopMap.size()]);
           VirtualOperation[] vtable = (VirtualOperation[]) 
vopMap.values().toArray(new VirtualOperation[vopMap.size()]);
  @@ -518,7 +519,7 @@
               Map cmrFieldAccessors,
               CMP1Bridge cmp1Bridge,
               IdentityDefiner identityDefiner,
  -            PrimaryKeyGeneratorDelegate keyGenerator,
  +            PrimaryKeyGenerator keyGenerator,
               IdentityTransform primaryKeyTransform,
               IdentityTransform localProxyTransform,
               IdentityTransform remoteProxyTransform,
  
  
  
  1.33      +55 -41    
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.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- CMPEntityBuilder.java     3 Jul 2005 10:08:39 -0000       1.32
  +++ CMPEntityBuilder.java     7 Jul 2005 21:37:07 -0000       1.33
  @@ -57,6 +57,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.management.ObjectName;
  +import javax.sql.DataSource;
   
   import org.apache.geronimo.common.DeploymentException;
   import org.apache.geronimo.gbean.GBeanData;
  @@ -74,7 +75,6 @@
   import org.apache.geronimo.xbeans.j2ee.EntityBeanType;
   import org.apache.geronimo.xbeans.j2ee.JavaTypeType;
   import org.apache.geronimo.xbeans.j2ee.QueryType;
  -import org.openejb.entity.cmp.PrimaryKeyGeneratorWrapper;
   import org.openejb.proxy.EJBProxyFactory;
   import org.openejb.transaction.TransactionPolicySource;
   import org.openejb.xbeans.ejbjar.OpenejbCmpFieldGroupMappingType;
  @@ -84,12 +84,12 @@
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType;
   import org.openejb.xbeans.ejbjar.OpenejbEntityGroupMappingType;
   import org.openejb.xbeans.ejbjar.OpenejbGroupType;
  -import 
org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.AutomaticKeyGeneration;
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.CmpFieldMapping;
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.PrefetchGroup;
   import org.openejb.xbeans.ejbjar.OpenejbGroupType.CmrField;
   import org.openejb.xbeans.ejbjar.OpenejbOpenejbJarType;
   import org.openejb.xbeans.ejbjar.OpenejbQueryType;
  +import org.openejb.deployment.pkgen.PKGenBuilder;
   import org.tranql.cache.GlobalSchema;
   import org.tranql.cache.GlobalSchemaLoader;
   import org.tranql.ejb.CMPField;
  @@ -101,7 +101,7 @@
   import org.tranql.ejb.Relationship;
   import org.tranql.ejb.SelectEJBQLQuery;
   import org.tranql.ejb.TransactionManagerDelegate;
  -import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
  +import org.tranql.pkgenerator.PrimaryKeyGenerator;
   import org.tranql.schema.Association.JoinDefinition;
   import org.tranql.sql.Column;
   import org.tranql.sql.EndTable;
  @@ -113,9 +113,13 @@
   import org.tranql.sql.jdbc.SQLTypeLoader;
   import org.tranql.sql.prefetch.PrefetchGroupDictionary;
   import org.tranql.sql.prefetch.PrefetchGroupDictionary.EndTableDesc;
  +import org.tranql.ql.QueryException;
   
   
   /**
  + * During the process of deploying an EJB JAR, this class is called to deploy
  + * each CMP entity bean in the JAR.  It is called from OpenEJBModuleBuilder.
  + *
    * @version $Revision$ $Date$
    */
   class CMPEntityBuilder extends EntityBuilder {
  @@ -124,7 +128,10 @@
           super(builder);
       }
   
  -    protected void buildBeans(EARContext earContext, J2eeContext 
moduleJ2eeContext, ClassLoader cl, EJBModule ejbModule, EJBSchema ejbSchema, 
SQLSchema sqlSchema, GlobalSchema globalSchema, Map openejbBeans, 
TransactionPolicyHelper transactionPolicyHelper, EnterpriseBeansType 
enterpriseBeans, TransactionManagerDelegate tmDelegate, ComponentPermissions 
componentPermissions, String policyContextID) throws DeploymentException {
  +    /**
  +     * Create GBeans for all the CMP entity beans in the EJB JAR.
  +     */
  +    public void buildBeans(EARContext earContext, J2eeContext 
moduleJ2eeContext, ClassLoader cl, EJBModule ejbModule, EJBSchema ejbSchema, 
SQLSchema sqlSchema, GlobalSchema globalSchema, Map openejbBeans, 
TransactionPolicyHelper transactionPolicyHelper, EnterpriseBeansType 
enterpriseBeans, TransactionManagerDelegate tmDelegate, ComponentPermissions 
componentPermissions, String policyContextID) throws DeploymentException {
           // CMP Entity Beans
           EntityBeanType[] entityBeans = enterpriseBeans.getEntityArray();
           for (int i = 0; i < entityBeans.length; i++) {
  @@ -143,10 +150,14 @@
           }
       }
   
  -
  -    public void buildCMPSchema(EARContext earContext, J2eeContext 
moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar, 
ClassLoader cl, EJBSchema ejbSchema, SQLSchema sqlSchema, GlobalSchema 
globalSchema) throws DeploymentException {
  +    /**
  +     * Process the deployment information for all the CMP entity beans in the
  +     * EJB JAR.  This includes setting up the database mappings, key
  +     * generation, etc.
  +     */
  +    public void buildCMPSchema(EARContext earContext, J2eeContext 
moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar, 
ClassLoader cl, EJBSchema ejbSchema, SQLSchema sqlSchema, GlobalSchema 
globalSchema, PKGenBuilder pkGen, DataSource dataSource) throws 
DeploymentException {
           try {
  -            processEnterpriseBeans(earContext, moduleJ2eeContext, ejbJar, 
openejbEjbJar, cl, ejbSchema, sqlSchema);
  +            processEnterpriseBeans(earContext, moduleJ2eeContext, ejbJar, 
openejbEjbJar, cl, ejbSchema, sqlSchema, pkGen, dataSource);
               processRelationships(ejbJar, openejbEjbJar, ejbSchema, 
sqlSchema);
               processGroups(openejbEjbJar, ejbSchema, sqlSchema);
               GlobalSchemaLoader.populateGlobalSchema(globalSchema, ejbSchema, 
sqlSchema);
  @@ -216,7 +227,7 @@
           }
       }
       
  -    private void processEnterpriseBeans(EARContext earContext, J2eeContext 
moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar, 
ClassLoader cl, EJBSchema ejbSchema, SQLSchema sqlSchema) throws 
DeploymentException {
  +    private void processEnterpriseBeans(EARContext earContext, J2eeContext 
moduleJ2eeContext, EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar, 
ClassLoader cl, EJBSchema ejbSchema, SQLSchema sqlSchema, PKGenBuilder pkGen, 
DataSource dataSource) throws DeploymentException {
           Map openEjbEntities = new HashMap();
           OpenejbEntityBeanType[] openEJBEntities = 
openejbEjbJar.getEnterpriseBeans().getEntityArray();
           for (int i = 0; i < openEJBEntities.length; i++) {
  @@ -224,7 +235,6 @@
               openEjbEntities.put(entity.getEjbName(), entity);
           }
   
  -        Map keyGenerators = new HashMap();
           EntityBeanType[] entityBeans = 
ejbJar.getEnterpriseBeans().getEntityArray();
           for (int i = 0; i < entityBeans.length; i++) {
               EntityBeanType entityBean = entityBeans[i];
  @@ -264,17 +274,42 @@
                   throw new DeploymentException("Could not load cmp bean 
class: ejbName=" + ejbName + " ejbClass=" + 
getString(entityBean.getEjbClass()));
               }
   
  +            // Index the CMP fields
  +            Map cmpFieldToMapping = new HashMap();
  +            CmpFieldMapping mappings[] = 
openEjbEntity.getCmpFieldMappingArray();
  +            for (int j = 0; j < mappings.length; j++) {
  +                CmpFieldMapping mapping = mappings[j];
  +                cmpFieldToMapping.put(mapping.getCmpFieldName(), mapping);
  +            }
  +
  +            // Handle "Unknown Primary Key Type" -- try to identify the PK 
class
               boolean unknownPK = false;
               Class pkClass;
               try {
                   String pkClassName = getString(entityBean.getPrimKeyClass());
                   if ( pkClassName.equals("java.lang.Object") ) {
                       unknownPK = true;
  -                    if ( false == 
openEjbEntity.isSetAutomaticKeyGeneration() ) {
  +                    // If the key type is not known, we assume the provided 
code does not set the PK, and
  +                    //   therefore we need a key generator to be set.
  +                    if ( false == openEjbEntity.isSetKeyGenerator() ) {
                           throw new DeploymentException("Automatic key 
generation is not defined: ejbName=" + ejbName);
                       }
  -                    AutomaticKeyGeneration keyGeneration = 
openEjbEntity.getAutomaticKeyGeneration();
  -                    pkClassName = keyGeneration.getPrimaryKeyClass();
  +                    if(false == openEjbEntity.isSetPrimkeyField()) {
  +                        throw new DeploymentException("EJB "+ejbName+" has 
an \"unknown primary key type\" (java.lang.Object).  A primkey-field element 
must be present in openejb-jar.xml to indicate the actual primary key type.");
  +                    }
  +                    String pkFieldName = openEjbEntity.getPrimkeyField();
  +                    CmpFieldMapping pkField = 
(OpenejbEntityBeanType.CmpFieldMapping) cmpFieldToMapping.get(pkFieldName);
  +                    if(pkField == null) {
  +                        throw new DeploymentException("EJB "+ejbName+" lists 
a primkey-field ("+pkFieldName+") but there is no matching cmp-field-mapping");
  +                    }
  +                    if(pkField.isSetCmpFieldClass()) { // Check if the field 
class was provided in openejb-jar.xml
  +                        pkClassName = pkField.getCmpFieldClass();
  +                    } else { // Otherwise it has to be a getter on the EJB 
class itself
  +                        pkClassName = getCMPFieldType(cmp2, pkFieldName, 
ejbClass).getName();
  +                    }
  +                    if(pkClassName == null) { // should never happen
  +                        throw new DeploymentException("Cannot determine 
actual primary key field type for EJB "+ejbName);
  +                    }
                   }
                   pkClass = cl.loadClass(pkClassName);
               } catch (ClassNotFoundException e) {
  @@ -282,29 +317,15 @@
               }
   
               EJB ejb;
  -            PrimaryKeyGeneratorDelegate keyGeneratorDelegate = null;
  -            if ( openEjbEntity.isSetAutomaticKeyGeneration() ) {
  -                AutomaticKeyGeneration keyGeneration = 
openEjbEntity.getAutomaticKeyGeneration();
  -                String generatorName = keyGeneration.getGeneratorName();
  -                keyGeneratorDelegate = (PrimaryKeyGeneratorDelegate) 
keyGenerators.get(generatorName);
  -                if ( null == keyGeneratorDelegate ) {
  -                    keyGeneratorDelegate = new PrimaryKeyGeneratorDelegate();
  -                    GBeanData keyGenerator;
  -                    try {
  -                        ObjectName generatorObjectName = new 
ObjectName(generatorName);
  -                        ObjectName wrapperGeneratorObjectName = new 
ObjectName(generatorName + ",isWrapper=true");
  -                        keyGenerator = new 
GBeanData(wrapperGeneratorObjectName, PrimaryKeyGeneratorWrapper.GBEAN_INFO);
  -                        
keyGenerator.setReferencePattern("PrimaryKeyGenerator", generatorObjectName);
  -                        
keyGenerator.setAttribute("primaryKeyGeneratorDelegate", keyGeneratorDelegate);
  -                    } catch (Exception e) {
  -                        throw new DeploymentException("Unable to initialize 
PrimaryKeyGeneratorWrapper GBean", e);
  -                    }
  -                    earContext.addGBean(keyGenerator);
  -
  -                    keyGenerators.put(generatorName, keyGeneratorDelegate);
  +            PrimaryKeyGenerator keyGenerator = null;
  +            if(openEjbEntity.isSetKeyGenerator()) {
  +                try {
  +                    keyGenerator = 
pkGen.configurePKGenerator(openEjbEntity.getKeyGenerator(), dataSource, 
pkClass, earContext);
  +                } catch (QueryException e) {
  +                    throw new DeploymentException("Unable to load PK 
Generator for EJB "+ejbName, e);
                   }
               }
  -            ejb = new EJB(ejbName, abstractSchemaName, pkClass, 
proxyFactory, keyGeneratorDelegate, unknownPK);
  +            ejb = new EJB(ejbName, abstractSchemaName, pkClass, 
proxyFactory, keyGenerator, unknownPK);
   
               Table table = new Table(ejbName, openEjbEntity.getTableName());
   
  @@ -324,13 +345,6 @@
                   // specific field is primary key
                   pkFieldNames = new HashSet(1);
                   pkFieldNames.add(getString(entityBean.getPrimkeyField()));
  -            }
  -
  -            Map cmpFieldToMapping = new HashMap();
  -            CmpFieldMapping mappings[] = 
openEjbEntity.getCmpFieldMappingArray();
  -            for (int j = 0; j < mappings.length; j++) {
  -                CmpFieldMapping mapping = mappings[j];
  -                cmpFieldToMapping.put(mapping.getCmpFieldName(), mapping);
               }
   
               CmpFieldType[] cmpFieldTypes = entityBean.getCmpFieldArray();
  
  
  
  1.42      +13 -4     
openejb/modules/openejb-builder/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java
  
  Index: OpenEJBModuleBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- OpenEJBModuleBuilder.java 6 Jul 2005 13:31:50 -0000       1.41
  +++ OpenEJBModuleBuilder.java 7 Jul 2005 21:37:07 -0000       1.42
  @@ -94,10 +94,10 @@
   import org.apache.xmlbeans.XmlObject;
   import org.openejb.EJBModuleImpl;
   import org.openejb.corba.CORBAHandleDelegate;
  -import org.openejb.corba.compiler.SkeletonGenerator;
   import org.openejb.corba.proxy.CORBAProxyReference;
   import 
org.openejb.deployment.corba.NoDistributedTxTransactionImportPolicyBuilder;
   import org.openejb.deployment.corba.TransactionImportPolicyBuilder;
  +import org.openejb.deployment.pkgen.TranQLPKGenBuilder;
   import org.openejb.proxy.EJBProxyFactory;
   import org.openejb.proxy.EJBProxyReference;
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType;
  @@ -121,6 +121,9 @@
   
   
   /**
  + * Master builder for processing EJB JAR deployments and creating the
  + * correspinding runtime objects (GBeans, etc.).
  + *
    * @version $Revision$ $Date$
    */
   public class OpenEJBModuleBuilder implements ModuleBuilder, 
EJBReferenceBuilder {
  @@ -342,6 +345,10 @@
           return sessionBuilder;
       }
   
  +    /**
  +     * Does the meaty work of processing the deployment information and
  +     * creating GBeans for all the EJBs in the JAR, etc.
  +     */
       public void addGBeans(EARContext earContext, Module module, ClassLoader 
cl) throws DeploymentException {
           J2eeContext earJ2eeContext = earContext.getJ2eeContext();
           J2eeContext moduleJ2eeContext = 
J2eeContextImpl.newModuleContextFromApplication(earJ2eeContext, 
NameFactory.EJB_MODULE, module.getName());
  @@ -431,8 +438,11 @@
           }
           earContext.addGBean(ejbModuleGBeanData);
   
  +        // Handle automatic PK generation -- we want to use the same builder 
for all CMP entities
  +        TranQLPKGenBuilder pkgen = new TranQLPKGenBuilder();
  +
           // @todo need a better schema name
  -        cmpEntityBuilder.buildCMPSchema(earContext, moduleJ2eeContext, 
ejbJar, openejbEjbJar, cl, ejbSchema, sqlSchema, globalSchema);
  +        cmpEntityBuilder.buildCMPSchema(earContext, moduleJ2eeContext, 
ejbJar, openejbEjbJar, cl, ejbSchema, sqlSchema, globalSchema, pkgen, delegate);
   
           if (null == connectionFactoryLocator && false == 
ejbSchema.getEntities().isEmpty()) {
               throw new DeploymentException("A cmp-connection-factory element 
must be specified as CMP EntityBeans are defined.");
  @@ -480,7 +490,6 @@
           //TODO go back to the commented version when possible
   //          String contextID = ejbModuleObjectName.getCanonicalName();
           String policyContextID = 
ejbModuleObjectName.getCanonicalName().replaceAll("[,: ]", "_");
  -
   
           sessionBuilder.buildBeans(earContext, moduleJ2eeContext, cl, 
ejbModule, componentPermissions, openejbBeans, transactionPolicyHelper, 
enterpriseBeans, listener, policyContextID);
   
  
  
  

Reply via email to