[jboss-cvs] JBossAS SVN: r74569 - in projects/ejb3/trunk/proxy: src/main/java/org/jboss/ejb3/proxy/factory/session and 9 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sat Jun 14 17:54:36 EDT 2008


Author: ALRubinger
Date: 2008-06-14 17:54:36 -0400 (Sat, 14 Jun 2008)
New Revision: 74569

Added:
   projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactory.java
   projects/ejb3/trunk/proxy/src/test/resources/org/jboss/ejb3/test/proxy/spec_3_4_5/
   projects/ejb3/trunk/proxy/src/test/resources/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/
   projects/ejb3/trunk/proxy/src/test/resources/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase-beans.xml
Modified:
   projects/ejb3/trunk/proxy/pom.xml
   projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactory.java
   projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionLocalProxyFactory.java
   projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactoryBase.java
   projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionRemoteProxyFactory.java
   projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/ProxyObjectFactory.java
   projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/session/stateful/StatefulSessionProxyObjectFactory.java
   projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/common/container/SessionContainer.java
   projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/ProxyEqualityTestCaseBase.java
   projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase.java
Log:
[EJBTHREE-1345] SFSB Proxy Factory implementations now responsible for obtaining SessionID from Container, not tacked onto the resultant Proxy by JNDI ObjectFactories

Modified: projects/ejb3/trunk/proxy/pom.xml
===================================================================
--- projects/ejb3/trunk/proxy/pom.xml	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/pom.xml	2008-06-14 21:54:36 UTC (rev 74569)
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.jboss.ejb3</groupId>
     <artifactId>jboss-ejb3-build</artifactId>
-    <version>0.13.7</version>
+    <version>0.13.9-SNAPSHOT</version>
   </parent>
 
   <!-- Model Version -->
@@ -109,7 +109,7 @@
       <artifactId>jboss-ejb3-common</artifactId>
       <version>0.1.1</version>
     </dependency>
-    
+
     <dependency>
       <groupId>org.jboss.ejb3</groupId>
       <artifactId>jboss-ejb3-interceptors</artifactId>

Modified: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactory.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactory.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/SessionProxyFactory.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -60,7 +60,6 @@
     * target business interface name (expressed as 
     * a fully-qualified class name)
     * 
-    * @param id
     * @param businessInterfaceName
     * @return
     */

Modified: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionLocalProxyFactory.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionLocalProxyFactory.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionLocalProxyFactory.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -23,6 +23,10 @@
 
 import java.util.Set;
 
+import org.jboss.ejb3.common.registrar.spi.Ejb3Registrar;
+import org.jboss.ejb3.common.registrar.spi.Ejb3RegistrarLocator;
+import org.jboss.ejb3.common.registrar.spi.NotBoundException;
+import org.jboss.ejb3.proxy.container.StatefulSessionInvokableContext;
 import org.jboss.ejb3.proxy.factory.session.SessionProxyFactory;
 import org.jboss.ejb3.proxy.handler.session.SessionProxyInvocationHandler;
 import org.jboss.ejb3.proxy.handler.session.stateful.StatefulLocalProxyInvocationHandler;
@@ -112,4 +116,38 @@
       // Return
       return handler;
    }
+
+   /**
+    * Obtains the Container used by this Proxy Factory
+    * 
+    * @return The Container for this Proxy Factory
+    */
+   @Override
+   protected StatefulSessionInvokableContext<?> obtainContainer()
+   {
+      /*
+       * Obtain the Container
+       */
+      StatefulSessionInvokableContext<?> container = null;
+      String containerName = this.getContainerName();
+
+      // Lookup from EJB3 Registrar
+      try
+      {
+         Object obj = Ejb3RegistrarLocator.locateRegistrar().lookup(containerName);
+         assert obj instanceof StatefulSessionInvokableContext : "Container retrieved from "
+               + Ejb3Registrar.class.getSimpleName() + " was not of expected type "
+               + StatefulSessionInvokableContext.class.getName() + " but was instead " + obj;
+         container = (StatefulSessionInvokableContext<?>) obj;
+      }
+      catch (NotBoundException nbe)
+      {
+         throw new RuntimeException(StatefulSessionProxyFactory.class.getSimpleName() + " " + this
+               + " has defined container name \"" + containerName + "\", but this could not be found in the "
+               + Ejb3Registrar.class.getSimpleName());
+      }
+
+      // Return
+      return container;
+   }
 }

