[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