dain 2004/04/03 20:49:10
Modified: modules/core/src/java/org/openejb/deployment
EJBConfigBuilder.java
Log:
Added deployment support for Stateful and BMP beans
Fixed more serialization problems
Added ContainerBuilder interface
Revision Changes Path
1.3 +154 -24
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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- EJBConfigBuilder.java 3 Apr 2004 22:20:10 -0000 1.2
+++ EJBConfigBuilder.java 4 Apr 2004 01:49:10 -0000 1.3
@@ -66,6 +66,7 @@
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.transaction.UserTransaction;
+import javax.naming.NamingException;
import org.apache.geronimo.common.xml.XmlBeansUtil;
import org.apache.geronimo.deployment.ConfigurationBuilder;
@@ -86,11 +87,18 @@
import org.apache.geronimo.xbeans.j2ee.EnterpriseBeansType;
import org.apache.geronimo.xbeans.j2ee.EnvEntryType;
import org.apache.geronimo.xbeans.j2ee.SessionBeanType;
+import org.apache.geronimo.xbeans.j2ee.EntityBeanType;
+import org.apache.geronimo.xbeans.j2ee.ResourceRefType;
+import org.apache.geronimo.xbeans.j2ee.ResourceEnvRefType;
import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlObject;
import org.openejb.EJBModule;
+import org.openejb.ContainerBuilder;
+import org.openejb.sfsb.StatefulContainerBuilder;
+import org.openejb.entity.bmp.BMPContainerBuilder;
+import org.openejb.entity.cmp.CMPContainerBuilder;
import org.openejb.slsb.StatelessContainerBuilder;
import org.openejb.transaction.EJBUserTransaction;
import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType;
@@ -132,13 +140,9 @@
moduleBase = new URL("jar:" + module.toString() + "!/");
}
XmlObject plan = XmlBeansUtil.getXmlObject(new URL(moduleBase,
"META-INF/openejb-jar.xml"), OpenejbOpenejbJarDocument.type);
-// todo needs generic web XMLBeans
+// todo should be able to deploy a naked EAR
// if (plan == null) {
-// plan = getPlan(new URL(moduleBase, "WEB-INF/geronimo-web.xml"));
-// }
-// todo should be able to deploy a naked WAR
-// if (plan == null) {
-// plan = getPlan(new URL(moduleBase, "WEB-INF/web.xml"),
WebAppDocument.type);
+// plan = getPlan(new URL(moduleBase, "META-INF/ejb-jar.xml"),
EjbJarDocument.type);
// }
return plan;
} catch (MalformedURLException e) {
@@ -277,12 +281,37 @@
GBeanMBean sessionGBean = createSessionBean(sessionObjectName,
sessionBean, openejbSessionBean, txPolicySource, cl);
context.addGBean(sessionObjectName, sessionGBean);
}
+
+
+ // Entity Beans
+ EntityBeanType[] entityBeans = enterpriseBeans.getEntityArray();
+ for (int i = 0; i < entityBeans.length; i++) {
+ EntityBeanType entityBean = entityBeans[i];
+ String ejbName = entityBean.getEjbName().getStringValue();
+ OpenejbEntityBeanType openejbEntityBean =
(OpenejbEntityBeanType)openejbBeans.get(ejbName);
+ TransactionPolicySource txPolicySource =
transactionPolicyHelper.getTransactionPolicySource(ejbName);
+
+ ObjectName entityObjectName = createEntityObjectName(
+ entityBean,
+ "openejb",
+ "null",
+ "null",
+ ejbModuleName);
+
+ GBeanMBean entityGBean = createEntityBean(entityObjectName, entityBean,
openejbEntityBean, txPolicySource, cl);
+ context.addGBean(entityObjectName, entityGBean);
+ }
}
public GBeanMBean createSessionBean(Object containerId, SessionBeanType
sessionBean, OpenejbSessionBeanType openejbSessionBean, TransactionPolicySource
transactionPolicySource, ClassLoader cl) throws DeploymentException {
String ejbName = sessionBean.getEjbName().getStringValue();
- StatelessContainerBuilder builder = new StatelessContainerBuilder();
+ ContainerBuilder builder = null;
+ if ("Stateless".equals(sessionBean.getSessionType().getStringValue())) {
+ builder = new StatelessContainerBuilder();
+ } else {
+ builder = new StatefulContainerBuilder();
+ }
builder.setClassLoader(cl);
builder.setContainerId(containerId);
builder.setEJBName(ejbName);
@@ -332,6 +361,54 @@
return createEJBObjectName(type, domainName, serverName, applicationName,
moduleName, ejbName);
}
+ public GBeanMBean createEntityBean(Object containerId, EntityBeanType
entityBean, OpenejbEntityBeanType openejbEntityBean, TransactionPolicySource
transactionPolicySource, ClassLoader cl) throws DeploymentException {
+ String ejbName = entityBean.getEjbName().getStringValue();
+
+ ContainerBuilder builder = null;
+ if ("Container".equals(entityBean.getPersistenceType().getStringValue())) {
+ builder = new CMPContainerBuilder();
+ } else {
+ 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.setTransactionPolicySource(transactionPolicySource);
+
+ try {
+ ReadOnlyContext compContext = buildComponentContext(entityBean,
openejbEntityBean, null, cl);
+ builder.setComponentContext(compContext);
+ } catch (Exception e) {
+ throw new DeploymentException("Unable to create EJB jndi environment:
ejbName" + ejbName, e);
+ }
+
+ 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) {
+ throw new DeploymentException("Unable to initialize EJBContainer GBean:
ejbName" + ejbName, e);
+ }
+ }
+
+ private ObjectName createEntityObjectName(
+ EntityBeanType entityBean,
+ String domainName,
+ String serverName,
+ String applicationName,
+ String moduleName) throws DeploymentException {
+
+ String ejbName = entityBean.getEjbName().getStringValue();
+
+ return createEJBObjectName("EntityBean", domainName, serverName,
applicationName, moduleName, ejbName);
+ }
+
private ObjectName createEJBObjectName(
String type,
String domainName,
@@ -355,13 +432,56 @@
}
private ReadOnlyContext buildComponentContext(SessionBeanType sessionBean,
OpenejbSessionBeanType openejbSessionBean, UserTransaction userTransaction,
ClassLoader cl) throws Exception {
+ // env entries
+ EnvEntryType[] envEntries = sessionBean.getEnvEntryArray();
+
+ // resource refs
+ ResourceRefType[] resourceRefs = sessionBean.getResourceRefArray();
+ OpenejbLocalRefType[] openejbResourceRefs = null;
+ if (openejbSessionBean != null) {
+ openejbResourceRefs = openejbSessionBean.getResourceRefArray();
+ }
+
+ // resource env refs
+ ResourceEnvRefType[] resourceEnvRefs = sessionBean.getResourceEnvRefArray();
+ OpenejbLocalRefType[] openejbResourceEnvRefs = null;
+ if (openejbSessionBean != null) {
+ openejbResourceEnvRefs = openejbSessionBean.getResourceEnvRefArray();
+ }
+
+ return buildComponentContext(envEntries, resourceRefs, openejbResourceRefs,
resourceEnvRefs, openejbResourceEnvRefs, userTransaction, cl);
+
+ }
+
+ private ReadOnlyContext buildComponentContext(EntityBeanType entityBean,
OpenejbEntityBeanType openejbEntityBean, UserTransaction userTransaction, ClassLoader
cl) throws Exception {
+ // env entries
+ EnvEntryType[] envEntries = entityBean.getEnvEntryArray();
+
+ // resource refs
+ ResourceRefType[] resourceRefs = entityBean.getResourceRefArray();
+ OpenejbLocalRefType[] openejbResourceRefs = null;
+ if (openejbEntityBean != null) {
+ openejbResourceRefs = openejbEntityBean.getResourceRefArray();
+ }
+
+ // resource env refs
+ ResourceEnvRefType[] resourceEnvRefs = entityBean.getResourceEnvRefArray();
+ OpenejbLocalRefType[] openejbResourceEnvRefs = null;
+ if (openejbEntityBean != null) {
+ openejbResourceEnvRefs = openejbEntityBean.getResourceEnvRefArray();
+ }
+
+ return buildComponentContext(envEntries, resourceRefs, openejbResourceRefs,
resourceEnvRefs, openejbResourceEnvRefs, userTransaction, cl);
+
+ }
+
+ private static ReadOnlyContext buildComponentContext(EnvEntryType[] envEntries,
ResourceRefType[] resourceRefs, OpenejbLocalRefType[] openejbResourceRefs,
ResourceEnvRefType[] resourceEnvRefs, OpenejbLocalRefType[] openejbResourceEnvRefs,
UserTransaction userTransaction, ClassLoader cl) throws NamingException,
DeploymentException {
ComponentContextBuilder builder = new ComponentContextBuilder(new
JMXReferenceFactory());
if (userTransaction != null) {
builder.addUserTransaction(userTransaction);
}
- EnvEntryType[] envEntries = sessionBean.getEnvEntryArray();
ENCConfigBuilder.addEnvEntries(envEntries, builder);
// todo ejb-ref
@@ -369,30 +489,40 @@
// todo ejb-local-ref
// resource-ref
- if(openejbSessionBean != null) {
- Map resourceRefMap = new HashMap();
- OpenejbLocalRefType[] openejbResourceRefs =
openejbSessionBean.getResourceRefArray();
- for (int i = 0; i < openejbResourceRefs.length; i++) {
- OpenejbLocalRefType jettyResourceRef = openejbResourceRefs[i];
- resourceRefMap.put(jettyResourceRef.getRefName(), new
OpenEJBRefAdapter(jettyResourceRef));
- }
- ENCConfigBuilder.addResourceRefs(sessionBean.getResourceRefArray(), cl,
resourceRefMap, builder);
+ if(openejbResourceRefs != null) {
+ addResourceRefs(resourceRefs, openejbResourceRefs, cl, builder);
}
// resource-env-ref
- if(openejbSessionBean != null) {
- Map resourceEnvRefMap = new HashMap();
- OpenejbLocalRefType[] openejbResourceEnvRefs =
openejbSessionBean.getResourceEnvRefArray();
+ if(openejbResourceEnvRefs != null) {
+ addResourceEnvRefs(resourceEnvRefs, openejbResourceEnvRefs, cl,
builder);
+ }
+
+ // todo message-destination-ref
+
+ return builder.getContext();
+ }
+
+ private static void addResourceEnvRefs(ResourceEnvRefType[] resourceEnvRefs,
OpenejbLocalRefType[] openejbResourceEnvRefs, ClassLoader cl, ComponentContextBuilder
builder) throws DeploymentException {
+ Map resourceEnvRefMap = new HashMap();
+ if (openejbResourceEnvRefs != null) {
for (int i = 0; i < openejbResourceEnvRefs.length; i++) {
OpenejbLocalRefType openejbResourceEnvRef =
openejbResourceEnvRefs[i];
resourceEnvRefMap.put(openejbResourceEnvRef.getRefName(), new
OpenEJBRefAdapter(openejbResourceEnvRef));
}
-
ENCConfigBuilder.addResourceEnvRefs(sessionBean.getResourceEnvRefArray(), cl,
resourceEnvRefMap, builder);
}
+ ENCConfigBuilder.addResourceEnvRefs(resourceEnvRefs, cl, resourceEnvRefMap,
builder);
+ }
- // todo message-destination-ref
-
- return builder.getContext();
+ private static void addResourceRefs(ResourceRefType[] resourceRefs,
OpenejbLocalRefType[] openejbResourceRefs, ClassLoader cl, ComponentContextBuilder
builder) throws DeploymentException {
+ Map resourceRefMap = new HashMap();
+ if (openejbResourceRefs != null) {
+ for (int i = 0; i < openejbResourceRefs.length; i++) {
+ OpenejbLocalRefType openejbResourceRef = openejbResourceRefs[i];
+ resourceRefMap.put(openejbResourceRef.getRefName(), new
OpenEJBRefAdapter(openejbResourceRef));
+ }
+ }
+ ENCConfigBuilder.addResourceRefs(resourceRefs, cl, resourceRefMap, builder);
}