[jboss-cvs] JBossAS SVN: r109067 - in projects/ejb3/trunk/core: src/main/java/org/jboss/ejb3/stateful and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Nov 2 09:10:30 EDT 2010


Author: wolfc
Date: 2010-11-02 09:10:29 -0400 (Tue, 02 Nov 2010)
New Revision: 109067

Modified:
   projects/ejb3/trunk/core/pom.xml
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/SessionSynchronizationInterceptor.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java
Log:
EJBTHREE-2187: integrate jboss-ejb3-effigy

Modified: projects/ejb3/trunk/core/pom.xml
===================================================================
--- projects/ejb3/trunk/core/pom.xml	2010-11-02 10:14:16 UTC (rev 109066)
+++ projects/ejb3/trunk/core/pom.xml	2010-11-02 13:10:29 UTC (rev 109067)
@@ -49,6 +49,7 @@
     <version.sun-jaxws>2.1.1</version.sun-jaxws>
     <version.org.jboss.ejb3.async>1.0.0-alpha-5</version.org.jboss.ejb3.async>
     <version.org.jboss.ejb3.instantiator>1.0.0-alpha-2</version.org.jboss.ejb3.instantiator>
+    <version.org.jboss.ejb3.effigy>0.1.0-SNAPSHOT</version.org.jboss.ejb3.effigy>
     <version.org.jboss.ejb3.ejbref.resolver>1.0.0-alpha-1</version.org.jboss.ejb3.ejbref.resolver>
   </properties>
 
@@ -481,7 +482,20 @@
       <version>${version.org.jboss.ejb3.context}</version>
       <scope>runtime</scope>
     </dependency>
-    
+
+    <dependency>
+       <groupId>org.jboss.ejb3.effigy</groupId>
+       <artifactId>jboss-ejb3-effigy-common</artifactId>
+       <version>${version.org.jboss.ejb3.effigy}</version>
+    </dependency>
+
+    <dependency>
+       <groupId>org.jboss.ejb3.effigy</groupId>
+       <artifactId>jboss-ejb3-effigy-int1</artifactId>
+       <version>${version.org.jboss.ejb3.effigy}</version>
+       <scope>runtime</scope>
+    </dependency>
+
     <!--  ejbref-resolver -->
     <dependency>
         <groupId>org.jboss.ejb3.ejbref.resolver</groupId>

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/SessionSynchronizationInterceptor.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/SessionSynchronizationInterceptor.java	2010-11-02 10:14:16 UTC (rev 109066)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/SessionSynchronizationInterceptor.java	2010-11-02 13:10:29 UTC (rev 109067)
@@ -27,7 +27,6 @@
 import org.jboss.ejb3.BeanContext;
 import org.jboss.ejb3.context.CurrentInvocationContext;
 import org.jboss.ejb3.context.base.BaseSessionInvocationContext;
-import org.jboss.ejb3.context.spi.InvocationContext;
 import org.jboss.ejb3.context.spi.SessionInvocationContext;
 import org.jboss.ejb3.tx.TxUtil;
 import org.jboss.logging.Logger;
@@ -75,9 +74,9 @@
 
       public void beforeCompletion()
       {
-         final SessionSynchronization bean = (SessionSynchronization) ctx.getInstance();
+         final SessionSynchronization sync = ctx.getSessionSynchronization();
          // The bean might be lost in action if an exception is thrown in afterBegin
-         if(bean == null)
+         if(ctx.getInstance() == null)
             return;
          pushEnc();
          try
@@ -90,7 +89,7 @@
                @Override
                public Object proceed() throws Exception
                {
-                  bean.beforeCompletion();
+                  sync.beforeCompletion();
                   return null;
                }
             };
