[jboss-cvs] JBossAS SVN: r84047 - in projects/ejb3/trunk/embedded/src: main/resources/META-INF and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Feb 10 04:59:33 EST 2009


Author: jaikiran
Date: 2009-02-10 04:59:33 -0500 (Tue, 10 Feb 2009)
New Revision: 84047

Added:
   projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/Ejb3ComponentRegistry.java
   projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb3-connectors-jboss-beans.xml
   projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterRemote.java
Modified:
   projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/JBossEJBContainer.java
   projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb-deployers-beans.xml
   projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterBean.java
   projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/unit/GreeterTestCase.java
Log:
EJBTHREE-1723 Added support for deployment of beans with @Remote business interface. Introduced ejb3 connectors (ejb3-connectors-jboss-beans.xml). Also introduced Ejb3ComponentRegistry which acts as an indirection for Ejb3Registry. The Ejb3Registry is consulted by IsLocalInterceptor for deployed EJB containers

Added: projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/Ejb3ComponentRegistry.java
===================================================================
--- projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/Ejb3ComponentRegistry.java	                        (rev 0)
+++ projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/Ejb3ComponentRegistry.java	2009-02-10 09:59:33 UTC (rev 84047)
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.embedded;
+
+import org.jboss.ejb3.EJBContainer;
+import org.jboss.ejb3.Ejb3Registry;
+import org.jboss.logging.Logger;
+
+/**
+ * Ejb3ComponentRegistry
+ *
+ * Temporary workaround to an issue where MC does not allow
+ * static methods (of {@link Ejb3Registry}) to act as callbacks.
+ * Ejb3ComponentRegistry acts as an indirection to {@link Ejb3Registry}
+ * which maintains a registry of deployed EJB containers.
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class Ejb3ComponentRegistry
+{
+
+   /**
+    * Logger
+    */
+   private static Logger logger = Logger.getLogger(Ejb3ComponentRegistry.class);
+
+   /**
+    * Adds the <code>container</code> to the {@link Ejb3Registry}
+    *
+    * @param container
+    */
+   public void addContainer(EJBContainer container)
+   {
+      // We need the Ejb3Registry to hold these references, since that's where
+      // the IsLocalInterceptor looks for.
+      Ejb3Registry.register(container);
+      logger.debug("Container " + container + " added to registry");
+   }
+
+   /**
+    * Unregisters (an registered) <code>container</code> from {@link Ejb3Registry}
+    *
+    * @param container
+    */
+   public void removeContainer(EJBContainer container)
+   {
+      // unregsiter the container
+      // Bug in hasContainer implementation - The implementation uses the objectName of the container
+      // instead of guid to check the internal map of containers. Effectively always returns false.
+      // So let's skip this hasContainer check for now (risky, might throw exception if the container
+      // wasn't registered)
+      //         if (Ejb3Registry.hasContainer(container))
+      //         {
+      Ejb3Registry.unregister(container);
+      logger.debug("Container " + container + " removed from registry");
+   }
+}

Modified: projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/JBossEJBContainer.java
===================================================================
--- projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/JBossEJBContainer.java	2009-02-10 09:52:55 UTC (rev 84046)
+++ projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/JBossEJBContainer.java	2009-02-10 09:59:33 UTC (rev 84047)
@@ -51,17 +51,17 @@
 public class JBossEJBContainer extends EJBContainer
 {
    private static final Logger log = Logger.getLogger(JBossEJBContainer.class);
-   
+
    private ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-   
+
    // stage 1
    private BasicBootstrap bootstrap = new BasicBootstrap();
    private Kernel kernel;
    private BasicXMLDeployer deployer;
-   
+
    // stage 2
    private MainDeployer mainDeployer;
-   
+
    public JBossEJBContainer(Map<?, ?> properties, String... modules) throws Throwable
    {
       try
@@ -71,24 +71,26 @@
          deployer = new BasicXMLDeployer(kernel);
          // bring the main deployer online
          deploy("META-INF/embedded-bootstrap-beans.xml");
-         
+
          // we're at stage 2
          mainDeployer = getBean("MainDeployer", ControllerState.INSTALLED, MainDeployer.class);
-         
+
          deploy("META-INF/ejb-deployers-beans.xml");
-         
+
          deploy("META-INF/namingserver-beans.xml");
-         
+
          deploy("META-INF/aop-beans.xml");
-         
+
          deploy("META-INF/transactionmanager-beans.xml");
-         
+
          deploy("META-INF/jpa-deployers-beans.xml");
-         
+
          deploy("META-INF/ejb-container-beans.xml");
-         
+
+         deploy("META-INF/ejb3-connectors-jboss-beans.xml");
+
          deployMain("ejb3-interceptors-aop.xml");
-         
+
          deployModules(modules);
       }
       catch(Throwable t)
@@ -97,7 +99,7 @@
          throw t;
       }
    }