Added: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactory.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactory.java	                        (rev 0)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactory.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -0,0 +1,80 @@
+/*
+ * 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.proxy.factory.session.stateful;
+
+import org.jboss.ejb3.proxy.factory.session.SessionProxyFactory;
+
+/**
+ * StatefulSessionProxyFactory
+ * 
+ * Extension for SFSB Proxy Factories in which case methods defined
+ * by SessionProxyFactory result in creation of a new Session, while
+ * the overloaded methods provided here may create a Proxy for a specified
+ * Session ID
+ *
+ * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
+ * @version $Revision: $
+ */
+public interface StatefulSessionProxyFactory extends SessionProxyFactory
+{
+   /**
+    * Create an EJB2.x Home Proxy
+    * 
+    * @param sessionId
+    * @return
+    */
+   Object createProxyHome(Object sessionId);
+
+   /**
+    * Create an EJB3 Business proxy with no 
+    * specific target business interface.  The 
+    * returned proxy will implement all appropriate
+    * business interfaces.  Additionally, if
+    * the Home interface is bound alongside 
+    * the Default (same JNDI Name), this 
+    * Proxy will implement the Home interface as well. 
+    * 
+    * @param sessionId
+    * @return
+    */
+   Object createProxyDefault(Object sessionId);
+
+   /**
+    * Create an EJB3 Business Proxy specific to the specified
+    * target business interface name (expressed as 
+    * a fully-qualified class name)
+    * 
+    * @param sessionId
+    * @param businessInterfaceName
+    * @return
+    */
+   Object createProxyBusiness(Object sessionId, String businessInterfaceName);
+
+   /**
+    * Create an EJB2.x Proxy 
+    * 
+    * @param sessionId
+    * @return
+    */
+   Object createProxyEjb2x(Object sessionId);
+
+}

Modified: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactoryBase.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactoryBase.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionProxyFactoryBase.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -21,11 +21,16 @@
  */
 package org.jboss.ejb3.proxy.factory.session.stateful;
 
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
 import java.util.Set;
 
-import org.jboss.ejb3.proxy.factory.session.SessionProxyFactory;
+import org.jboss.ejb3.common.registrar.spi.NotBoundException;
+import org.jboss.ejb3.proxy.container.StatefulSessionInvokableContext;
 import org.jboss.ejb3.proxy.factory.session.SessionProxyFactoryBase;
+import org.jboss.ejb3.proxy.handler.session.stateful.StatefulProxyInvocationHandlerBase;
 import org.jboss.ejb3.proxy.intf.StatefulSessionProxy;
+import org.jboss.ejb3.proxy.invocation.StatefulSessionContainerMethodInvocation;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
 /**
@@ -36,9 +41,20 @@
  * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
  * @version $Revision: $
  */
-public abstract class StatefulSessionProxyFactoryBase extends SessionProxyFactoryBase implements SessionProxyFactory
+public abstract class StatefulSessionProxyFactoryBase extends SessionProxyFactoryBase
+      implements
+         StatefulSessionProxyFactory
 {
    // --------------------------------------------------------------------------------||
+   // Instance Members ---------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * The Container used by this SFSB Proxy Factory
+    */
+   private transient StatefulSessionInvokableContext<?> container;
+
+   // --------------------------------------------------------------------------------||
    // Constructor --------------------------------------------------------------------||
    // --------------------------------------------------------------------------------||
 
@@ -95,4 +111,231 @@
       // Return
       return interfaces;
    }
