[jboss-cvs] JBossAS SVN: r85648 - in projects/ejb3/trunk: proxy/src/main/java/org/jboss/ejb3/proxy/handler/session/stateful and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Mar 9 11:03:59 EDT 2009
Author: ALRubinger
Date: 2009-03-09 11:03:59 -0400 (Mon, 09 Mar 2009)
New Revision: 85648
Modified:
projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java
projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/handler/session/stateful/StatefulProxyInvocationHandlerBase.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/unit/SfsbProxyEqualityTestCase.java
Log:
[EJBTHREE-1758] Create a contract to get a SFSB Session ID from a Proxy; do not depend upon j.l.r.Proxy backing implementation
Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java 2009-03-09 14:27:53 UTC (rev 85647)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/session/SessionSpecContainer.java 2009-03-09 15:03:59 UTC (rev 85648)
@@ -1,7 +1,7 @@
package org.jboss.ejb3.session;
+import java.io.Serializable;
import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
import java.util.Hashtable;
import javax.ejb.EJB;
@@ -21,8 +21,7 @@
import org.jboss.ejb3.proxy.container.InvokableContext;
import org.jboss.ejb3.proxy.factory.session.SessionProxyFactory;
import org.jboss.ejb3.proxy.factory.session.SessionSpecProxyFactory;
-import org.jboss.ejb3.proxy.handler.session.SessionProxyInvocationHandler;
-import org.jboss.ejb3.proxy.handler.session.stateful.StatefulProxyInvocationHandlerBase;
+import org.jboss.ejb3.proxy.intf.StatefulSessionProxy;
import org.jboss.ejb3.proxy.remoting.SessionSpecRemotingMetadata;
import org.jboss.ejb3.stateful.StatefulContainer;
import org.jboss.ejb3.stateful.StatefulContainerInvocation;
@@ -105,16 +104,14 @@
}
Method unadvisedMethod = info.getUnadvisedMethod();
SerializableMethod unadvisedSerializableMethod = new SerializableMethod(unadvisedMethod);
-
- // Obtain Invocation Handler
+ // Obtain Session ID
//TODO Ugly, use polymorphism and get Session ID for SFSB only
- assert Proxy.isProxyClass(proxy.getClass());
- SessionProxyInvocationHandler handler = (SessionProxyInvocationHandler)Proxy.getInvocationHandler(proxy);
- Object sessionId = null;
- if (handler instanceof StatefulProxyInvocationHandlerBase)
+ Serializable sessionId = null;
+ if(proxy instanceof StatefulSessionProxy)
{
- sessionId = ((StatefulProxyInvocationHandlerBase) handler).getSessionId();
+ StatefulSessionProxy statefulProxy = (StatefulSessionProxy)proxy;
+ sessionId = statefulProxy.getSessionId();
}
/*
@@ -130,15 +127,7 @@
return invokeEJBObjectMethod(sessionId, info, args);
}
- // FIXME: Ahem, stateful container invocation works on all.... (violating contract though)
- //TODO Use Polymorphism to have sessions only in StatefulContainer
-
-// Interceptor[] interceptors, long methodHash, Method advisedMethod,
-// Method unadvisedMethod, SerializableMethod invokedMethod, Advisor advisor
-
-// StatefulSessionContainerMethodInvocation nextInvocation = new StatefulSessionContainerMethodInvocation(info
-// .getInterceptors(), hash, info.getAdvisedMethod(), info.getUnadvisedMethod(), method, getAdvisor());
-
+ // FIXME: Ahem, stateful container invocation works on all.... (violating contract though)
/*
* Build an invocation
*/
@@ -148,20 +137,6 @@
SessionSpecRemotingMetadata.KEY_INVOKED_METHOD, method);
nextInvocation.setArguments(args);
-
- //nextInvocation.setAdvisor(getAdvisor());
- //nextInvocation.setSessionId(sessionId);
-// EJBContainerInvocation nextInvocation = new StatefulContainerInvocation(info, sessionId);
-// nextInvocation.setAdvisor(getAdvisor());
-// nextInvocation.setArguments(args);
-
- // allow a container to supplement information into an invocation
- //nextInvocation = populateInvocation(nextInvocation);
-
- //TODO Support Async Invocation
- // ProxyUtils.addLocalAsynchronousInfo(nextInvocation, provider);
-
-
/*
* Invoke
*/
Modified: projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/handler/session/stateful/StatefulProxyInvocationHandlerBase.java
===================================================================
--- projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/handler/session/stateful/StatefulProxyInvocationHandlerBase.java 2009-03-09 14:27:53 UTC (rev 85647)
+++ projects/ejb3/trunk/proxy/src/main/java/org/jboss/ejb3/proxy/handler/session/stateful/StatefulProxyInvocationHandlerBase.java 2009-03-09 15:03:59 UTC (rev 85648)
@@ -23,15 +23,17 @@
import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.jboss.aop.advice.Interceptor;
+import org.jboss.ejb3.common.lang.SerializableMethod;
import org.jboss.ejb3.proxy.container.InvokableContext;
+import org.jboss.ejb3.proxy.handler.NotEligibleForDirectInvocationException;
import org.jboss.ejb3.proxy.handler.session.SessionSpecProxyInvocationHandlerBase;
import org.jboss.ejb3.proxy.intf.StatefulSessionProxy;
import org.jboss.ejb3.proxy.remoting.ProxyRemotingUtils;
import org.jboss.logging.Logger;
-import org.jboss.util.NotImplementedException;
/**
* StatefulProxyInvocationHandlerBase
@@ -55,6 +57,31 @@
private static final Logger log = Logger.getLogger(StatefulProxyInvocationHandlerBase.class);
+ private static final String METHOD_NAME_GET_SESSION_ID = "getSessionId";
+
+ private static final String METHOD_NAME_SET_SESSION_ID = "setSessionId";
+
+ private static final SerializableMethod METHOD_GET_SESSION_ID;
+
+ private static final SerializableMethod METHOD_SET_SESSION_ID;
+
+ static
+ {
+ try
+ {
+ METHOD_GET_SESSION_ID = new SerializableMethod(StatefulSessionProxy.class
+ .getDeclaredMethod(METHOD_NAME_GET_SESSION_ID));
+ METHOD_SET_SESSION_ID = new SerializableMethod(StatefulSessionProxy.class.getDeclaredMethod(
+ METHOD_NAME_SET_SESSION_ID, Serializable.class));
+ }
+ catch (NoSuchMethodException nsme)
+ {
+ throw new RuntimeException(
+ "Methods for handling directly by the InvocationHandler were not initialized correctly", nsme);
+ }
+
+ }
+
// ------------------------------------------------------------------------------||
// Instance Members -------------------------------------------------------------||
// ------------------------------------------------------------------------------||
@@ -226,15 +253,41 @@
return (StatefulProxyInvocationHandlerBase) handler;
}
- // ------------------------------------------------------------------------------||
- // TO BE IMPLEMENTED ------------------------------------------------------------||
- // ------------------------------------------------------------------------------||
-
- /* (non-Javadoc)
- * @see org.jboss.ejb3.proxy.handler.ProxyInvocationHandler#getAsynchronousProxy(java.lang.Object)
+ /**
+ * Handles the current invocation directly in this invocation handler. Only
+ * a subset of method invocations are eligible for this treatment, else
+ * a NotEligibleForDirectInvocationException will be thrown
+ *
+ * @param proxy
+ * @param args Arguments of the current invocation
+ * @param invokedMethod The method invoked
+ * @return
+ * @throws NotEligibleForDirectInvocationException
*/
- public Object getAsynchronousProxy(Object proxy)
+ @Override
+ protected Object handleInvocationDirectly(Object proxy, Object[] args, Method invokedMethod)
+ throws NotEligibleForDirectInvocationException
{
- throw new NotImplementedException("ALR");
+ // Obtain the invoked method
+ assert invokedMethod != null : "Invoked Method was not set upon invocation of " + this.getClass().getName();
+
+ // getSessionId
+ if (invokedMethod.equals(METHOD_GET_SESSION_ID.toMethod()))
+ {
+ return this.getSessionId();
+ }
+ // setSessionId
+ if (invokedMethod.equals(METHOD_SET_SESSION_ID.toMethod()))
+ {
+ assert args.length == 1 : "Expecting exactly one argument for invocation of " + METHOD_SET_SESSION_ID;
+ Object arg = args[0];
+ assert arg instanceof Serializable : "Argument must be instance of " + Serializable.class.getName();
+ Serializable id = (Serializable) arg;
+ this.setSessionId(id);
+ return null;
+ }
+
+ // Call to super
+ return super.handleInvocationDirectly(proxy, args, invokedMethod);
}
}
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 2009-03-09 14:27:53 UTC (rev 85647)
+++ projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/common/container/SessionContainer.java 2009-03-09 15:03:59 UTC (rev 85648)
@@ -22,9 +22,7 @@
package org.jboss.ejb3.test.proxy.common.container;
import java.io.Serializable;
-import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -48,7 +46,7 @@
import org.jboss.ejb3.common.registrar.spi.Ejb3RegistrarLocator;
import org.jboss.ejb3.common.registrar.spi.NotBoundException;
import org.jboss.ejb3.proxy.container.InvokableContext;
-import org.jboss.ejb3.proxy.handler.session.stateful.StatefulProxyInvocationHandlerBase;
+import org.jboss.ejb3.proxy.intf.StatefulSessionProxy;
import org.jboss.ejb3.proxy.jndiregistrar.JndiSessionRegistrarBase;
import org.jboss.ejb3.proxy.remoting.StatefulSessionRemotingMetadata;
import org.jboss.logging.Logger;
@@ -278,13 +276,12 @@
Serializable sessionId = null;
// Obtain the InvocationHandler
- InvocationHandler handler = Proxy.getInvocationHandler(proxy);
- if (handler instanceof StatefulProxyInvocationHandlerBase)
+ if (proxy instanceof StatefulSessionProxy)
{
- StatefulProxyInvocationHandlerBase sHandler = (StatefulProxyInvocationHandlerBase) handler;
+ StatefulSessionProxy statefulProxy = (StatefulSessionProxy) proxy;
// Get the Session ID
- sessionId = sHandler.getSessionId();
+ sessionId = statefulProxy.getSessionId();
}
// Get the appropriate instance
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 2009-03-09 14:27:53 UTC (rev 85647)
+++ projects/ejb3/trunk/proxy/src/test/java/org/jboss/ejb3/test/proxy/spec_3_4_5/unit/SfsbProxyEqualityTestCase.java 2009-03-09 15:03:59 UTC (rev 85648)
@@ -22,7 +22,6 @@
package org.jboss.ejb3.test.proxy.spec_3_4_5.unit;
import java.io.Serializable;
-import java.lang.reflect.Proxy;
import java.util.UUID;
import junit.framework.TestCase;
@@ -131,7 +130,7 @@
private void setSessionIdOnProxy(Object proxy, Serializable id)
{
// Get the InvocationHander for the Proxy
- StatefulSessionProxy handler = (StatefulSessionProxy) Proxy.getInvocationHandler(proxy);
+ StatefulSessionProxy handler = (StatefulSessionProxy) proxy;
handler.setSessionId(id);
}
More information about the jboss-cvs-commits
mailing list