-   
+
    @Override
    public void close()
    {
@@ -107,7 +109,7 @@
          mainDeployer.shutdown();
          mainDeployer = null;
       }
-      
+
       if(deployer != null)
       {
          deployer.shutdown();
@@ -116,12 +118,12 @@
       kernel = null;
       bootstrap = null;
    }
-   
+
    private KernelDeployment deploy(String name) throws Throwable
    {
       return deploy(getResource(name));
    }
-   
+
    private KernelDeployment deploy(URL url) throws Throwable
    {
       log.info("Deploying " + url);
@@ -129,13 +131,13 @@
       deployer.validate(deployment);
       return deployment;
    }
-   
+
    private void deployMain(String name) throws DeploymentException, IllegalArgumentException, MalformedURLException, IOException
    {
       URL url = getResource(name);
       deployMain(url);
    }
-   
+
    private void deployMain(URL url) throws DeploymentException, IOException
    {
       log.info("Deploying " + url);
@@ -144,19 +146,19 @@
       mainDeployer.deploy(deployment);
       mainDeployer.checkComplete(deployment);
    }
-   
+
    private void deployModules(String modules[]) throws MalformedURLException, IOException, DeploymentException
    {
       // TODO: deploy the world!
       if(modules == null)
          return;
-      
+
       for(String module : modules)
       {
          deployMain(new URL(module));
       }
    }
-   
+
    /**
     * Get a bean
     *
@@ -170,7 +172,7 @@
       KernelControllerContext context = getControllerContext(name, state);
       return context.getTarget();
    }
-   
+
    /**
     * Get a bean
     *
@@ -189,7 +191,7 @@
       Object bean = getBean(name, state);
       return expected.cast(bean);
    }
-   
+
    /**
     * Get a context
     *
@@ -206,7 +208,7 @@
          return handleNotFoundContext(controller, name, state);
       return context;
    }
-   
+
    private URL getResource(String name) throws IllegalArgumentException
    {
       URL url = classLoader.getResource(name);
@@ -214,7 +216,7 @@
          throw new IllegalArgumentException("No resource named " + name + " found on " + classLoader);
       return url;
    }
-   
+
    /**
     * Handle not found context.
     *

Modified: projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb-deployers-beans.xml
===================================================================
--- projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb-deployers-beans.xml	2009-02-10 09:52:55 UTC (rev 84046)
+++ projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb-deployers-beans.xml	2009-02-10 09:59:33 UTC (rev 84047)
@@ -24,7 +24,7 @@
    <bean name="EjbParsingDeployer" class="org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer">
 
       <constructor>
-      	<parameter class="java.lang.Class">org.jboss.metadata.ejb.spec.EjbJarMetaData</parameter>
+        <parameter class="java.lang.Class">org.jboss.metadata.ejb.spec.EjbJarMetaData</parameter>
       </constructor>
       <property name="name">ejb-jar.xml</property>
       <!-- We need to be fast, so no schema validation -->
@@ -35,7 +35,7 @@
    <bean name="JBossEjbParsingDeployer" class="org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer">
 
       <constructor>
-      	<parameter class="java.lang.Class">org.jboss.metadata.ejb.jboss.JBossMetaData</parameter>
+        <parameter class="java.lang.Class">org.jboss.metadata.ejb.jboss.JBossMetaData</parameter>
       </constructor>
       <property name="name">jboss.xml</property>
       <!-- We need to be fast, so no schema validation -->
@@ -136,4 +136,19 @@
          </parameter>
       </constructor>
    </bean>
+
+   <!-- We could have directly used the org.jboss.ejb3.Ejb3Registry as a MC bean
+        and added the "register" and "unregister" methods as callbacks, but since
+        those methods are "static", MC complains and throws exception. So let's use
+        this indirection for the time being.
+
+        The Ejb3Registry is looked up by the IsLocalInterceptor for EJB containers.
+    -->
+
+    <bean name="EJB3ComponentRegistry" class="org.jboss.ejb3.embedded.Ejb3ComponentRegistry">
+      <!-- Accept any implementor of org.jboss.ejb3.EJBContainer -->
+      <incallback method="addContainer"/>
+      <uncallback method="removeContainer"/>
+    </bean>
+
 </deployment>
\ No newline at end of file

Added: projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb3-connectors-jboss-beans.xml
===================================================================
--- projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb3-connectors-jboss-beans.xml	                        (rev 0)
+++ projects/ejb3/trunk/embedded/src/main/resources/META-INF/ejb3-connectors-jboss-beans.xml	2009-02-10 09:59:33 UTC (rev 84047)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  EJB3 Connectors
+
+-->
+
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+  <!--
+
+    JBoss Remoting Connector
+
+    Note: Bean Name "org.jboss.ejb3.RemotingConnector" is used
+    as a lookup value; alter only after checking java references
+    to this key.
+
+  -->
+  <bean name="org.jboss.ejb3.RemotingConnector"
+    class="org.jboss.remoting.transport.Connector">
+
+    <!--  Not using Service Binding Manager, for now, in ejb3-embedded -->
+    <property name="invokerLocator">socket://0.0.0.0/3873</property>
+
+    <property name="serverConfiguration">
+      <inject bean="ServerConfiguration" />
+    </property>
+  </bean>
+
+  <!-- Remoting Server Configuration -->
+  <bean name="ServerConfiguration"
+    class="org.jboss.remoting.ServerConfiguration">
+    <property name="invocationHandlers">
+      <map keyClass="java.lang.String" valueClass="java.lang.String">
+        <entry>
+          <key>AOP</key>
+          <value>
+            org.jboss.aspects.remoting.AOPRemotingInvocationHandler
+          </value>
+        </entry>
+      </map>
+    </property>
+  </bean>
+
+</deployment>
\ No newline at end of file

Modified: projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterBean.java
===================================================================
--- projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterBean.java	2009-02-10 09:52:55 UTC (rev 84046)
+++ projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterBean.java	2009-02-10 09:59:33 UTC (rev 84047)
@@ -21,6 +21,8 @@
  */
 package org.jboss.ejb3.embedded.test.stateless;
 
