dain 2005/03/01 18:34:31
Modified: modules/core/src/java/org/openejb/sfsb BusinessMethod.java
CreateMethod.java RemoveMethod.java
StatefulInstanceContext.java
StatefulInstanceContextFactory.java
StatefulInstanceInterceptor.java
StatefulSessionContext.java
Log:
Changed to use new TransactionManagerContext methods managing bean
transactions
Fixed improper handling of bean transactions in StatefulInstanceInterceptor
Removed excessive handling of bean transactions in the SFSB and SLSB vops
Revision Changes Path
1.6 +3 -17
openejb/modules/core/src/java/org/openejb/sfsb/BusinessMethod.java
Index: BusinessMethod.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/sfsb/BusinessMethod.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- BusinessMethod.java 15 Feb 2005 03:24:03 -0000 1.5
+++ BusinessMethod.java 1 Mar 2005 23:34:30 -0000 1.6
@@ -48,7 +48,6 @@
package org.openejb.sfsb;
import org.apache.geronimo.core.service.InvocationResult;
-import org.apache.geronimo.transaction.context.TransactionContext;
import org.openejb.EJBInvocation;
import org.openejb.EJBOperation;
@@ -56,27 +55,14 @@
import org.openejb.dispatch.MethodSignature;
/**
- *
- *
* @version $Revision$ $Date$
*/
public class BusinessMethod extends AbstractMethodOperation {
- protected final boolean isBMT;
-
- public BusinessMethod(Class beanClass, MethodSignature signature,
boolean isBMT) {
+ public BusinessMethod(Class beanClass, MethodSignature signature) {
super(beanClass, signature);
- this.isBMT = isBMT;
}
public InvocationResult execute(EJBInvocation invocation) throws
Throwable {
- try {
- return invoke(invocation, EJBOperation.BIZMETHOD);
- } finally {
- if(isBMT) {
- // we need to update the invocation cache of the transaction
context
- // because they may have used UserTransaction to push a new
context
-
invocation.setTransactionContext(TransactionContext.getContext());
- }
- }
+ return invoke(invocation, EJBOperation.BIZMETHOD);
}
}
1.5 +3 -13
openejb/modules/core/src/java/org/openejb/sfsb/CreateMethod.java
Index: CreateMethod.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/sfsb/CreateMethod.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- CreateMethod.java 25 Feb 2005 23:06:11 -0000 1.4
+++ CreateMethod.java 1 Mar 2005 23:34:30 -0000 1.5
@@ -54,7 +54,6 @@
import org.apache.geronimo.core.service.InvocationResult;
import org.apache.geronimo.core.service.SimpleInvocationResult;
-import org.apache.geronimo.transaction.context.TransactionContext;
import net.sf.cglib.reflect.FastClass;
import org.openejb.EJBInstanceContext;
@@ -65,22 +64,18 @@
import org.openejb.dispatch.VirtualOperation;
/**
- *
- *
* @version $Revision$ $Date$
*/
public class CreateMethod implements VirtualOperation, Serializable {
private final Class beanClass;
private final MethodSignature createSignature;
- private final boolean isBMT;
private final transient FastClass fastClass;
private final transient int createIndex;
- public CreateMethod(Class beanClass, MethodSignature signature, boolean
isBMT) {
+ public CreateMethod(Class beanClass, MethodSignature signature) {
this.beanClass = beanClass;
this.createSignature = signature;
- this.isBMT = isBMT;
fastClass = FastClass.create(beanClass);
Method javaMethod = signature.getMethod(beanClass);
@@ -111,11 +106,6 @@
}
} finally {
ctx.setOperation(EJBOperation.INACTIVE);
- if(isBMT) {
- // we need to update the invocation cache of the transaction
context
- // because they may have used UserTransaction to push a new
context
-
invocation.setTransactionContext(TransactionContext.getContext());
- }
}
// return a ref
@@ -132,6 +122,6 @@
}
private Object readResolve() {
- return new CreateMethod(beanClass, createSignature, isBMT);
+ return new CreateMethod(beanClass, createSignature);
}
}
1.4 +8 -20
openejb/modules/core/src/java/org/openejb/sfsb/RemoveMethod.java
Index: RemoveMethod.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/sfsb/RemoveMethod.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- RemoveMethod.java 18 Jul 2004 22:32:24 -0000 1.3
+++ RemoveMethod.java 1 Mar 2005 23:34:30 -0000 1.4
@@ -48,38 +48,26 @@
package org.openejb.sfsb;
import org.apache.geronimo.core.service.InvocationResult;
-import org.apache.geronimo.transaction.context.TransactionContext;
-
import org.openejb.EJBInvocation;
import org.openejb.EJBOperation;
import org.openejb.dispatch.MethodSignature;
+import org.openejb.dispatch.AbstractMethodOperation;
/**
- * Virtual operation handling removal of an instance.
+ * Virtual operation handling removal of a stateful session bean instance
instance.
*
* @version $Revision$ $Date$
*/
-public class RemoveMethod extends BusinessMethod {
- public RemoveMethod(Class beanClass, MethodSignature signature, boolean
isBMT) {
- super(beanClass, signature, isBMT);
+public class RemoveMethod extends AbstractMethodOperation {
+ public RemoveMethod(Class beanClass, MethodSignature signature) {
+ super(beanClass, signature);
}
public InvocationResult execute(EJBInvocation invocation) throws
Throwable {
- StatefulInstanceContext ctx = (StatefulInstanceContext)
invocation.getEJBInstanceContext();
- InvocationResult result = null;
- try {
- result = invoke(invocation, EJBOperation.EJBREMOVE);
- } finally {
- if(isBMT) {
- // we need to update the invocation cache of the transaction
context
- // because they may have used UserTransaction to push a new
context
-
invocation.setTransactionContext(TransactionContext.getContext());
- }
- }
-
+ InvocationResult result = invoke(invocation, EJBOperation.EJBREMOVE);
if (result.isNormal()) {
// flag the context as dead so it does not get put back in the
cache
- ctx.die();
+ invocation.getEJBInstanceContext().die();
}
return result;
}
1.12 +12 -10
openejb/modules/core/src/java/org/openejb/sfsb/StatefulInstanceContext.java
Index: StatefulInstanceContext.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/sfsb/StatefulInstanceContext.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- StatefulInstanceContext.java 25 Feb 2005 23:06:11 -0000 1.11
+++ StatefulInstanceContext.java 1 Mar 2005 23:34:30 -0000 1.12
@@ -52,9 +52,9 @@
import javax.ejb.SessionSynchronization;
import org.apache.geronimo.core.service.Interceptor;
-import org.apache.geronimo.transaction.UserTransactionImpl;
-import org.apache.geronimo.transaction.context.BeanTransactionContext;
+import org.apache.geronimo.transaction.context.UserTransactionImpl;
import org.apache.geronimo.transaction.context.TransactionContextManager;
+import org.apache.geronimo.transaction.context.TransactionContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openejb.AbstractInstanceContext;
@@ -78,7 +78,7 @@
private final EJBInvocation afterBeginInvocation;
private final EJBInvocation beforeCompletionInvocation;
private final SystemMethodIndices systemMethodIndices;
- private BeanTransactionContext preexistingContext;
+ private TransactionContext preexistingContext;
private EJBOperation operation;
private InstanceCache cache;
@@ -116,11 +116,11 @@
return id;
}
- public BeanTransactionContext getPreexistingContext() {
+ public TransactionContext getPreexistingContext() {
return preexistingContext;
}
- public void setPreexistingContext(BeanTransactionContext
preexistingContext) {
+ public void setPreexistingContext(TransactionContext preexistingContext)
{
this.preexistingContext = preexistingContext;
}
@@ -134,10 +134,12 @@
public void die() {
if (preexistingContext != null) {
- try {
- preexistingContext.rollback();
- } catch (Exception e) {
- log.warn("Unable to roll back", e);
+ if (preexistingContext.isActive()) {
+ try {
+ preexistingContext.rollback();
+ } catch (Exception e) {
+ log.warn("Unable to roll back", e);
+ }
}
preexistingContext = null;
}
1.12 +2 -2
openejb/modules/core/src/java/org/openejb/sfsb/StatefulInstanceContextFactory.java
Index: StatefulInstanceContextFactory.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/sfsb/StatefulInstanceContextFactory.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- StatefulInstanceContextFactory.java 5 Oct 2004 07:04:02 -0000
1.11
+++ StatefulInstanceContextFactory.java 1 Mar 2005 23:34:30 -0000
1.12
@@ -54,8 +54,8 @@
import javax.ejb.SessionContext;
import org.apache.geronimo.transaction.InstanceContext;
-import org.apache.geronimo.transaction.UserTransactionImpl;
import org.apache.geronimo.transaction.context.TransactionContextManager;
+import org.apache.geronimo.transaction.context.UserTransactionImpl;
import org.apache.geronimo.core.service.Interceptor;
import org.openejb.EJBInstanceFactory;
1.6 +12 -44
openejb/modules/core/src/java/org/openejb/sfsb/StatefulInstanceInterceptor.java
Index: StatefulInstanceInterceptor.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/sfsb/StatefulInstanceInterceptor.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- StatefulInstanceInterceptor.java 25 Feb 2005 23:06:11 -0000 1.5
+++ StatefulInstanceInterceptor.java 1 Mar 2005 23:34:30 -0000 1.6
@@ -53,20 +53,15 @@
import org.apache.geronimo.core.service.Interceptor;
import org.apache.geronimo.core.service.Invocation;
import org.apache.geronimo.core.service.InvocationResult;
+import org.apache.geronimo.transaction.InstanceContext;
import org.apache.geronimo.transaction.context.TransactionContext;
-import org.apache.geronimo.transaction.context.BeanTransactionContext;
import org.apache.geronimo.transaction.context.TransactionContextManager;
-import org.apache.geronimo.transaction.context.UnspecifiedTransactionContext;
-import org.apache.geronimo.transaction.InstanceContext;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
import org.openejb.EJBInvocation;
-import org.openejb.NotReentrantLocalException;
import org.openejb.NotReentrantException;
-import org.openejb.transaction.UncommittedTransactionException;
+import org.openejb.NotReentrantLocalException;
import org.openejb.cache.InstanceCache;
import org.openejb.cache.InstanceFactory;
+import org.openejb.transaction.UncommittedTransactionException;
/**
* Interceptor for Stateful Session EJBs that acquires an instance for
execution.
@@ -76,7 +71,6 @@
* @version $Revision$ $Date$
*/
public final class StatefulInstanceInterceptor implements Interceptor {
- private static final Log log =
LogFactory.getLog(StatefulInstanceInterceptor.class);
private final Interceptor next;
private final Object containerId;
private final InstanceFactory factory;
@@ -99,15 +93,10 @@
ejbInvocation.setEJBInstanceContext(ctx);
// resume the preexisting transaction context
- TransactionContext oldTransactionContext =
transactionContextManager.getContext();
if (ctx.getPreexistingContext() != null) {
- BeanTransactionContext preexistingContext =
ctx.getPreexistingContext();
+ TransactionContext preexistingContext =
ctx.getPreexistingContext();
+
transactionContextManager.resumeBeanTransactionContext(preexistingContext);
ctx.setPreexistingContext(null);
- preexistingContext.setOldContext((UnspecifiedTransactionContext)
oldTransactionContext);
-
- ejbInvocation.setTransactionContext(preexistingContext);
- transactionContextManager.setContext(preexistingContext);
- preexistingContext.resume();
}
// check reentrancy
@@ -119,7 +108,8 @@
}
}
- InstanceContext oldInstanceContext =
ejbInvocation.getTransactionContext().beginInvocation(ctx);
+ TransactionContext oldTransactionContext =
ejbInvocation.getTransactionContext();
+ InstanceContext oldInstanceContext =
oldTransactionContext.beginInvocation(ctx);
try {
// invoke next
InvocationResult invocationResult = next.invoke(invocation);
@@ -127,19 +117,11 @@
// if we have a BMT still associated with the thread, suspend it
and save it off for the next invocation
TransactionContext currentContext =
transactionContextManager.getContext();
if (oldTransactionContext != currentContext) {
- BeanTransactionContext preexistingContext =
(BeanTransactionContext)currentContext;
- if (preexistingContext.getOldContext() !=
oldTransactionContext) {
+ TransactionContext preexistingContext =
transactionContextManager.suspendBeanTransactionContext();
+ ctx.setPreexistingContext(preexistingContext);
+ if (transactionContextManager.getContext() !=
oldTransactionContext) {
throw new UncommittedTransactionException("Found an
uncommitted bean transaction from another session bean");
}
- // suspend and save off the BMT context
- preexistingContext.suspend();
- preexistingContext.setOldContext(null);
- ctx.setPreexistingContext(preexistingContext);
-
- // resume the old unsupported transaction context
- ejbInvocation.setTransactionContext(oldTransactionContext);
- transactionContextManager.setContext(oldTransactionContext);
- oldTransactionContext.resume();
}
return invocationResult;
@@ -147,23 +129,9 @@
// we must kill the instance when a system exception is thrown
ctx.die();
- // if we have tx context, other then our old tx context,
associated with the thread roll it back
- if (oldTransactionContext !=
transactionContextManager.getContext()) {
- try {
- transactionContextManager.getContext().rollback();
- } catch (Exception e) {
- log.warn("Unable to roll back", e);
- }
-
- // and resume the old transaction
- ejbInvocation.setTransactionContext(oldTransactionContext);
- transactionContextManager.setContext(oldTransactionContext);
- oldTransactionContext.resume();
- }
-
throw t;
} finally {
-
ejbInvocation.getTransactionContext().endInvocation(oldInstanceContext);
+ oldTransactionContext.endInvocation(oldInstanceContext);
ejbInvocation.setEJBInstanceContext(null);
}
}
1.7 +2 -2
openejb/modules/core/src/java/org/openejb/sfsb/StatefulSessionContext.java
Index: StatefulSessionContext.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/sfsb/StatefulSessionContext.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- StatefulSessionContext.java 14 Feb 2005 18:32:31 -0000 1.6
+++ StatefulSessionContext.java 1 Mar 2005 23:34:30 -0000 1.7
@@ -61,8 +61,8 @@
import org.openejb.EJBInstanceContext;
import org.openejb.EJBOperation;
import org.openejb.timer.TimerState;
-import org.apache.geronimo.transaction.UserTransactionImpl;
import org.apache.geronimo.transaction.context.TransactionContextManager;
+import org.apache.geronimo.transaction.context.UserTransactionImpl;
/**
* Implementation of SessionContext using the State pattern to determine