+
+   // --------------------------------------------------------------------------------||
+   // Overridden Implementations -----------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Create an EJB2.x Home Proxy
+    * 
+    * @return
+    */
+   @Override
+   public Object createProxyHome()
+   {
+      Object sessionId = this.getNewSessionId();
+      return this.createProxyHome(sessionId);
+   }
+
+   /**
+    * Create an EJB3 Business proxy with no 
+    * specific target business interface.  The 
+    * returned proxy will implement all appropriate
+    * business interfaces.  Additionally, if
+    * the Home interface is bound alongside 
+    * the Default (same JNDI Name), this 
+    * Proxy will implement the Home interface as well.
+    * 
+    * @return
+    */
+   @Override
+   public Object createProxyDefault()
+   {
+      Object sessionId = this.getNewSessionId();
+      return this.createProxyDefault(sessionId);
+   }
+
+   /**
+    * Create an EJB3 Business Proxy specific to the specified
+    * target business interface name (expressed as 
+    * a fully-qualified class name)
+    * 
+    * @param businessInterfaceName
+    * @return
+    */
+   @Override
+   public Object createProxyBusiness(final String businessInterfaceName)
+   {
+      Object sessionId = this.getNewSessionId();
+      return this.createProxyBusiness(sessionId, businessInterfaceName);
+   }
+
+   /**
+    * Create an EJB2.x Proxy 
+    * 
+    * @return
+    */
+   @Override
+   public Object createProxyEjb2x()
+   {
+      Object sessionId = this.getNewSessionId();
+      return this.createProxyEjb2x(sessionId);
+   }
+
+   // --------------------------------------------------------------------------------||
+   // Required Implementations -------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Create an EJB2.x Home Proxy
+    * 
+    * @param sessionId
+    * @return
+    */
+   public Object createProxyHome(Object sessionId)
+   {
+      // Obtain Proxy using Super Implementation
+      Object proxy = super.createProxyHome();
+
+      // Associate with session
+      this.associateProxyWithSession(proxy, sessionId);
+
+      // Return
+      return proxy;
+   }
+
+   /**
+    * Create an EJB3 Business proxy with no 
+    * specific target business interface.  The 
+    * returned proxy will implement all appropriate
+    * business interfaces.  Additionally, if
+    * the Home interface is bound alongside 
+    * the Default (same JNDI Name), this 
+    * Proxy will implement the Home interface as well. 
+    * 
+    * @param sessionId
+    * @return
+    */
+   public Object createProxyDefault(Object sessionId)
+   {
+      // Obtain Proxy using Super Implementation
+      Object proxy = super.createProxyDefault();
+
+      // Associate with session
+      this.associateProxyWithSession(proxy, sessionId);
+
+      // Return
+      return proxy;
+   }
+
+   /**
+    * Create an EJB3 Business Proxy specific to the specified
+    * target business interface name (expressed as 
+    * a fully-qualified class name)
+    * 
+    * @param sessionId
+    * @param businessInterfaceName
+    * @return
+    */
+   public Object createProxyBusiness(Object sessionId, String businessInterfaceName)
+   {
+      // Obtain Proxy using Super Implementation
+      Object proxy = super.createProxyBusiness(businessInterfaceName);
+
+      // Associate with session
+      this.associateProxyWithSession(proxy, sessionId);
+
+      // Return
+      return proxy;
+   }
+
+   /**
+    * Create an EJB2.x Proxy 
+    * 
+    * @param sessionId
+    * @return
+    */
+   public Object createProxyEjb2x(Object sessionId)
+   {
+      // Obtain Proxy using Super Implementation
+      Object proxy = super.createProxyEjb2x();
+
+      // Associate with session
+      this.associateProxyWithSession(proxy, sessionId);
+
+      // Return
+      return proxy;
+   }
+
+   // --------------------------------------------------------------------------------||
+   // Internal Helper Methods --------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Associates the specified Proxy with the session denoted by 
+    * the specified sessionId
+    * 
+    * @param proxy
+    * @param sessionId
+    */
+   protected void associateProxyWithSession(Object proxy, Object sessionId)
+   {
+      // Obtain the InvocationHandler
+      InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+      assert handler instanceof StatefulProxyInvocationHandlerBase : "SFSB Proxy must be of type "
+            + StatefulProxyInvocationHandlerBase.class.getName();
+      StatefulProxyInvocationHandlerBase sHandler = (StatefulProxyInvocationHandlerBase) handler;
+
+      // Set the Session ID on the Proxy
+      sHandler.setSessionId(sessionId);
+   }
+
+   /**
+    * Creates a new Session on the container and returns the ID
+    * representing this newly-created session
+    * 
+    * @return The ID of the new session
+    */
+   protected Object getNewSessionId()
+   {
+      // Obtain the Container
+      StatefulSessionInvokableContext<?> container = this.getContainer();
+
+      // Get a new Session ID from the Container
+      Object sessionId = null;
+      try
+      {
+         sessionId = container.createSession();
+      }
+      catch (NotBoundException e)
+      {
+         throw new RuntimeException("Could not obtain a new Session ID from SFSB Container \"" + container + "\"", e);
+      }
+
+      // Return the new ID
+      return sessionId;
+   }
+
+   // --------------------------------------------------------------------------------||
+   // Contracts ----------------------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   /**
+    * Obtains the Container used by this Proxy Factory
+    * 
+    * @return The Container for this Proxy Factory
+    */
+   protected abstract StatefulSessionInvokableContext<?> obtainContainer();
+
+   // --------------------------------------------------------------------------------||
+   // Accessors / Mutators -----------------------------------------------------------||
+   // --------------------------------------------------------------------------------||
+
+   public StatefulSessionInvokableContext<?> getContainer()
+   {
+      if (this.container == null)
+      {
+         this.setContainer(this.obtainContainer());
+      }
+
+      return this.container;
+   }
+
+   public void setContainer(
+         StatefulSessionInvokableContext<? extends StatefulSessionContainerMethodInvocation> container)
+   {
+      this.container = container;
+   }
+
 }

