[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