[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