Modified: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionRemoteProxyFactory.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionRemoteProxyFactory.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/factory/session/stateful/StatefulSessionRemoteProxyFactory.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -21,13 +21,21 @@
  */
 package org.jboss.ejb3.proxy.factory.session.stateful;
 
+import java.lang.reflect.Proxy;
+import java.net.MalformedURLException;
 import java.util.Set;
 
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aspects.remoting.InvokeRemoteInterceptor;
+import org.jboss.aspects.remoting.PojiProxy;
+import org.jboss.ejb3.proxy.container.StatefulSessionInvokableContext;
 import org.jboss.ejb3.proxy.factory.session.SessionProxyFactory;
 import org.jboss.ejb3.proxy.handler.session.SessionProxyInvocationHandler;
 import org.jboss.ejb3.proxy.handler.session.stateful.StatefulRemoteProxyInvocationHandler;
+import org.jboss.ejb3.proxy.remoting.IsLocalProxyFactoryInterceptor;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
+import org.jboss.remoting.InvokerLocator;
 
 /**
  * StatefulSessionRemoteProxyFactory
@@ -43,7 +51,7 @@
    // Class Members ------------------------------------------------------------------||
    // --------------------------------------------------------------------------------||
 
-   private static final Logger logger = Logger.getLogger(StatefulSessionRemoteProxyFactory.class);
+   private static final Logger log = Logger.getLogger(StatefulSessionRemoteProxyFactory.class);
 
    private static final String STACK_NAME_STATEFUL_SESSION_CLIENT_INTERCEPTORS = "StatefulSessionClientInterceptors";
 
@@ -142,6 +150,50 @@
       return handler;
    }
 
+   /**
+    * Obtains the Container used by this Proxy Factory
+    * 
+    * @return The Container for this Proxy Factory
+    */
+   @Override
+   protected StatefulSessionInvokableContext<?> obtainContainer()
+   {
+      /*
+       * Obtain the Container
+       */
+      StatefulSessionInvokableContext<?> container = null;
+      String containerName = this.getContainerName();
+
+      // Create an InvokerLocator
+      String url = this.getUrl();
+      assert url != null && !url.trim().equals("") : InvokerLocator.class.getSimpleName()
+            + " URL is required, but is not specified for " + this;
+      InvokerLocator locator = null;
+      try
+      {
+         locator = new InvokerLocator(url);
+      }
+      catch (MalformedURLException e)
+      {
+         throw new RuntimeException(
+               "URL for " + InvokerLocator.class.getSimpleName() + " in " + this + " was improper", e);
+      }
+
+      // Create a POJI Proxy to the Container
+      Interceptor[] interceptors =
+      {IsLocalProxyFactoryInterceptor.singleton, InvokeRemoteInterceptor.singleton};
+      PojiProxy handler = new PojiProxy(containerName, locator, interceptors);
+      Class<?>[] interfaces = new Class<?>[]
+      {StatefulSessionInvokableContext.class};
+      container = (StatefulSessionInvokableContext<?>) Proxy.newProxyInstance(interfaces[0].getClassLoader(),
+            interfaces, handler);
+      log.debug("Created Remoting Proxy to " + StatefulSessionInvokableContext.class.getSimpleName() + " with name "
+            + containerName + " using URL " + url);
+
+      // Return
+      return container;
+   }
+
    // --------------------------------------------------------------------------------||
    // Accessors / Mutators -----------------------------------------------------------||
    // --------------------------------------------------------------------------------||

