djencks 2004/06/25 17:35:11
Modified: modules/core/src/java/org/openejb/deployment
OpenEJBModuleBuilder.java
Log:
Implement message driven bean deployment and some of message-destination refs.
Update to howl 0.1.3
Revision Changes Path
1.10 +191 -7
openejb/modules/core/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java
Index: OpenEJBModuleBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- OpenEJBModuleBuilder.java 17 Jun 2004 07:08:22 -0000 1.9
+++ OpenEJBModuleBuilder.java 25 Jun 2004 21:35:11 -0000 1.10
@@ -69,6 +69,8 @@
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
+import javax.management.ReflectionException;
+import javax.management.AttributeNotFoundException;
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.transaction.UserTransaction;
@@ -83,12 +85,14 @@
import org.apache.geronimo.j2ee.deployment.EJBModule;
import org.apache.geronimo.j2ee.deployment.Module;
import org.apache.geronimo.j2ee.deployment.ModuleBuilder;
+import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.naming.deployment.ENCConfigBuilder;
import org.apache.geronimo.naming.java.ComponentContextBuilder;
import org.apache.geronimo.naming.java.ReadOnlyContext;
import org.apache.geronimo.naming.jmx.JMXReferenceFactory;
import org.apache.geronimo.schema.SchemaConversionUtils;
import org.apache.geronimo.transaction.UserTransactionImpl;
+import org.apache.geronimo.xbeans.j2ee.ActivationConfigPropertyType;
import org.apache.geronimo.xbeans.j2ee.CmpFieldType;
import org.apache.geronimo.xbeans.j2ee.EjbJarDocument;
import org.apache.geronimo.xbeans.j2ee.EjbJarType;
@@ -97,16 +101,21 @@
import org.apache.geronimo.xbeans.j2ee.EnterpriseBeansType;
import org.apache.geronimo.xbeans.j2ee.EntityBeanType;
import org.apache.geronimo.xbeans.j2ee.EnvEntryType;
+import org.apache.geronimo.xbeans.j2ee.MessageDestinationRefType;
+import org.apache.geronimo.xbeans.j2ee.MessageDrivenBeanType;
import org.apache.geronimo.xbeans.j2ee.ResourceEnvRefType;
import org.apache.geronimo.xbeans.j2ee.ResourceRefType;
import org.apache.geronimo.xbeans.j2ee.SessionBeanType;
+import org.apache.geronimo.connector.ActivationSpecInfo;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.openejb.ContainerBuilder;
import org.openejb.EJBModuleImpl;
+import org.openejb.ResourceEnvironmentBuilder;
import org.openejb.dispatch.MethodSignature;
import org.openejb.entity.bmp.BMPContainerBuilder;
import org.openejb.entity.cmp.CMPContainerBuilder;
+import org.openejb.mdb.MDBContainerBuilder;
import org.openejb.proxy.EJBProxyFactory;
import org.openejb.proxy.ProxyObjectFactory;
import org.openejb.proxy.ProxyRefAddr;
@@ -135,6 +144,12 @@
*/
public class OpenEJBModuleBuilder implements ModuleBuilder {
+ private final Kernel kernel;
+
+ public OpenEJBModuleBuilder(Kernel kernel) {
+ this.kernel = kernel;
+ }
+
public XmlObject getDeploymentPlan(URL module) throws XmlException {
try {
URL moduleBase;
@@ -358,6 +373,14 @@
earContext.addEJBLocalRef(module.getURI(), ejbName, reference);
}
}
+ // Message Driven Beans
+ // the only relevant action is to check that the messagingType is available.
+ MessageDrivenBeanType[] messageDrivenBeans =
enterpriseBeans.getMessageDrivenArray();
+ for (int i = 0; i < messageDrivenBeans.length; i++) {
+ MessageDrivenBeanType messageDrivenBean = messageDrivenBeans[i];
+ String messagingType =
getJ2eeStringValue(messageDrivenBean.getMessagingType());
+ assureEJBObjectInterface(messagingType, cl);
+ }
}
public void addGBeans(EARContext earContext, Module module, ClassLoader cl)
throws DeploymentException {
@@ -419,16 +442,17 @@
OpenejbEntityBeanType entityBean = openejbEntityBeans[i];
openejbBeans.put(entityBean.getEjbName(), entityBean);
}
- OpenejbMessageDrivenBeanType[] openejbMessageDrivenBean =
openejbEjbJar.getEnterpriseBeans().getMessageDrivenArray();
- for (int i = 0; i < openejbMessageDrivenBean.length; i++) {
- OpenejbMessageDrivenBeanType messageDrivenBean =
openejbMessageDrivenBean[i];
+ OpenejbMessageDrivenBeanType[] openejbMessageDrivenBeans =
openejbEjbJar.getEnterpriseBeans().getMessageDrivenArray();
+ for (int i = 0; i < openejbMessageDrivenBeans.length; i++) {
+ OpenejbMessageDrivenBeanType messageDrivenBean =
openejbMessageDrivenBeans[i];
openejbBeans.put(messageDrivenBean.getEjbName(), messageDrivenBean);
}
TransactionPolicyHelper transactionPolicyHelper = new
TransactionPolicyHelper(ejbJar.getAssemblyDescriptor().getContainerTransactionArray());
- // Session Beans
EnterpriseBeansType enterpriseBeans = ejbJar.getEnterpriseBeans();
+
+ // Session Beans
SessionBeanType[] sessionBeans = enterpriseBeans.getSessionArray();
for (int i = 0; i < sessionBeans.length; i++) {
SessionBeanType sessionBean = sessionBeans[i];
@@ -457,6 +481,23 @@
}
earContext.addGBean(entityObjectName, entityGBean);
}
+
+ // Message Driven Beans
+ MessageDrivenBeanType[] messageDrivenBeans =
enterpriseBeans.getMessageDrivenArray();
+ for (int i = 0; i < messageDrivenBeans.length; i++) {
+ MessageDrivenBeanType messageDrivenBean = messageDrivenBeans[i];
+
+ OpenejbMessageDrivenBeanType openejbMessageDrivenBean =
(OpenejbMessageDrivenBeanType)
openejbBeans.get(messageDrivenBean.getEjbName().getStringValue());
+ ObjectName messageDrivenObjectName = createEJBObjectName(earContext,
module.getName(), messageDrivenBean);
+ ObjectName activationSpecName =
createActivationSpecObjectName(earContext, module.getName(), messageDrivenBean);
+
+ String containerId = messageDrivenObjectName.getCanonicalName();
+ GBeanMBean activationSpecGBean =
createActivationSpecWrapperGBean(messageDrivenBean.getActivationConfig().getActivationConfigPropertyArray(),
openejbMessageDrivenBean.getResourceAdapterName(),
openejbMessageDrivenBean.getActivationSpecClass(), containerId);
+ GBeanMBean messageDrivenGBean = createMessageDrivenBean(earContext,
ejbModule, containerId, messageDrivenBean, openejbMessageDrivenBean,
activationSpecName, transactionPolicyHelper, cl);
+ earContext.addGBean(activationSpecName, activationSpecGBean);
+ earContext.addGBean(messageDrivenObjectName, messageDrivenGBean);
+ }
+
}
private void buildCMPSchema(EARContext earContext, String ejbModuleName,
EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar, ClassLoader cl, EJBSchema
ejbSchema, SQL92Schema sqlSchema) throws DeploymentException {
@@ -682,6 +723,94 @@
}
}
+ public GBeanMBean createMessageDrivenBean(EARContext earContext,
+ EJBModule ejbModule,
+ String containerId,
+ MessageDrivenBeanType
messageDrivenBean,
+ OpenejbMessageDrivenBeanType
openejbMessageDrivenBean,
+ ObjectName activationSpecWrapperName,
+ TransactionPolicyHelper
transactionPolicyHelper,
+ ClassLoader cl) throws
DeploymentException {
+
+ if (openejbMessageDrivenBean == null) {
+ throw new DeploymentException("openejb-jar.xml required to deploy an
mdb");
+ }
+
+ String ejbName = messageDrivenBean.getEjbName().getStringValue();
+
+ MDBContainerBuilder builder = new MDBContainerBuilder();
+ builder.setClassLoader(cl);
+ builder.setContainerId(containerId);
+ builder.setEJBName(ejbName);
+ builder.setBeanClassName(messageDrivenBean.getEjbClass().getStringValue());
+
builder.setEndpointInterfaceName(getJ2eeStringValue(messageDrivenBean.getMessagingType()));
+
+ UserTransactionImpl userTransaction;
+ //TODO this is probably wrong???
+ if ("Bean".equals(messageDrivenBean.getTransactionType().getStringValue()))
{
+ userTransaction = new UserTransactionImpl();
+ builder.setUserTransaction(userTransaction);
+
builder.setTransactionPolicySource(TransactionPolicyHelper.StatelessBMTPolicySource);
+ } else {
+ userTransaction = null;
+ TransactionPolicySource transactionPolicySource =
transactionPolicyHelper.getTransactionPolicySource(ejbName);
+ builder.setTransactionPolicySource(transactionPolicySource);
+ }
+
+ try {
+ ReadOnlyContext compContext = buildComponentContext(earContext,
ejbModule, messageDrivenBean, openejbMessageDrivenBean, userTransaction, cl);
+ builder.setComponentContext(compContext);
+ } catch (Exception e) {
+ throw new DeploymentException("Unable to create EJB jndi environment:
ejbName" + ejbName, e);
+ }
+
+ setResourceEnvironment(builder, messageDrivenBean.getResourceRefArray(),
openejbMessageDrivenBean.getResourceRefArray());
+
+ try {
+ GBeanMBean gbean = builder.createConfiguration();
+ gbean.setReferencePattern("transactionManager",
earContext.getTransactionManagerObjectName());
+ gbean.setReferencePattern("trackedConnectionAssociator",
earContext.getConnectionTrackerObjectName());
+ gbean.setReferencePattern("activationSpecWrapper",
activationSpecWrapperName);
+ return gbean;
+ } catch (Throwable e) {
+ throw new DeploymentException("Unable to initialize EJBContainer GBean:
ejbName" + ejbName, e);
+ }
+ }
+
+ private GBeanMBean
createActivationSpecWrapperGBean(ActivationConfigPropertyType[]
activationConfigProperties, String resourceAdapterName, String activationSpecClass,
String containerId) throws DeploymentException {
+ Map activationSpecMap = null;
+ ObjectName resourceAdapterObjectName = null;
+ try {
+ resourceAdapterObjectName = ObjectName.getInstance(resourceAdapterName);
+ activationSpecMap = (Map)kernel.getAttribute(resourceAdapterObjectName,
"activationSpecInfoMap");
+ } catch (Exception e) {
+ throw new DeploymentException(e);
+ }
+ ActivationSpecInfo activationSpecInfo =
(ActivationSpecInfo)activationSpecMap.get(activationSpecClass);
+ GBeanInfo activationSpecGBeanInfo=
activationSpecInfo.getActivationSpecGBeanInfo();
+ GBeanMBean activationSpecGBean = new GBeanMBean(activationSpecGBeanInfo);
+ try {
+ activationSpecGBean.setAttribute("activationSpecClass",
activationSpecInfo.getActivationSpecClass());
+ activationSpecGBean.setAttribute("containerId", containerId);
+ activationSpecGBean.setReferencePattern("resourceAdapterWrapper",
resourceAdapterObjectName);
+ } catch (ReflectionException e) {
+ throw new DeploymentException(e);
+ } catch (AttributeNotFoundException e) {
+ throw new DeploymentException(e);
+ }
+ for (int i = 0; i < activationConfigProperties.length; i++) {
+ ActivationConfigPropertyType activationConfigProperty =
activationConfigProperties[i];
+ String propertyName =
activationConfigProperty.getActivationConfigPropertyName().getStringValue();
+ String propertyValue =
activationConfigProperty.getActivationConfigPropertyValue().getStringValue();
+ try {
+ activationSpecGBean.setAttribute(propertyName, propertyValue);
+ } catch (Exception e) {
+ throw new DeploymentException("Could not set property: " +
propertyName + " to value: " + propertyValue + " on activationSpec: " +
activationSpecClass, e);
+ }
+ }
+ return activationSpecGBean;
+ }
+
private Object createEJBProxyFactory(String containerId, boolean isSessionBean,
String remoteInterfaceName, String homeInterfaceName, String localInterfaceName,
String localHomeInterfaceName, ClassLoader cl) throws DeploymentException {
Class remoteInterface = loadClass(cl, remoteInterfaceName);
Class homeInterface = loadClass(cl, homeInterfaceName);
@@ -712,6 +841,16 @@
return createEJBObjectName(earContext, moduleName, "EntityBean", ejbName);
}
+ private ObjectName createActivationSpecObjectName(EARContext earContext, String
moduleName, MessageDrivenBeanType messageDrivenBean) throws DeploymentException {
+ String ejbName = messageDrivenBean.getEjbName().getStringValue();
+ return createEJBObjectName(earContext, moduleName, "ActivationSpec",
ejbName);
+ }
+
+ private ObjectName createEJBObjectName(EARContext earContext, String
moduleName, MessageDrivenBeanType messageDrivenBean) throws DeploymentException {
+ String ejbName = messageDrivenBean.getEjbName().getStringValue();
+ return createEJBObjectName(earContext, moduleName, "MessageDrivenBean",
ejbName);
+ }
+
private ObjectName createEJBObjectName(EARContext earContext, String
moduleName, String type, String ejbName) throws DeploymentException {
Properties nameProps = new Properties();
nameProps.put("j2eeType", type);
@@ -779,7 +918,44 @@
}
- private static ReadOnlyContext buildComponentContext(EARContext earContext,
EJBModule ejbModule, EnvEntryType[] envEntries, EjbRefType[] ejbRefs,
EjbLocalRefType[] ejbLocalRefs, ResourceRefType[] resourceRefs, OpenejbLocalRefType[]
openejbResourceRefs, ResourceEnvRefType[] resourceEnvRefs, OpenejbLocalRefType[]
openejbResourceEnvRefs, UserTransaction userTransaction, ClassLoader cl) throws
NamingException, DeploymentException {
+
+ private ReadOnlyContext buildComponentContext(EARContext earContext, EJBModule
ejbModule, MessageDrivenBeanType messageDrivenBean, OpenejbMessageDrivenBeanType
openejbMessageDrivenBean, UserTransaction userTransaction, ClassLoader cl) throws
Exception {
+ // env entries
+ EnvEntryType[] envEntries = messageDrivenBean.getEnvEntryArray();
+
+ // ejb refs
+ EjbRefType[] ejbRefs = messageDrivenBean.getEjbRefArray();
+ EjbLocalRefType[] ejbLocalRefs = messageDrivenBean.getEjbLocalRefArray();
+
+ // resource refs
+ ResourceRefType[] resourceRefs = messageDrivenBean.getResourceRefArray();
+ OpenejbLocalRefType[] openejbResourceRefs = null;
+ if (openejbMessageDrivenBean != null) {
+ openejbResourceRefs = openejbMessageDrivenBean.getResourceRefArray();
+ }
+
+ // resource env refs
+ ResourceEnvRefType[] resourceEnvRefs =
messageDrivenBean.getResourceEnvRefArray();
+ OpenejbLocalRefType[] openejbResourceEnvRefs = null;
+ if (openejbMessageDrivenBean != null) {
+ openejbResourceEnvRefs =
openejbMessageDrivenBean.getResourceEnvRefArray();
+ }
+
+ return buildComponentContext(earContext, ejbModule, envEntries, ejbRefs,
ejbLocalRefs, resourceRefs, openejbResourceRefs, resourceEnvRefs,
openejbResourceEnvRefs, userTransaction, cl);
+
+ }
+
+ private static ReadOnlyContext buildComponentContext(EARContext earContext,
+ EJBModule ejbModule,
+ EnvEntryType[] envEntries,
+ EjbRefType[] ejbRefs,
+ EjbLocalRefType[]
ejbLocalRefs,
+ ResourceRefType[]
resourceRefs,
+ OpenejbLocalRefType[]
openejbResourceRefs,
+ ResourceEnvRefType[]
resourceEnvRefs,
+ OpenejbLocalRefType[]
openejbResourceEnvRefs,
+ UserTransaction
userTransaction,
+ ClassLoader cl) throws
NamingException, DeploymentException {
ComponentContextBuilder builder = new ComponentContextBuilder(new
JMXReferenceFactory());
if (userTransaction != null) {
@@ -890,7 +1066,7 @@
ENCConfigBuilder.addResourceRefs(resourceRefs, cl, resourceRefMap, builder);
}
- private void setResourceEnvironment(ContainerBuilder builder, ResourceRefType[]
resourceRefArray, OpenejbLocalRefType[] openejbResourceRefArray) {
+ private void setResourceEnvironment(ResourceEnvironmentBuilder builder,
ResourceRefType[] resourceRefArray, OpenejbLocalRefType[] openejbResourceRefArray) {
Map openejbNames = new HashMap();
for (int i = 0; i < openejbResourceRefArray.length; i++) {
OpenejbLocalRefType openejbLocalRefType = openejbResourceRefArray[i];
@@ -912,6 +1088,10 @@
builder.setApplicationManagedSecurityResources(applicationManagedSecurityResources);
}
+ private static void addMessageDestinationRefs(MessageDestinationRefType[]
messageDestinationRefs, ClassLoader cl, ComponentContextBuilder builder) throws
DeploymentException {
+ ENCConfigBuilder.addMessageDestinationRefs(messageDestinationRefs, cl,
builder);
+ }
+
private URI getDependencyURI(OpenejbDependencyType dep) throws
DeploymentException {
URI uri;
if (dep.isSetUri()) {
@@ -981,7 +1161,11 @@
static {
GBeanInfoFactory infoFactory = new
GBeanInfoFactory(OpenEJBModuleBuilder.class);
+ infoFactory.addAttribute("kernel", Kernel.class, false);
infoFactory.addInterface(ModuleBuilder.class);
+
+ infoFactory.setConstructor(new String[] {"kernel"});
+
GBEAN_INFO = infoFactory.getBeanInfo();
}