You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/03/08 19:07:04 UTC

svn commit: r516125 - in /incubator/openejb/trunk/openejb3/container/openejb-core/src: main/java/org/apache/openejb/config/ main/java/org/apache/openejb/core/mdb/ main/resources/META-INF/org.apache.openejb/ test/java/org/apache/openejb/assembler/classic/

Author: dain
Date: Thu Mar  8 10:07:03 2007
New Revision: 516125

URL: http://svn.apache.org/viewvc?view=rev&rev=516125
Log:
Match mdb container based on message listener type

Added:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/MdbConfigTest.java
Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?view=diff&rev=516125&r1=516124&r2=516125
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Thu Mar  8 10:07:03 2007
@@ -487,7 +487,7 @@
                             }
                         }
 
-                        if (mdb.getMessagingType() != null) {
+                        if (mdb.getMessagingType() == null) {
                             List<Class<?>> interfaces = new ArrayList<Class<?>>();
                             for (Class<?> interfce : clazz.getInterfaces()) {
                                 String name = interfce.getName();

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?view=diff&rev=516125&r1=516124&r2=516125
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Thu Mar  8 10:07:03 2007
@@ -23,6 +23,7 @@
 import org.apache.openejb.assembler.classic.ResourceInfo;
 import org.apache.openejb.config.sys.Connector;
 import org.apache.openejb.jee.ResourceRef;
+import org.apache.openejb.jee.MessageDrivenBean;
 import org.apache.openejb.jee.jpa.unit.Persistence;
 import org.apache.openejb.jee.jpa.unit.PersistenceUnit;
 import org.apache.openejb.jee.oejb3.EjbDeployment;
@@ -114,7 +115,7 @@
 
             if (ejbDeployment.getContainerId() == null) {
                 Class<? extends ContainerInfo> containerInfoType = ConfigurationFactory.getContainerInfoType(bean.getType());
-                String containerId = getUsableContainer(containerInfoType);
+                String containerId = getUsableContainer(containerInfoType, bean.getBean());
 
                 if (containerId == null){
                     if (autoCreateContainers) {
@@ -298,10 +299,19 @@
         return service;
     }
 
-    private String getUsableContainer(Class<? extends ContainerInfo> containerInfoType) {
+    private String getUsableContainer(Class<? extends ContainerInfo> containerInfoType, Object bean) {
         for (ContainerInfo containerInfo : configFactory.getContainerInfos()) {
             if (containerInfo.getClass().equals(containerInfoType)){
-                return containerInfo.id;
+                // MDBs must match message listener interface type
+                if (bean instanceof MessageDrivenBean) {
+                    MessageDrivenBean messageDrivenBean = (MessageDrivenBean) bean;
+                    String messagingType = messageDrivenBean.getMessagingType();
+                    if (containerInfo.properties.get("MessageListenerInterface").equals(messagingType)) {
+                        return containerInfo.id;
+                    }
+                } else {
+                    return containerInfo.id;
+                }
             }
         }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java?view=diff&rev=516125&r1=516124&r2=516125
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java Thu Mar  8 10:07:03 2007
@@ -53,17 +53,19 @@
     private final TransactionManager transactionManager;
     private final SecurityService securityService;
     private final ResourceAdapter resourceAdapter;
+    private final Class messageListenerInterface;
     private final Class activationSpecClass;
     private final int instanceLimit;
 
     private final Map<Object, DeploymentInfo> deployments = new HashMap<Object, DeploymentInfo>();
     private final Map<Object, EndpointFactory> endpointFactories = new HashMap<Object, EndpointFactory>();
 
-    public MdbContainer(Object containerID, TransactionManager transactionManager, SecurityService securityService, ResourceAdapter resourceAdapter, Class activationSpecClass, int instanceLimit) {
+    public MdbContainer(Object containerID, TransactionManager transactionManager, SecurityService securityService, ResourceAdapter resourceAdapter, Class messageListenerInterface, Class activationSpecClass, int instanceLimit) {
         this.containerID = containerID;
         this.transactionManager = transactionManager;
         this.securityService = securityService;
         this.resourceAdapter = resourceAdapter;
+        this.messageListenerInterface = messageListenerInterface;
         this.activationSpecClass = activationSpecClass;
         this.instanceLimit = instanceLimit;
     }
@@ -86,6 +88,12 @@
 
     public void deploy(DeploymentInfo deploymentInfo) throws OpenEJBException {
         Object deploymentId = deploymentInfo.getDeploymentID();
+        if (!deploymentInfo.getMdbInterface().equals(messageListenerInterface)) {
+            throw new OpenEJBException("Deployment '" + deploymentId + "' has message listener interface " +
+                    deploymentInfo.getMdbInterface().getName() + " but this MDB container only supports " +
+                    messageListenerInterface);
+        }
+
         // create the activation spec
         ActivationSpec activationSpec = createActivationSpec(deploymentInfo);
 
@@ -117,11 +125,6 @@
 
     }
 
-    public void undeploy(DeploymentInfo deploymentInfo) throws OpenEJBException {
-        // todo
-    }
-
-
     private ActivationSpec createActivationSpec(DeploymentInfo deploymentInfo)throws OpenEJBException {
         try {
             // initialize the object recipe
@@ -146,6 +149,11 @@
         } catch (Exception e) {
             throw new OpenEJBException("Unable to create activation spec", e);
         }
+    }
+
+    public void undeploy(DeploymentInfo deploymentInfo) throws OpenEJBException {
+        Object deploymentId = deploymentInfo.getDeploymentID();
+        undeploy(deploymentId);
     }
 
     public void undeploy(Object deploymentId) throws OpenEJBException {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml?view=diff&rev=516125&r1=516124&r2=516125
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml Thu Mar  8 10:07:03 2007
@@ -174,12 +174,16 @@
   <ServiceProvider
           id="Default MDB Container"
           provider-type="Container"
-          constructor="id, transactionManager, securityService, ResourceAdapter, ActivationSpecClass, InstanceLimit"
+          constructor="id, transactionManager, securityService, ResourceAdapter, MessageListenerInterface, ActivationSpecClass, InstanceLimit"
           class-name="org.apache.openejb.core.mdb.MdbContainer">
 
     # The resource adapter delivers messages to the container
 
     ResourceAdapter Default JMS Resource Adapter
+
+    # Specifies the message listener interface handled by this container
+
+    MessageListenerInterface javax.jms.MessageListener
 
     # Specifies the activation spec class
 

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/MdbConfigTest.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/MdbConfigTest.java?view=auto&rev=516125
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/MdbConfigTest.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/MdbConfigTest.java Thu Mar  8 10:07:03 2007
@@ -0,0 +1,90 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+import junit.framework.TestCase;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.config.sys.Resource;
+import org.apache.openejb.jee.ActivationConfig;
+import org.apache.openejb.jee.ActivationConfigProperty;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.MessageDrivenBean;
+import org.apache.openejb.test.mdb.BasicMdbBean;
+
+import javax.jms.MessageListener;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class MdbConfigTest extends TestCase {
+    public void test() throws Exception {
+        ConfigurationFactory config = new ConfigurationFactory();
+        Assembler assembler = new Assembler();
+
+        // System services
+        assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
+        assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
+        assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
+
+        // JMS
+        Resource resource = new Resource();
+        resource.setId("Default JMS Resource Adapter");
+        resource.setProvider("Default JMS Resource Adapter");
+        assembler.createResource(config.configureService(resource, ResourceInfo.class));
+
+        // containers
+        MdbContainerInfo mdbContainerInfo = config.configureService(MdbContainerInfo.class);
+        assembler.createContainer(mdbContainerInfo);
+
+        // add fake mdb container
+        ContainerInfo containerInfo = config.configureService(MdbContainerInfo.class);
+        containerInfo.id = "FakeContainer";
+        containerInfo.displayName = "Fake Container";
+        containerInfo.properties.setProperty("MessageListenerInterface", "java.lang.Runnable");
+        assembler.createContainer(containerInfo);
+
+        // generate ejb jar application
+        EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(createJaxbMdb("JmsMdb", BasicMdbBean.class.getName(), MessageListener.class.getName()));
+        ejbJar.addEnterpriseBean(createJaxbMdb("FakeMdb", FakeMdb.class.getName(), Runnable.class.getName()));
+        EjbModule ejbModule = new EjbModule(getClass().getClassLoader(), "FakeEjbJar", "fake.jar", ejbJar, null);
+
+        // configure and deploy it
+        EjbJarInfo info = config.configureApplication(ejbModule);
+        assembler.createEjbJar(info);
+    }
+
+    public static class FakeMdb implements Runnable {
+        public void run() {
+        }
+    }
+
+    private MessageDrivenBean createJaxbMdb(String ejbName, String mdbClass, String messageListenerInterface) {
+        MessageDrivenBean bean = new MessageDrivenBean(ejbName);
+        bean.setEjbClass(mdbClass);
+        bean.setMessagingType(messageListenerInterface);
+
+        ActivationConfig activationConfig = new ActivationConfig();
+        activationConfig.getActivationConfigProperty().add(new ActivationConfigProperty("destination", ejbName));
+        activationConfig.getActivationConfigProperty().add(new ActivationConfigProperty("destinationType", "javax.jms.Queue"));
+        bean.setActivationConfig(activationConfig);
+
+        return bean;
+    }
+}