Modified: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/ProxyObjectFactory.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/ProxyObjectFactory.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/ProxyObjectFactory.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -139,10 +139,12 @@
       catch (NotBoundException nbe)
       {
          // Obtain the URL for invoking upon the Registry
-         String url = this.getSingleReferenceAddressValue(name, refAddrs,
+         String url = this.getSingleRequiredReferenceAddressValue(name, refAddrs,
                ProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_INVOKER_LOCATOR_URL);
 
          // Create an InvokerLocator
+         assert url != null && !url.trim().equals("") : InvokerLocator.class.getSimpleName()
+               + " URL is required, but is not specified; improperly bound reference in JNDI";
          InvokerLocator locator = new InvokerLocator(url);
 
          // Create a POJI Proxy to the Registrar

Modified: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/session/stateful/StatefulSessionProxyObjectFactory.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/session/stateful/StatefulSessionProxyObjectFactory.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/objectfactory/session/stateful/StatefulSessionProxyObjectFactory.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -21,27 +21,13 @@
  */
 package org.jboss.ejb3.proxy.objectfactory.session.stateful;
 
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
-import java.net.MalformedURLException;
 import java.util.List;
 import java.util.Map;
 
 import javax.naming.Name;
 
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aspects.remoting.InvokeRemoteInterceptor;
-import org.jboss.aspects.remoting.PojiProxy;
-import org.jboss.ejb3.common.registrar.spi.Ejb3Registrar;
-import org.jboss.ejb3.common.registrar.spi.Ejb3RegistrarLocator;
-import org.jboss.ejb3.common.registrar.spi.NotBoundException;
-import org.jboss.ejb3.proxy.container.StatefulSessionInvokableContext;
 import org.jboss.ejb3.proxy.factory.ProxyFactory;
-import org.jboss.ejb3.proxy.handler.session.stateful.StatefulProxyInvocationHandlerBase;
-import org.jboss.ejb3.proxy.objectfactory.ProxyFactoryReferenceAddressTypes;
 import org.jboss.ejb3.proxy.objectfactory.session.SessionProxyObjectFactory;
-import org.jboss.ejb3.proxy.remoting.IsLocalProxyFactoryInterceptor;
-import org.jboss.remoting.InvokerLocator;
 
 /**
  * StatefulSessionProxyObjectFactory
@@ -77,67 +63,6 @@
       // Create a new Proxy Instance
       Object proxy = this.createProxy(proxyFactory, name, referenceAddresses);
 
-      // Obtain the InvocationHandler
-      InvocationHandler handler = Proxy.getInvocationHandler(proxy);
-      assert handler instanceof StatefulProxyInvocationHandlerBase : "SFSB Proxy must be of type "
-            + StatefulProxyInvocationHandlerBase.class.getName();
-      StatefulProxyInvocationHandlerBase sHandler = (StatefulProxyInvocationHandlerBase) handler;
-
-      /*
-       * Obtain the Container
-       */
-      StatefulSessionInvokableContext<?> container = null;
-      String containerName = this.getSingleRequiredReferenceAddressValue(name, referenceAddresses,
-            ProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_EJBCONTAINER_NAME);
-
-      // Attempt to obtain locally
-      try
-      {
-         Object obj = Ejb3RegistrarLocator.locateRegistrar().lookup(containerName);
-         assert obj instanceof StatefulSessionInvokableContext : "Container retrieved from "
-               + Ejb3Registrar.class.getSimpleName() + " was not of expected type "
-               + StatefulSessionInvokableContext.class.getName() + " but was instead " + obj;
-         container = (StatefulSessionInvokableContext<?>) obj;
-      }
-      // Remote
-      catch (NotBoundException nbe)
-      {
-         // Create a POJI Proxy to the Container
-         String url = this.getSingleRequiredReferenceAddressValue(name, referenceAddresses,
-               ProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_INVOKER_LOCATOR_URL);
-         InvokerLocator locator = null;
-         try
-         {
-            locator = new InvokerLocator(url);
-         }
-         catch (MalformedURLException e)
-         {
-            throw new RuntimeException();
-         }
-         Interceptor[] interceptors =
-         {IsLocalProxyFactoryInterceptor.singleton, InvokeRemoteInterceptor.singleton};
-         PojiProxy proxyHandler = new PojiProxy(containerName, locator, interceptors);
-         Class<?>[] interfaces = new Class<?>[]
-         {StatefulSessionInvokableContext.class};
-         container = (StatefulSessionInvokableContext<?>) Proxy.newProxyInstance(interfaces[0].getClassLoader(),
-               interfaces, proxyHandler);
-      }
-
-      // Get a new Session ID from the Container
-      Object sessionId = null;
-      try
-      {
-         sessionId = container.createSession();
-      }
-      catch (NotBoundException e)
-      {
-         throw new RuntimeException("Could not obtain a new Session ID from SFSB Container with name \""
-               + containerName + "\"", e);
-      }
-
-      // Set the Session ID on the Proxy
-      sHandler.setSessionId(sessionId);
-
       // Return the Proxy
       return proxy;
    }

Modified: projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/common/container/SessionContainer.java
===================================================================
--- projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/common/container/SessionContainer.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/common/container/SessionContainer.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -76,6 +76,11 @@
     */
    private Class<?> beanClass;
 
+   /**
+    * The optional JNDI Registrar
+    */
+   private JndiSessionRegistrarBase jndiRegistrar;
+
    // --------------------------------------------------------------------------------||
    // Constructor --------------------------------------------------------------------||
    // --------------------------------------------------------------------------------||
@@ -167,7 +172,7 @@
    public void start() throws Throwable
    {
       log.info("Starting " + this);
-      
+
       // Register with Remoting
       Dispatcher.singleton.registerTarget(this.getName(), this);
 
@@ -177,6 +182,7 @@
       // Bind all appropriate references/factories to Global JNDI for Client access, if a JNDI Registrar is present
       if (registrar != null)
       {
+         this.setJndiRegistrar(registrar);
          registrar.bindEjb(this.getMetaData(), this.getClassLoader(), this.getName());
       }
       else
@@ -191,13 +197,18 @@
    public void stop()
    {
       log.info("Stopping " + this);
-      
+
       // Deregister with Remoting
       Dispatcher.singleton.unregisterTarget(this.getName());
 
-      //TODO We need to unbind the EJB, something like:
-      //JndiSessionRegistrarBase.unbindEjb(this.metaData);
-      // or some key by which the registrar will keep track of all bindings
+      // Obtain registrar
+      JndiSessionRegistrarBase registrar = this.getJndiRegistrar();
+
+      // If the registrar has been used for this container, unbind all JNDI references
+      if (registrar != null)
+      {
+         registrar.unbindEjb(this.getMetaData());
+      }
    }
 
    /**
@@ -209,7 +220,7 @@
    {
       // Initialize
       String jndiRegistrarBindName = this.getJndiRegistrarBindName();
-      
+
       // Obtain Registrar
       Ejb3Registrar registrar = Ejb3RegistrarLocator.locateRegistrar();
 
@@ -305,4 +316,9 @@
    {
       this.beanClass = beanClass;
    }
+
+   public void setJndiRegistrar(JndiSessionRegistrarBase jndiRegistrar)
+   {
+      this.jndiRegistrar = jndiRegistrar;
+   }
 }

Modified: projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/ProxyEqualityTestCaseBase.java
===================================================================
--- projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/ProxyEqualityTestCaseBase.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/ProxyEqualityTestCaseBase.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -129,7 +129,7 @@
    }
 
    @AfterClass
-   public static void afterClass() throws Exception
+   public static void afterClass() throws Throwable
    {
       // Shutdown MC
       ProxyEqualityTestCaseBase.getBootstrap().shutdown();

Modified: projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase.java
===================================================================
--- projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase.java	2008-06-14 21:52:36 UTC (rev 74568)
+++ projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase.java	2008-06-14 21:54:36 UTC (rev 74569)
@@ -26,6 +26,7 @@
 
 import junit.framework.TestCase;
 
+import org.jboss.aop.Dispatcher;
 import org.jboss.ejb3.proxy.factory.session.SessionProxyFactory;
 import org.jboss.ejb3.proxy.factory.session.stateful.StatefulSessionLocalProxyFactory;
 import org.jboss.ejb3.proxy.factory.session.stateful.StatefulSessionRemoteProxyFactory;
@@ -166,12 +167,18 @@
       // Call Super
       ProxyEqualityTestCaseBase.beforeClass();
 
+      // Deploy Beans
+      SfsbProxyEqualityTestCase.getBootstrap().deploy(SfsbProxyEqualityTestCase.class);
+
       // Create a SFSB Container
       StatefulContainer container = Utils.createSfsb(MyStatefulBean.class);
       log.info("Created SFSB Container: " + container.getName());
       SfsbProxyEqualityTestCase.setContainerName(container.getName());
 
-      // Install into MC
+      // Register Container w/ Remoting
+      Dispatcher.singleton.registerTarget(container.getName(), container);
+
+      // Install SFSB into MC
       SfsbProxyEqualityTestCase.getBootstrap().installInstance(container.getName(), container);
    }
 
@@ -228,7 +235,7 @@
       // Make a Remote Proxy Factory
       StatefulSessionRemoteProxyFactory factory = new StatefulSessionRemoteProxyFactory(
             StatefulSessionRemoteProxyFactory.class.getName(), sfsb.getName(), sfsb.getMetaData(), sfsb
-                  .getClassLoader(),null);
+                  .getClassLoader(), "socket://localhost:3874");
 
       // Start
       factory.start();

Added: projects/ejb3/trunk/proxy/src/test/resources/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase-beans.xml
===================================================================
--- projects/ejb3/trunk/proxy/src/test/resources/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase-beans.xml	                        (rev 0)
+++ projects/ejb3/trunk/proxy/src/test/resources/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase-beans.xml	2008-06-14 21:54:36 UTC (rev 74569)
@@ -0,0 +1,35 @@
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
+  xmlns="urn:jboss:bean-deployer:2.0">
+
+  <!-- 
+    
+    Remoting
+    
+  -->
+
+  <!-- Remoting  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>
+
+  <!-- Remoting Connector -->
+  <bean name="Connector"
+    class="org.jboss.remoting.transport.Connector">
+    <property name="invokerLocator">socket://0.0.0.0:3874</property>
+    <property name="serverConfiguration">
+      <inject bean="ServerConfiguration" />
+    </property>
+  </bean>
+
+</deployment>
\ No newline at end of file




More information about the jboss-cvs-commits mailing list