dain        2004/04/18 19:35:02

  Modified:    modules/core/src/java/org/openejb/deployment
                        EJBConfigBuilder.java
  Log:

  Added very basic CMP support
  
  Revision  Changes    Path
  1.12      +110 -18   
openejb/modules/core/src/java/org/openejb/deployment/EJBConfigBuilder.java
  
  Index: EJBConfigBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/deployment/EJBConfigBuilder.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- EJBConfigBuilder.java     17 Apr 2004 20:35:20 -0000      1.11
  +++ EJBConfigBuilder.java     18 Apr 2004 23:35:02 -0000      1.12
  @@ -54,6 +54,7 @@
   import java.io.FileOutputStream;
   import java.io.IOException;
   import java.io.InputStream;
  +import java.lang.reflect.Method;
   import java.net.MalformedURLException;
   import java.net.URI;
   import java.net.URISyntaxException;
  @@ -84,6 +85,7 @@
   import org.apache.geronimo.naming.java.ReadOnlyContext;
   import org.apache.geronimo.naming.jmx.JMXReferenceFactory;
   import org.apache.geronimo.transaction.UserTransactionImpl;
  +import org.apache.geronimo.xbeans.j2ee.CmpFieldType;
   import org.apache.geronimo.xbeans.j2ee.EjbJarDocument;
   import org.apache.geronimo.xbeans.j2ee.EjbJarType;
   import org.apache.geronimo.xbeans.j2ee.EjbLocalRefType;
  @@ -96,8 +98,8 @@
   import org.apache.geronimo.xbeans.j2ee.SessionBeanType;
   import org.apache.xmlbeans.SchemaTypeLoader;
   import org.apache.xmlbeans.XmlBeans;
  -import org.apache.xmlbeans.XmlObject;
   import org.apache.xmlbeans.XmlException;
  +import org.apache.xmlbeans.XmlObject;
   
   import org.openejb.ContainerBuilder;
   import org.openejb.EJBModule;
  @@ -116,6 +118,8 @@
   import org.openejb.xbeans.ejbjar.OpenejbOpenejbJarType;
   import org.openejb.xbeans.ejbjar.OpenejbSessionBeanType;
   import org.openejb.xbeans.ejbjar.impl.OpenejbOpenejbJarDocumentImpl;
  +import org.tranql.ejb.CMPField;
  +import org.tranql.ejb.EJB;
   
   /**
    *
  @@ -139,7 +143,7 @@
           return new SchemaTypeLoader[]{XmlBeans.getContextTypeLoader()};
       }
   
  -    public XmlObject getDeploymentPlan(URL module)  throws XmlException {
  +    public XmlObject getDeploymentPlan(URL module) throws XmlException {
           try {
               URL moduleBase;
               if (module.toString().endsWith("/")) {
  @@ -158,7 +162,7 @@
           }
       }
   
  -    private OpenejbOpenejbJarDocument createDefaultPlan(URL module) throws 
XmlException {
  +    private OpenejbOpenejbJarDocument createDefaultPlan(URL module) {
           EjbJarDocument ejbJarDoc = (EjbJarDocument) 
XmlBeansUtil.getXmlObject(module, EjbJarDocument.type);
           if (ejbJarDoc == null) {
               return null;
  @@ -233,12 +237,7 @@
           if (ejbJarXml == null) {
               throw new DeploymentException("Module does not contain the ejb-jar.xml 
deployment descriptor");
           }
  -        EjbJarDocument doc = null;
  -        try {
  -            doc = (EjbJarDocument) XmlBeansUtil.getXmlObject(ejbJarXml, 
EjbJarDocument.type);
  -        } catch (XmlException e) {
  -            throw new DeploymentException(e);
  -        }
  +        EjbJarDocument doc = (EjbJarDocument) XmlBeansUtil.getXmlObject(ejbJarXml, 
EjbJarDocument.type);
           if (doc == null) {
               throw new DeploymentException("The ejb-jar.xml deployment descriptor is 
not valid");
           }
  @@ -279,6 +278,7 @@
           context.addGBean(ejbModuleObjectName, ejbModuleGBean);
   
           Map objectNameByEJBName = 
buildObjectNameByEJBNameMap(ejbJar.getEnterpriseBeans(), ejbModuleName);
  +        Map schema = buildCMPSchema(ejbJar, openejbEjbJar, cl);
   
           // create an index of the openejb ejb configurations by ejb-name
           Map openejbBeans = new HashMap();
  @@ -326,11 +326,60 @@
               ObjectName entityObjectName = (ObjectName) 
objectNameByEJBName.get(entityBean.getEjbName().getStringValue());
               OpenejbEntityBeanType openejbEntityBean = (OpenejbEntityBeanType) 
openejbBeans.get(entityObjectName);
   
  -            GBeanMBean entityGBean = 
createEntityBean(entityObjectName.getCanonicalName(), entityBean, openejbEntityBean, 
objectNameByEJBName, transactionPolicyHelper, cl);
  +            GBeanMBean entityGBean = null;
  +            if 
("Container".equals(entityBean.getPersistenceType().getStringValue())) {
  +                String connectionFactoryName = 
openejbEjbJar.getCmpConnectionFactory();
  +                entityGBean = createCMPBean(entityObjectName.getCanonicalName(), 
entityBean, openejbEntityBean, schema, connectionFactoryName,objectNameByEJBName, 
transactionPolicyHelper, cl);
  +            } else {
  +                entityGBean = createBMPBean(entityObjectName.getCanonicalName(), 
entityBean, openejbEntityBean, objectNameByEJBName, transactionPolicyHelper, cl);
  +            }
               context.addGBean(entityObjectName, entityGBean);
           }
       }
   
  +    private Map buildCMPSchema(EjbJarType ejbJar, OpenejbOpenejbJarType 
openejbEjbJar, ClassLoader cl) throws DeploymentException {
  +        Map schema = new HashMap();
  +        EntityBeanType[] entityBeans = ejbJar.getEnterpriseBeans().getEntityArray();
  +
  +        for (int i = 0; i < entityBeans.length; i++) {
  +            EntityBeanType entityBean = entityBeans[i];
  +            if 
("Container".equals(entityBean.getPersistenceType().getStringValue())) {
  +                String ejbName = entityBean.getEjbName().getStringValue();
  +                String abstractSchemaName = 
entityBean.getAbstractSchemaName().getStringValue();
  +                EJB ejb = new EJB(ejbName, abstractSchemaName);
  +
  +                Class ejbClass = null;
  +                try {
  +                    ejbClass = 
cl.loadClass(entityBean.getEjbClass().getStringValue());
  +                } catch (ClassNotFoundException e) {
  +                    throw new DeploymentException("Could not load cmp bean class: 
ejbName=" + ejbName + " ejbClass=" + entityBean.getEjbClass().getStringValue());
  +                }
  +                String primkeyField = entityBean.getPrimkeyField().getStringValue();
  +                CmpFieldType[] cmpFieldTypes = entityBean.getCmpFieldArray();
  +                for (int cmpFieldIndex = 0; cmpFieldIndex < cmpFieldTypes.length; 
cmpFieldIndex++) {
  +                    CmpFieldType cmpFieldType = cmpFieldTypes[cmpFieldIndex];
  +                    String fieldName = cmpFieldType.getFieldName().getStringValue();
  +                    Class fieldType = getCMPFieldType(fieldName, ejbClass);
  +                    CMPField cmpField = new CMPField(fieldName, fieldType, 
fieldName.equals(primkeyField));
  +                    ejb.addCMPField(cmpField);
  +                }
  +                schema.put(ejbName, ejb);
  +            }
  +        }
  +
  +        return schema;
  +    }
  +
  +    private static Class getCMPFieldType(String fieldName, Class beanClass) throws 
DeploymentException {
  +        try {
  +            String getterName = "get" + Character.toUpperCase(fieldName.charAt(0)) 
+ fieldName.substring(1);
  +            Method getter = beanClass.getMethod(getterName, null);
  +            return getter.getReturnType();
  +        } catch (Exception e) {
  +            throw new DeploymentException("Getter for CMP field not found: 
fieldName=" + fieldName + " beanClass=" + beanClass.getName());
  +        }
  +    }
  +
       private Map buildObjectNameByEJBNameMap(EnterpriseBeansType enterpriseBeans, 
String ejbModuleName) throws DeploymentException {
           Map map = new HashMap();
   
  @@ -423,7 +472,7 @@
               gbean.setReferencePatterns("TransactionManager", 
Collections.singleton(new ObjectName("*:type=TransactionManager,*")));
               gbean.setReferencePatterns("TrackedConnectionAssociator", 
Collections.singleton(new ObjectName("*:type=ConnectionTracker,*")));
               return gbean;
  -        } catch (Exception e) {
  +        } catch (Throwable e) {
               throw new DeploymentException("Unable to initialize EJBContainer GBean: 
ejbName" + ejbName, e);
           }
       }
  @@ -441,15 +490,51 @@
           return createEJBObjectName(type, domainName, serverName, applicationName, 
moduleName, ejbName);
       }
   
  -    public GBeanMBean createEntityBean(String containerId, EntityBeanType 
entityBean, OpenejbEntityBeanType openejbEntityBean, Map objectNameByEJBName, 
TransactionPolicyHelper transactionPolicyHelper, ClassLoader cl) throws 
DeploymentException {
  +    public GBeanMBean createBMPBean(String containerId, EntityBeanType entityBean, 
OpenejbEntityBeanType openejbEntityBean, Map objectNameByEJBName, 
TransactionPolicyHelper transactionPolicyHelper, ClassLoader cl) throws 
DeploymentException {
           String ejbName = entityBean.getEjbName().getStringValue();
   
  -        ContainerBuilder builder = null;
  -        if ("Container".equals(entityBean.getPersistenceType().getStringValue())) {
  -            builder = new CMPContainerBuilder();
  +        BMPContainerBuilder builder = new BMPContainerBuilder();
  +        builder.setClassLoader(cl);
  +        builder.setContainerId(containerId);
  +        builder.setEJBName(ejbName);
  +        builder.setBeanClassName(entityBean.getEjbClass().getStringValue());
  +        builder.setHomeInterfaceName(getJ2eeStringValue(entityBean.getHome()));
  +        builder.setRemoteInterfaceName(getJ2eeStringValue(entityBean.getRemote()));
  +        
builder.setLocalHomeInterfaceName(getJ2eeStringValue(entityBean.getLocalHome()));
  +        builder.setLocalInterfaceName(getJ2eeStringValue(entityBean.getLocal()));
  +        
builder.setPrimaryKeyClassName(getJ2eeStringValue(entityBean.getPrimKeyClass()));
  +        TransactionPolicySource transactionPolicySource = 
transactionPolicyHelper.getTransactionPolicySource(ejbName);
  +        builder.setTransactionPolicySource(transactionPolicySource);
  +
  +        try {
  +            ReadOnlyContext compContext = buildComponentContext(entityBean, 
openejbEntityBean, objectNameByEJBName, null, cl);
  +            builder.setComponentContext(compContext);
  +        } catch (Exception e) {
  +            throw new DeploymentException("Unable to create EJB jndi environment: 
ejbName=" + ejbName, e);
  +        }
  +
  +        if (openejbEntityBean != null) {
  +            builder.setJndiNames(openejbEntityBean.getJndiNameArray());
  +            builder.setLocalJndiNames(openejbEntityBean.getLocalJndiNameArray());
           } else {
  -            builder = new BMPContainerBuilder();
  +            builder.setJndiNames(new String[]{ejbName});
  +            builder.setLocalJndiNames(new String[]{"local/" + ejbName});
  +        }
  +
  +        try {
  +            GBeanMBean gbean = builder.createConfiguration();
  +            gbean.setReferencePatterns("TransactionManager", 
Collections.singleton(new ObjectName("*:type=TransactionManager,*")));
  +            gbean.setReferencePatterns("TrackedConnectionAssociator", 
Collections.singleton(new ObjectName("*:type=ConnectionTracker,*")));
  +            return gbean;
  +        } catch (Throwable e) {
  +            throw new DeploymentException("Unable to initialize EJBContainer GBean: 
ejbName=" + ejbName, e);
           }
  +    }
  +
  +    public GBeanMBean createCMPBean(String containerId, EntityBeanType entityBean, 
OpenejbEntityBeanType openejbEntityBean, Map schema, String connectionFactoryName, Map 
objectNameByEJBName, TransactionPolicyHelper transactionPolicyHelper, ClassLoader cl) 
throws DeploymentException {
  +        String ejbName = entityBean.getEjbName().getStringValue();
  +
  +        CMPContainerBuilder builder = new CMPContainerBuilder();
           builder.setClassLoader(cl);
           builder.setContainerId(containerId);
           builder.setEJBName(ejbName);
  @@ -477,12 +562,19 @@
               builder.setLocalJndiNames(new String[]{"local/" + ejbName});
           }
   
  +        EJB ejb = (EJB) schema.get(ejbName);
  +        if (ejb == null) {
  +            throw new DeploymentException("Internal error; could not locate schema 
for cmp entity: " + ejbName);
  +        }
  +        builder.setEJB(ejb);
  +        builder.setConnectionFactoryName(connectionFactoryName);
  +
           try {
               GBeanMBean gbean = builder.createConfiguration();
               gbean.setReferencePatterns("TransactionManager", 
Collections.singleton(new ObjectName("*:type=TransactionManager,*")));
               gbean.setReferencePatterns("TrackedConnectionAssociator", 
Collections.singleton(new ObjectName("*:type=ConnectionTracker,*")));
               return gbean;
  -        } catch (Exception e) {
  +        } catch (Throwable e) {
               throw new DeploymentException("Unable to initialize EJBContainer GBean: 
ejbName=" + ejbName, e);
           }
       }
  
  
  

Reply via email to