@@ -123,9 +122,9 @@
       public void afterCompletion(final int status)
       {
          ctx.setTxSynchronized(false);
-         final SessionSynchronization bean = (SessionSynchronization) ctx.getInstance();
+         final SessionSynchronization sync = ctx.getSessionSynchronization();
          // The bean might be lost in action if an exception is thrown in afterBegin
-         if(bean == null)
+         if(ctx.getInstance() == null)
             return;
          pushEnc();
          try
@@ -137,11 +136,11 @@
                {
                   if (status == Status.STATUS_COMMITTED)
                   {
-                     bean.afterCompletion(true);
+                     sync.afterCompletion(true);
                   }
                   else
                   {
-                     bean.afterCompletion(false);
+                     sync.afterCompletion(false);
                   }
                   return null;
                }
@@ -215,8 +214,8 @@
    public Object invoke(Invocation invocation) throws Throwable
    {
       StatefulContainerInvocation ejb = (StatefulContainerInvocation) invocation;
-      StatefulBeanContext target = (StatefulBeanContext) ejb.getBeanContext();
-      if (target.getInstance() instanceof SessionSynchronization)
+      StatefulBeanContext target = ejb.getBeanContext();
+      if (target.getSessionSynchronization() != null)
       {
          registerSessionSynchronization(target);
       }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java	2010-11-02 10:14:16 UTC (rev 109066)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulBeanContext.java	2010-11-02 13:10:29 UTC (rev 109067)
@@ -28,6 +28,7 @@
 import org.jboss.ejb3.cache.Optimized;
 import org.jboss.ejb3.cache.StatefulCache;
 import org.jboss.ejb3.context.spi.EJBContext;
+import org.jboss.ejb3.effigy.SessionBeanEffigy;
 import org.jboss.ejb3.interceptor.InterceptorInfo;
 import org.jboss.ejb3.session.SessionSpecBeanContext;
 import org.jboss.ejb3.tx.TxUtil;
@@ -35,6 +36,8 @@
 import org.jboss.tm.TxUtils;
 import org.jboss.util.id.GUID;
 
+import javax.ejb.EJBException;
+import javax.ejb.SessionSynchronization;
 import javax.persistence.EntityManager;
 import javax.transaction.RollbackException;
 import javax.transaction.Synchronization;
@@ -44,6 +47,9 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.rmi.RemoteException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -67,7 +73,36 @@
 {
    /** The serialVersionUID */
    private static final long serialVersionUID = -102470788178912606L;
-   
+
+   private class CustomSessionSynchronization implements SessionSynchronization
+   {
+      private SessionBeanEffigy effigy;
+
+      CustomSessionSynchronization()
+      {
+         this.effigy = getEffigy();
+      }
+
+      @Override
+      public void afterBegin() throws EJBException, RemoteException
+      {
+         invoke(getInstance(), effigy.getAfterBeginMethod());
+      }
+
+      @Override
+      public void afterCompletion(boolean committed) throws EJBException, RemoteException
+      {
+         invoke(getInstance(), effigy.getAfterCompletionMethod(), committed);
+      }
+
+      @Override
+      public void beforeCompletion() throws EJBException, RemoteException
+      {
+         invoke(getInstance(), effigy.getBeforeCompletionMethod());
+      }
+
+   }
+
    private class StatefulSynchronization implements Synchronization
    {
       public void afterCompletion(int status)
@@ -140,6 +175,8 @@
    private transient Transaction currentSyncTx;
    private transient List<Synchronization> synchronizations;
 
+   private transient CustomSessionSynchronization customSessionSynchronization;
+
    /**
     * An incoming context from serialization.
     * 
@@ -190,7 +227,23 @@
          extractBeanAndInterceptors();
       return contains;
    }
-   
+
+   protected SessionSynchronization getSessionSynchronization()
+   {
+      Object bean = getInstance();
+      if(bean instanceof SessionSynchronization)
+         return (SessionSynchronization) bean;
+
+      if(hasCustomSessionSynchronizationMethods())
+      {
+         if(customSessionSynchronization == null)
+            customSessionSynchronization = new CustomSessionSynchronization();
+         return customSessionSynchronization;
+      }
+
+      return null;
+   }
+
    /**
     * Makes a copy of the contains list so nested callback iterators
     * can iterate over it without concern that another thread will
@@ -220,7 +273,12 @@
          ejbContext = new StatefulSessionContextImpl(this);
       return ejbContext;
    }
-   
+
+   private SessionBeanEffigy getEffigy()
+   {
+      return getContainer().getEffigy();
+   }
+
    public EntityManager getExtendedPersistenceContext(String id)
    {
       EntityManager found = null;
@@ -238,6 +296,18 @@
       return found;
    }
 
+   private boolean hasCustomSessionSynchronizationMethods()
+   {
+      SessionBeanEffigy effigy = getEffigy();
+      if(effigy.getAfterBeginMethod() != null)
+         return true;
+      if(effigy.getAfterCompletionMethod() != null)
+         return true;
+      if(effigy.getBeforeCompletionMethod() != null)
+         return true;
+      return false;
+   }
+   
    public void addExtendedPersistenceContext(String id, EntityManager pc)
    {
       Map<String, EntityManager> extendedPCS = getExtendedPersistenceContexts();
@@ -1043,6 +1113,30 @@
       return result;
    }
    
+
+   private static Object invoke(Object target, Method method, Object... args)
+   {
+      try
+      {
+         return method.invoke(target, args);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (InvocationTargetException e)
+      {
+         Throwable targetException = e.getTargetException();
+         if(targetException instanceof Error)
+            throw (Error) targetException;
+         if(targetException instanceof RuntimeException)
+            throw (RuntimeException) targetException;
+         if(targetException instanceof Exception)
+            throw new EJBException((Exception) targetException);
+         throw new RuntimeException(targetException);
+      }
+   }
+
    /**
     * To make sure Synchronizations are executed in a given order we maintain
     * a sync registry within this object.

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java	2010-11-02 10:14:16 UTC (rev 109066)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/stateful/StatefulContainer.java	2010-11-02 13:10:29 UTC (rev 109067)
@@ -21,29 +21,6 @@
  */
 package org.jboss.ejb3.stateful;
 
-import java.io.Serializable;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.rmi.RemoteException;
-import java.util.Arrays;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.concurrent.ExecutorService;
-
-import javax.ejb.EJBHome;
-import javax.ejb.EJBLocalObject;
-import javax.ejb.EJBObject;
-import javax.ejb.Handle;
-import javax.ejb.Init;
-import javax.ejb.NoSuchEJBException;
-import javax.ejb.NoSuchObjectLocalException;
-import javax.ejb.PostActivate;
-import javax.ejb.PrePassivate;
-import javax.ejb.RemoteHome;
-import javax.ejb.RemoveException;
-
 import org.jboss.aop.Advisor;
 import org.jboss.aop.Domain;
 import org.jboss.aop.MethodInfo;
@@ -71,6 +48,9 @@
 import org.jboss.ejb3.core.proxy.spi.CurrentRemoteProxyFactory;
 import org.jboss.ejb3.core.proxy.spi.EJB2RemoteProxyFactory;
 import org.jboss.ejb3.core.proxy.spi.RemoteProxyFactory;
+import org.jboss.ejb3.effigy.SessionBeanEffigy;
+import org.jboss.ejb3.effigy.common.JBossBeanEffigyInfo;
+import org.jboss.ejb3.effigy.spi.BeanEffigyFactory;
 import org.jboss.ejb3.endpoint.SessionFactory;
 import org.jboss.ejb3.interceptors.container.StatefulSessionContainerMethodInvocation;
 import org.jboss.ejb3.proxy.clustered.objectstore.ClusteredObjectStoreBindings;
@@ -96,6 +76,30 @@
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.util.NotImplementedException;
 
+import javax.ejb.EJBHome;
+import javax.ejb.EJBLocalObject;
+import javax.ejb.EJBObject;
+import javax.ejb.Handle;
+import javax.ejb.Init;
+import javax.ejb.NoSuchEJBException;
+import javax.ejb.NoSuchObjectLocalException;
+import javax.ejb.PostActivate;
+import javax.ejb.PrePassivate;
+import javax.ejb.RemoteHome;
+import javax.ejb.RemoveException;
+import java.io.Serializable;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.rmi.RemoteException;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.concurrent.ExecutorService;
+
 /**
  * Comment
  *
@@ -115,6 +119,8 @@
 
    private SessionFactory sessionFactory;
 
+   private SessionBeanEffigy effigy;
+
    public StatefulContainer(ClassLoader cl, String beanClassName, String ejbName, Domain domain,
          Hashtable ctxProperties, Ejb3Deployment deployment, JBossSessionBeanMetaData beanMetaData,
          final ExecutorService asynchronousExecutor) throws ClassNotFoundException
@@ -124,6 +130,8 @@
       // For the time being, this container is its own SessionFactory
       //TODO Externalize the SessionFactory into its own component
       this.sessionFactory = this;
+
+      this.effigy = effigy(cl, beanMetaData);
    }
 
    /**
@@ -201,6 +209,30 @@
       }
    }
 
+   private static SessionBeanEffigy effigy(ClassLoader cl, JBossSessionBeanMetaData beanMetaData)
+           throws ClassNotFoundException
+   {
+      JBossBeanEffigyInfo info = new JBossBeanEffigyInfo(cl, beanMetaData);
+      return (SessionBeanEffigy) service(BeanEffigyFactory.class).create(info, SessionBeanEffigy.class);
+   }
+
+   private static <S> S service(Class<S> service)
+   {
+      ServiceLoader<S> loader = ServiceLoader.load(service);
+      Iterator<S> it = loader.iterator();
+      if(!it.hasNext())
+         throw new IllegalArgumentException("Unable to find a service for " + service);
+      S instance = it.next();
+      if(it.hasNext())
+         throw new IllegalArgumentException("Multiple services found for " + service + ", " + it);
+      return instance;
+   }
+
+   protected SessionBeanEffigy getEffigy()
+   {
+      return effigy;
+   }
+
    public Object getMBean()
    {
       return mbean;



More information about the jboss-cvs-commits mailing list