+import javax.ejb.Local;
+import javax.ejb.Remote;
 import javax.ejb.Stateless;
 
 /**
@@ -28,6 +30,8 @@
  * @version $Revision: $
  */
 @Stateless
+ at Remote(GreeterRemote.class)
+ at Local (Greeter.class)
 public class GreeterBean implements Greeter
 {
    public String sayHi(String name)

Added: projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterRemote.java
===================================================================
--- projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterRemote.java	                        (rev 0)
+++ projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/GreeterRemote.java	2009-02-10 09:59:33 UTC (rev 84047)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.embedded.test.stateless;
+
+/**
+ * GreeterRemote
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public interface GreeterRemote extends Greeter
+{
+
+}

Modified: projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/unit/GreeterTestCase.java
===================================================================
--- projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/unit/GreeterTestCase.java	2009-02-10 09:52:55 UTC (rev 84046)
+++ projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/stateless/unit/GreeterTestCase.java	2009-02-10 09:59:33 UTC (rev 84047)
@@ -22,35 +22,44 @@
 package org.jboss.ejb3.embedded.test.stateless.unit;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import java.net.URL;
 import java.util.Date;
 import java.util.Properties;
 
 import javax.ejb.EJBContainer;
+import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
 import org.jboss.ejb3.embedded.test.stateless.Greeter;
+import org.jboss.ejb3.embedded.test.stateless.GreeterRemote;
+import org.jboss.logging.Logger;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-
 /**
  * @author <a href="mailto:cdewolf at redhat.com">Carlo de Wolf</a>
  * @version $Revision: $
  */
 public class GreeterTestCase
 {
+
+   /**
+    * Logger
+    */
+   private static Logger logger = Logger.getLogger(GreeterTestCase.class);
+
    @AfterClass
    public static void afterClass()
    {
       EJBContainer current = EJBContainer.getCurrentEJBContainer();
-      if(current != null)
+      if (current != null)
          current.close();
    }
-   
+
    @BeforeClass
    public static void beforeClass()
    {
@@ -59,7 +68,7 @@
       properties.setProperty(EJBContainer.EMBEDDABLE_MODULES_PROPERTY, module);
       EJBContainer.createEJBContainer(properties);
    }
-   
+
    private static String getURLToTestClasses()
    {
       String p = "org/jboss/ejb3/embedded/test";
@@ -67,7 +76,7 @@
       String s = url.toString();
       return s.substring(0, s.length() - p.length());
    }
-   
+
    @Test
    public void test1() throws NamingException
    {
@@ -77,7 +86,7 @@
       String actual = greeter.sayHi(now);
       assertEquals("Hi " + now, actual);
    }
-   
+
    @Test
    public void testGreeter2() throws NamingException
    {
@@ -87,4 +96,16 @@
       String actual = greeter.sayHi(now);
       assertEquals("Hi " + now, actual);
    }
+
+   @Test
+   public void testGreeterRemote() throws Exception
+   {
+      Context ctx = new InitialContext();
+      GreeterRemote remoteGreeter = (GreeterRemote) ctx.lookup("GreeterBean/remote");
+      String name = "newuser";
+      String messageFromGreeter = remoteGreeter.sayHi(name);
+      logger.info("Remote Greeter bean says: " + messageFromGreeter);
+      assertNotNull("Remote Greeter bean returned null message", messageFromGreeter);
+      assertEquals("Remote Greeter bean returned unexpected message", "Hi " + name, messageFromGreeter);
+   }
 }




More information about the jboss-cvs-commits mailing list