You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/04/12 08:57:02 UTC

svn commit: r527791 [1/2] - in /incubator/openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openej...

Author: dain
Date: Wed Apr 11 23:56:57 2007
New Revision: 527791

URL: http://svn.apache.org/viewvc?view=rev&rev=527791
Log:
Add support for applications with rollback
Process applications exception annotations
Remove the stateless proxy remove code; stateless proxies can't really be removed

Added:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java
Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MessageDrivenBeanManagedTxPolicy.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SessionSynchronizationTxPolicy.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulBeanManagedTxPolicy.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainerManagedTxPolicy.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessBeanManagedTxPolicy.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbHomeHandler.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbObjectHandler.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxManditory.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNever.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNotSupported.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequired.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequiresNew.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxSupports.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessEjbObjectTests.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessHandleTests.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbLocalObjectTests.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbObjectTests.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoHandleTests.java
    incubator/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBHomeHandler.java
    incubator/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBObjectHandler.java

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java Wed Apr 11 23:56:57 2007
@@ -18,13 +18,13 @@
 
 import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.core.timer.EjbTimerService;
+import org.apache.openejb.core.ExceptionType;
 
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Map;
 import java.util.List;
 import javax.naming.Context;
-import javax.security.auth.Subject;
 
 public interface DeploymentInfo {
 
@@ -125,6 +125,8 @@
     public Method getEjbTimeout();
 
     public EjbTimerService getEjbTimerService();
+
+    public ExceptionType getExceptionType(Throwable e);
 
     public interface BusinessLocalHome extends javax.ejb.EJBLocalHome {
         Object create();

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java?view=auto&rev=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java Wed Apr 11 23:56:57 2007
@@ -0,0 +1,23 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+public class ApplicationExceptionInfo extends InfoObject {
+    public String exceptionClass;
+    public boolean rollback;
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Wed Apr 11 23:56:57 2007
@@ -422,6 +422,19 @@
 
                 }
 
+                // process application exceptions
+                for (ApplicationExceptionInfo exceptionInfo : ejbJar.applicationException) {
+                    try {
+                        Class exceptionClass = classLoader.loadClass(exceptionInfo.exceptionClass);
+                        for (DeploymentInfo deploymentInfo : deployments.values()) {
+                            CoreDeploymentInfo coreDeploymentInfo = (CoreDeploymentInfo) deploymentInfo;
+                            coreDeploymentInfo.addApplicationException(exceptionClass, exceptionInfo.rollback);
+                        }
+                    } catch (ClassNotFoundException e) {
+                        logger.error("Application class invalid: class=" + exceptionInfo.exceptionClass + ".  Exception: " + e.getMessage(), e);
+                    }
+                }
+
                 for (EnterpriseBeanInfo beanInfo : ejbJar.enterpriseBeans) {
                     logger.info("Created Ejb(deployment-id="+beanInfo.ejbDeploymentId+", ejb-name="+beanInfo.ejbName+", container="+beanInfo.containerId+")");
                 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java Wed Apr 11 23:56:57 2007
@@ -30,6 +30,5 @@
     public final List<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>();
     public final List<InterceptorBindingInfo> interceptorBindings = new ArrayList<InterceptorBindingInfo>();
     public final List<MethodInfo> excludeList = new ArrayList<MethodInfo>();
-
-
+    public final List<ApplicationExceptionInfo> applicationException = new ArrayList<ApplicationExceptionInfo>();
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Wed Apr 11 23:56:57 2007
@@ -91,6 +91,7 @@
 import javax.ejb.TransactionAttributeType;
 import javax.ejb.TransactionManagement;
 import javax.ejb.TransactionManagementType;
+import javax.ejb.ApplicationException;
 import javax.interceptor.ExcludeClassInterceptors;
 import javax.interceptor.ExcludeDefaultInterceptors;
 import javax.interceptor.Interceptors;
@@ -227,6 +228,18 @@
                 if (messageBean.getEjbClass() == null) {
                     messageBean.setEjbClass(beanClass.getName());
                 }
+            }
+
+            classes = finder.findAnnotatedClasses(ApplicationException.class);
+            if (!classes.isEmpty()) {
+                if (ejbJar.getAssemblyDescriptor() == null) {
+                    ejbJar.setAssemblyDescriptor(new AssemblyDescriptor());
+                }
+            }
+            for (Class<?> exceptionClass : classes) {
+                ApplicationException annotation = exceptionClass.getAnnotation(ApplicationException.class);
+                org.apache.openejb.jee.ApplicationException exception = new org.apache.openejb.jee.ApplicationException(exceptionClass.getName(), annotation.rollback());
+                ejbJar.getAssemblyDescriptor().getApplicationException().add(exception);
             }
 
             return ejbModule;

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java Wed Apr 11 23:56:57 2007
@@ -37,6 +37,7 @@
 import org.apache.openejb.assembler.classic.SecurityRoleReferenceInfo;
 import org.apache.openejb.assembler.classic.StatefulBeanInfo;
 import org.apache.openejb.assembler.classic.StatelessBeanInfo;
+import org.apache.openejb.assembler.classic.ApplicationExceptionInfo;
 import org.apache.openejb.jee.ActivationConfig;
 import org.apache.openejb.jee.ActivationConfigProperty;
 import org.apache.openejb.jee.CallbackMethod;
@@ -70,6 +71,7 @@
 import org.apache.openejb.jee.TransactionType;
 import org.apache.openejb.jee.ExcludeList;
 import org.apache.openejb.jee.ResultTypeMapping;
+import org.apache.openejb.jee.ApplicationException;
 import org.apache.openejb.jee.oejb3.EjbDeployment;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.Logger;
@@ -163,6 +165,7 @@
             initMethodPermissions(jar, ejbds, ejbJar);
             initExcludesList(jar, ejbds, ejbJar);
             initMethodTransactions(jar, ejbds, ejbJar);
+            initApplicationExceptions(jar, ejbJar);
 
             for (EnterpriseBeanInfo bean : ejbJar.enterpriseBeans) {
                 resolveRoleLinks(jar, bean, items.get(bean.ejbName));
@@ -301,6 +304,15 @@
             info.transAttribute = cTx.getTransAttribute().toString();
             info.methods.addAll(getMethodInfos(cTx.getMethod(), ejbds));
             ejbJarInfo.methodTransactions.add(info);
+        }
+    }
+
+    private void initApplicationExceptions(EjbModule jar, EjbJarInfo ejbJarInfo) {
+        for (ApplicationException applicationException : jar.getEjbJar().getAssemblyDescriptor().getApplicationException()) {
+            ApplicationExceptionInfo info = new ApplicationExceptionInfo();
+            info.exceptionClass = applicationException.getExceptionClass();
+            info.rollback = applicationException.getRollback();
+            ejbJarInfo.applicationException.add(info);
         }
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Wed Apr 11 23:56:57 2007
@@ -33,6 +33,7 @@
 import javax.ejb.MessageDrivenBean;
 import javax.ejb.TimedObject;
 import javax.ejb.Timer;
+import javax.ejb.ApplicationException;
 import javax.persistence.EntityManagerFactory;
 import javax.naming.Context;
 
@@ -132,6 +133,7 @@
     private final List<Injection> injections = new ArrayList<Injection>();
     private Index<EntityManagerFactory,Map> extendedEntityManagerFactories;
     private final Map<Class, InterfaceType> interfaces = new HashMap<Class, InterfaceType>();
+    private final Map<Class, ExceptionType> exceptions = new HashMap<Class, ExceptionType>();
 
     public Class getInterface(InterfaceType interfaceType) {
         switch(interfaceType){
@@ -257,6 +259,34 @@
 
         for (Class clazz : interfce.getInterfaces()) {
             addInterface(clazz, type);
+        }
+    }
+
+    public void addApplicationException(Class exception, boolean rollback) {
+        if (rollback) {
+            exceptions.put(exception, ExceptionType.APPLICATION_ROLLBACK);
+        } else {
+            exceptions.put(exception, ExceptionType.APPLICATION);
+        }
+    }
+
+    public ExceptionType getExceptionType(Throwable e) {
+        // Errors are always system exceptions
+        if (!(e instanceof Exception)) {
+            return ExceptionType.SYSTEM;
+        }
+
+        // check the registered app exceptions
+        ExceptionType type = exceptions.get(e.getClass());
+        if (type != null) {
+            return type;
+        }
+
+        // Unregistered - runtime exceptions are system exception and the rest are application exceptions
+        if (e instanceof RuntimeException) {
+            return ExceptionType.SYSTEM;
+        } else {
+            return ExceptionType.APPLICATION;
         }
     }
 

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java?view=auto&rev=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java Wed Apr 11 23:56:57 2007
@@ -0,0 +1,7 @@
+package org.apache.openejb.core;
+
+public enum ExceptionType {
+    APPLICATION,
+    APPLICATION_ROLLBACK,
+    SYSTEM,
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java Wed Apr 11 23:56:57 2007
@@ -56,6 +56,7 @@
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.ExceptionType;
 import org.apache.openejb.core.timer.EjbTimerService;
 import org.apache.openejb.core.timer.EjbTimerServiceImpl;
 import org.apache.openejb.core.entity.EntityContext;
@@ -524,17 +525,17 @@
             returnValue = runMethod.invoke(bean, args);
 
         } catch (InvocationTargetException ite) {
-
-            if (!isApplicationException(callContext.getDeploymentInfo(), ite.getTargetException())) {
+            ExceptionType type = callContext.getDeploymentInfo().getExceptionType(ite.getTargetException());
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
                 txPolicy.handleSystemException(ite.getTargetException(), bean, txContext);
 
             } else {
                 /* Application Exception ***********************/
-                txPolicy.handleApplicationException(ite.getTargetException(), txContext);
+                txPolicy.handleApplicationException(ite.getTargetException(), type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
         } catch (NoSuchObjectException e) {
-            txPolicy.handleApplicationException(e, txContext);
+            txPolicy.handleApplicationException(e, false, txContext);
         } catch (Throwable e) {
             /* System Exception ****************************/
             txPolicy.handleSystemException(e, bean, txContext);
@@ -546,11 +547,6 @@
         return returnValue;
     }
 
-    @SuppressWarnings({"UnusedDeclaration"})
-    private boolean isApplicationException(DeploymentInfo deploymentInfo, Throwable e) {
-        return e instanceof Exception && !(e instanceof RuntimeException);
-    }
-
     private Object homeMethod(Method callMethod, Object[] args, ThreadContext callContext) throws OpenEJBException {
         CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
         TransactionPolicy txPolicy = deploymentInfo.getTransactionPolicy(callMethod);
@@ -583,14 +579,14 @@
             bean = null; // poof
 
         } catch (InvocationTargetException ite) {
-
-            if (!isApplicationException(callContext.getDeploymentInfo(), ite.getTargetException())) {
+            ExceptionType type = callContext.getDeploymentInfo().getExceptionType(ite.getTargetException());
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
                 txPolicy.handleSystemException(ite.getTargetException(), bean, txContext);
 
             } else {
                 /* Application Exception ***********************/
-                txPolicy.handleApplicationException(ite.getTargetException(), txContext);
+                txPolicy.handleApplicationException(ite.getTargetException(), type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
         } catch (Throwable e) {
             /* System Exception ****************************/
@@ -661,12 +657,13 @@
             }
 
         } catch (InvocationTargetException ite) {// handle enterprise bean exceptions
-            if (!isApplicationException(callContext.getDeploymentInfo(), ite.getTargetException())) {
+            ExceptionType type = callContext.getDeploymentInfo().getExceptionType(ite.getTargetException());
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
                 txPolicy.handleSystemException(ite.getTargetException(), bean, txContext);
             } else {
                 /* Application Exception ***********************/
-                txPolicy.handleApplicationException(ite.getTargetException(), txContext);
+                txPolicy.handleApplicationException(ite.getTargetException(), type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
         } catch (CreateException e) {
             txPolicy.handleSystemException(e, bean, txContext);
@@ -707,7 +704,7 @@
             // create a new ProxyInfo based on the deployment info and primary key
             return new ProxyInfo(deploymentInfo, primaryKey, objectInterface, this);
         } catch (javax.ejb.FinderException fe) {
-            txPolicy.handleApplicationException(fe, txContext);
+            txPolicy.handleApplicationException(fe, false, txContext);
         } catch (Throwable e) {// handle reflection exception
             txPolicy.handleSystemException(e, null, txContext);
         } finally {
@@ -772,7 +769,7 @@
                 }
             }
         } catch (javax.ejb.FinderException fe) {
-            txPolicy.handleApplicationException(fe, txContext);
+            txPolicy.handleApplicationException(fe, false, txContext);
         } catch (Throwable e) {// handle reflection exception
             txPolicy.handleSystemException(e, null, txContext);
         } finally {
@@ -866,7 +863,7 @@
             ejbRemove(entityBean);
             cmpEngine.removeBean(callContext);
         } catch (NoSuchObjectException e) {
-            txPolicy.handleApplicationException(e, txContext);
+            txPolicy.handleApplicationException(e, false, txContext);
         } catch (Throwable e) {// handle reflection exception
             txPolicy.handleSystemException(e, null, txContext);
         } finally {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java Wed Apr 11 23:56:57 2007
@@ -49,6 +49,7 @@
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.ExceptionType;
 import org.apache.openejb.core.timer.EjbTimerService;
 import org.apache.openejb.core.timer.EjbTimerServiceImpl;
 import org.apache.openejb.core.transaction.TransactionContainer;
@@ -218,17 +219,18 @@
             ejbStore_If_No_Transaction(callContext, bean);
             instanceManager.poolInstance(callContext, bean);
         } catch (java.lang.reflect.InvocationTargetException ite) {// handle enterprise bean exceptions
-            if (!isApplicationException(callContext.getDeploymentInfo(), ite.getTargetException())) {
+            ExceptionType type = callContext.getDeploymentInfo().getExceptionType(ite.getTargetException());
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
 
                 txPolicy.handleSystemException(ite.getTargetException(), bean, txContext);
             } else {
                 /* Application Exception ***********************/
                 instanceManager.poolInstance(callContext, bean);
-                txPolicy.handleApplicationException(ite.getTargetException(), txContext);
+                txPolicy.handleApplicationException(ite.getTargetException(), type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
         } catch (org.apache.openejb.ApplicationException e) {
-            txPolicy.handleApplicationException(e.getRootCause(), txContext);
+            txPolicy.handleApplicationException(e.getRootCause(), false, txContext);
         } catch (org.apache.openejb.SystemException se) {
             txPolicy.handleSystemException(se.getRootCause(), bean, txContext);
         } catch (Throwable iae) {// handle reflection exception
@@ -249,10 +251,6 @@
         return returnValue;
     }
 
-    private boolean isApplicationException(DeploymentInfo deploymentInfo, Throwable e) {
-        return e instanceof Exception && !(e instanceof RuntimeException);
-    }
-
     public void ejbLoad_If_No_Transaction(ThreadContext callContext, EntityBean bean) throws Exception {
         Operation orginalOperation = callContext.getCurrentOperation();
         BaseContext.State[] originalAllowedStates = callContext.getCurrentAllowedStates();
@@ -389,13 +387,14 @@
             // update pool
             instanceManager.poolInstance(callContext, bean);
         } catch (java.lang.reflect.InvocationTargetException ite) {// handle enterprise bean exceptions
-            if (!isApplicationException(callContext.getDeploymentInfo(), ite.getTargetException())) {
+            ExceptionType type = callContext.getDeploymentInfo().getExceptionType(ite.getTargetException());
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
                 txPolicy.handleSystemException(ite.getTargetException(), bean, txContext);
             } else {
                 /* Application Exception ***********************/
                 instanceManager.poolInstance(callContext, bean);
-                txPolicy.handleApplicationException(ite.getTargetException(), txContext);
+                txPolicy.handleApplicationException(ite.getTargetException(), type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
         } catch (OpenEJBException e) {
             txPolicy.handleSystemException(e.getRootCause(), bean, txContext);
@@ -504,17 +503,18 @@
             didRemove(bean, callContext);
             instanceManager.poolInstance(callContext, bean);
         } catch (org.apache.openejb.ApplicationException e) {
-            txPolicy.handleApplicationException(e.getRootCause(), txContext);
+            txPolicy.handleApplicationException(e.getRootCause(), false, txContext);
         } catch (org.apache.openejb.SystemException se) {
             txPolicy.handleSystemException(se.getRootCause(), bean, txContext);
         } catch (Exception e) {// handle reflection exception
-            if (!isApplicationException(callContext.getDeploymentInfo(), e)) {
+            ExceptionType type = callContext.getDeploymentInfo().getExceptionType(e);
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
                 txPolicy.handleSystemException(e, bean, txContext);
             } else {
                 /* Application Exception ***********************/
                 instanceManager.poolInstance(callContext, bean);
-                txPolicy.handleApplicationException(e, txContext);
+                txPolicy.handleApplicationException(e, type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
         } finally {
             txPolicy.afterInvoke(bean, txContext);

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java Wed Apr 11 23:56:57 2007
@@ -29,7 +29,6 @@
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.core.interceptor.InterceptorStack;
-import org.apache.openejb.core.mdb.Instance;
 import org.apache.openejb.core.transaction.TransactionContainer;
 import org.apache.openejb.core.transaction.TransactionContext;
 import org.apache.openejb.core.transaction.TransactionPolicy;
@@ -335,7 +334,7 @@
             } else {
                 //
                 // Application Exception ***********************
-                mdbCallContext.txPolicy.handleApplicationException(ite.getTargetException(), mdbCallContext.txContext);
+                mdbCallContext.txPolicy.handleApplicationException(ite.getTargetException(), false, mdbCallContext.txContext);
             }
         } catch (Throwable re) {// handle reflection exception
             //  Any exception thrown by reflection; not by the enterprise bean. Possible

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MessageDrivenBeanManagedTxPolicy.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MessageDrivenBeanManagedTxPolicy.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MessageDrivenBeanManagedTxPolicy.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MessageDrivenBeanManagedTxPolicy.java Wed Apr 11 23:56:57 2007
@@ -76,7 +76,9 @@
         }
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
+
         throw new ApplicationException(appException);
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SessionSynchronizationTxPolicy.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SessionSynchronizationTxPolicy.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SessionSynchronizationTxPolicy.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SessionSynchronizationTxPolicy.java Wed Apr 11 23:56:57 2007
@@ -19,12 +19,13 @@
 import org.apache.openejb.ApplicationException;
 import org.apache.openejb.InvalidateReferenceException;
 import org.apache.openejb.ContainerType;
+import org.apache.openejb.SystemException;
 import org.apache.openejb.core.transaction.TransactionContext;
 import org.apache.openejb.core.transaction.TransactionPolicy;
 
 import javax.ejb.SessionSynchronization;
 
-public class SessionSynchronizationTxPolicy extends org.apache.openejb.core.transaction.TransactionPolicy {
+public class SessionSynchronizationTxPolicy extends TransactionPolicy {
 
     protected TransactionPolicy policy;
 
@@ -39,7 +40,7 @@
 
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
         policy.beforeInvoke(instance, context);
 
         if (context.currentTx == null) return;
@@ -60,15 +61,15 @@
         }
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
         policy.afterInvoke(instance, context);
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
-        policy.handleApplicationException(appException, context);
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        policy.handleApplicationException(appException, rollback, context);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
         try {
             policy.handleSystemException(sysException, instance, context);
         } catch (ApplicationException e) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulBeanManagedTxPolicy.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulBeanManagedTxPolicy.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulBeanManagedTxPolicy.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulBeanManagedTxPolicy.java Wed Apr 11 23:56:57 2007
@@ -86,7 +86,8 @@
         }
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
         throw new ApplicationException(appException);
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Wed Apr 11 23:56:57 2007
@@ -16,7 +16,6 @@
  */
 package org.apache.openejb.core.stateful;
 
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
 import java.rmi.dgc.VMID;
@@ -43,6 +42,7 @@
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.ExceptionType;
 import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.core.interceptor.InterceptorStack;
 import org.apache.openejb.core.transaction.TransactionContainer;
@@ -285,7 +285,7 @@
 
                 Method createOrInit = deploymentInfo.getMatchingBeanMethod(callMethod);
 
-                InterceptorStack interceptorStack = new InterceptorStack(instance.bean, createOrInit, Operation.CREATE, new ArrayList(), new HashMap());
+                InterceptorStack interceptorStack = new InterceptorStack(instance.bean, createOrInit, Operation.CREATE, new ArrayList<InterceptorData>(), new HashMap<String,Object>());
 
                 _invoke(callMethod, interceptorStack, args, instance, createContext);
             }
@@ -419,19 +419,9 @@
             } else {
                 returnValue = interceptorStack.invoke(args);
             }
-        } catch (InvocationTargetException ite) {// handle enterprise bean exception
-            if (!isApplicationException(callContext.getDeploymentInfo(), ite.getTargetException())) {
-                /* System Exception ****************************/
-
-                txPolicy.handleSystemException(ite.getTargetException(), bean, txContext);
-            } else {
-                /* Application Exception ***********************/
-                instanceManager.poolInstance(callContext.getPrimaryKey(), bean);
-
-                txPolicy.handleApplicationException(ite.getTargetException(), txContext);
-            }
         } catch (Throwable re) {// handle reflection exception
-            if (!isApplicationException(callContext.getDeploymentInfo(), re)) {
+            ExceptionType type = callContext.getDeploymentInfo().getExceptionType(re);
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
 
                 txPolicy.handleSystemException(re, bean, txContext);
@@ -439,29 +429,14 @@
                 /* Application Exception ***********************/
                 instanceManager.poolInstance(callContext.getPrimaryKey(), bean);
 
-                txPolicy.handleApplicationException(re, txContext);
+                txPolicy.handleApplicationException(re, type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
-            /*
-              Any exception thrown by reflection; not by the enterprise bean. Possible
-              Exceptions are:
-                IllegalAccessException - if the underlying method is inaccessible.
-                IllegalArgumentException - if the number of actual and formal parameters differ, or if an unwrapping conversion fails.
-                NullPointerException - if the specified object is null and the method is an instance method.
-                ExceptionInitializerError - if the initialization provoked by this method fails.
-            */
-
-            txPolicy.handleSystemException(re, bean, txContext);
-
         } finally {
             unregisterEntityManagers(callContext);
             txPolicy.afterInvoke(bean, txContext);
         }
 
         return returnValue;
-    }
-
-    private boolean isApplicationException(DeploymentInfo deploymentInfo, Throwable e) {
-        return e instanceof Exception && !(e instanceof RuntimeException);
     }
 
     private Index<EntityManagerFactory, EntityManager> createEntityManagers(CoreDeploymentInfo deploymentInfo) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainerManagedTxPolicy.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainerManagedTxPolicy.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainerManagedTxPolicy.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainerManagedTxPolicy.java Wed Apr 11 23:56:57 2007
@@ -19,10 +19,11 @@
 import org.apache.openejb.ApplicationException;
 import org.apache.openejb.InvalidateReferenceException;
 import org.apache.openejb.ContainerType;
+import org.apache.openejb.SystemException;
 import org.apache.openejb.core.transaction.TransactionContext;
 import org.apache.openejb.core.transaction.TransactionPolicy;
 
-public class StatefulContainerManagedTxPolicy extends org.apache.openejb.core.transaction.TransactionPolicy {
+public class StatefulContainerManagedTxPolicy extends TransactionPolicy {
 
     protected TransactionPolicy policy;
 
@@ -38,19 +39,19 @@
         return policy.policyToString();
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
         policy.beforeInvoke(instance, context);
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
         policy.afterInvoke(instance, context);
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
-        policy.handleApplicationException(appException, context);
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        policy.handleApplicationException(appException, rollback, context);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
         try {
             policy.handleSystemException(sysException, instance, context);
         } catch (ApplicationException e) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessBeanManagedTxPolicy.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessBeanManagedTxPolicy.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessBeanManagedTxPolicy.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessBeanManagedTxPolicy.java Wed Apr 11 23:56:57 2007
@@ -18,6 +18,7 @@
 
 import org.apache.openejb.ApplicationException;
 import org.apache.openejb.ContainerType;
+import org.apache.openejb.SystemException;
 import org.apache.openejb.core.transaction.TransactionContainer;
 import org.apache.openejb.core.transaction.TransactionContext;
 import org.apache.openejb.core.transaction.TransactionPolicy;
@@ -38,12 +39,12 @@
         return "TX_BeanManaged: ";
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
 
         context.clientTx = suspendTransaction(context);
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
         try {
             /*
             * The Container must detect the case in which a transaction was started, but
@@ -53,8 +54,7 @@
 
             if (context.currentTx == null) return;
 
-            if (context.currentTx.getStatus() != Status.STATUS_ROLLEDBACK && context.currentTx.getStatus() != Status.STATUS_COMMITTED)
-            {
+            if (context.currentTx.getStatus() != Status.STATUS_ROLLEDBACK && context.currentTx.getStatus() != Status.STATUS_COMMITTED) {
                 String message = "The stateless session bean started a transaction but did not complete it.";
 
                 /* [1] Log this as an application error ********/
@@ -72,18 +72,19 @@
             }
 
         } catch (javax.transaction.SystemException e) {
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
         } finally {
             resumeTransaction(context, context.clientTx);
         }
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
 
         throw new ApplicationException(appException);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
         try {
             context.currentTx = context.getTransactionManager().getTransaction();
         } catch (javax.transaction.SystemException e) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java Wed Apr 11 23:56:57 2007
@@ -37,6 +37,7 @@
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.ExceptionType;
 import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.core.interceptor.InterceptorStack;
 import org.apache.openejb.core.timer.EjbTimerService;
@@ -196,19 +197,9 @@
                 InterceptorStack interceptorStack = new InterceptorStack(instance.bean, runMethod, Operation.BUSINESS, interceptors, instance.interceptors);
                 returnValue = interceptorStack.invoke(args);
             }
-        } catch (java.lang.reflect.InvocationTargetException ite) {// handle exceptions thrown by enterprise bean
-            if (!isApplicationException(deploymentInfo, ite.getTargetException())) {
-                /* System Exception ****************************/
-
-                txPolicy.handleSystemException(ite.getTargetException(), instance, txContext);
-            } else {
-                /* Application Exception ***********************/
-                instanceManager.poolInstance(callContext, instance);
-
-                txPolicy.handleApplicationException(ite.getTargetException(), txContext);
-            }
         } catch (Throwable re) {// handle reflection exception
-            if (!isApplicationException(deploymentInfo, re)) {
+            ExceptionType type = deploymentInfo.getExceptionType(re);
+            if (type == ExceptionType.SYSTEM) {
                 /* System Exception ****************************/
 
                 txPolicy.handleSystemException(re, instance, txContext);
@@ -216,17 +207,8 @@
                 /* Application Exception ***********************/
                 instanceManager.poolInstance(callContext, instance);
 
-                txPolicy.handleApplicationException(re, txContext);
+                txPolicy.handleApplicationException(re, type == ExceptionType.APPLICATION_ROLLBACK, txContext);
             }
-            /*
-              Any exception thrown by reflection; not by the enterprise bean. Possible
-              Exceptions are:
-                IllegalAccessException - if the underlying method is inaccessible.
-                IllegalArgumentException - if the number of actual and formal parameters differ, or if an unwrapping conversion fails.
-                NullPointerException - if the specified object is null and the method is an instance method.
-                ExceptionInInitializerError - if the initialization provoked by this method fails.
-            */
-//            txPolicy.handleSystemException(re, bean, txContext);
         } finally {
 
             txPolicy.afterInvoke(instance, txContext);
@@ -252,13 +234,13 @@
 
 
         //  Add the webservice interceptor to the list of interceptor instances
-        Map<String, Object> interceptors = new HashMap(instance.interceptors);
+        Map<String, Object> interceptors = new HashMap<String, Object>(instance.interceptors);
         {
             interceptors.put(interceptor.getClass().getName(), interceptor);
         }
 
         //  Create an InterceptorData for the webservice interceptor to the list of interceptorDatas for this method
-        List<InterceptorData> interceptorDatas = new ArrayList(deploymentInfo.getMethodInterceptors(runMethod));
+        List<InterceptorData> interceptorDatas = new ArrayList<InterceptorData>(deploymentInfo.getMethodInterceptors(runMethod));
         {
             InterceptorData providerData = new InterceptorData(interceptor.getClass());
             ClassFinder finder = new ClassFinder(interceptor.getClass());
@@ -281,10 +263,6 @@
         // DMB: This will be a problem if the calling method is in an interface and the
         // service-endpoint interface extends that interface.
         return (serviceEndpointInterface != null && serviceEndpointInterface.isAssignableFrom(callMethod.getDeclaringClass()));
-    }
-
-    private boolean isApplicationException(DeploymentInfo deploymentInfo, Throwable e) {
-        return e instanceof Exception && !(e instanceof RuntimeException);
     }
 
     private TransactionManager getTransactionManager() {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbHomeHandler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbHomeHandler.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbHomeHandler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbHomeHandler.java Wed Apr 11 23:56:57 2007
@@ -41,29 +41,8 @@
         throw new RemoveException("Session objects are private resources and do not have primary keys");
     }
 
-    /*
-    * This method is different from the stateful and entity behavior because we only want the 
-    * stateless session bean that created the proxy to be invalidated, not all the proxies.
-    *
-    * TODO: this method relies on the fact that the handle implementation is a subclass
-    * of IntraVM handle, which isn't neccessarily the case for arbitrary remote protocols.
-    */
     protected Object removeWithHandle(Method method, Object[] args, Object proxy) throws Throwable {
-
-        IntraVmHandle handle = (IntraVmHandle) args[0];
-        Object primKey = handle.getPrimaryKey();
-        EjbObjectProxyHandler stub;
-        try {
-            stub = (EjbObjectProxyHandler) ProxyManager.getInvocationHandler(handle.getEJBObject());
-        } catch (IllegalArgumentException e) {
-
-            stub = null;
-        }
-
-        container.invoke(deploymentID, method, args, primKey);
-        if (stub != null) {
-            stub.invalidateReference();
-        }
+        // stateless can't be removed
         return null;
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbObjectHandler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbObjectHandler.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbObjectHandler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessEjbObjectHandler.java Wed Apr 11 23:56:57 2007
@@ -56,9 +56,12 @@
         }
     }
 
+    public void invalidateReference() {
+        // stateless can't be removed
+    }
+
     protected Object remove(Method method, Object[] args, Object proxy) throws Throwable {
-        invalidateReference();
+        // stateless can't be removed
         return null;
     }
-
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TransactionPolicy.java Wed Apr 11 23:56:57 2007
@@ -24,6 +24,11 @@
 
 import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.RollbackException;
+import javax.transaction.NotSupportedException;
 import java.rmi.RemoteException;
 
 public abstract class TransactionPolicy {
@@ -62,13 +67,13 @@
         return policyType.toString();
     }
 
-    public abstract void handleApplicationException(Throwable appException, TransactionContext context) throws org.apache.openejb.ApplicationException;
+    public abstract void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException;
 
-    public abstract void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException;
+    public abstract void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException;
 
-    public abstract void beforeInvoke(Object bean, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException;
+    public abstract void beforeInvoke(Object bean, TransactionContext context) throws SystemException, ApplicationException;
 
-    public abstract void afterInvoke(Object bean, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException;
+    public abstract void afterInvoke(Object bean, TransactionContext context) throws ApplicationException, SystemException;
 
     protected void markTxRollbackOnly(Transaction tx) throws SystemException {
         try {
@@ -80,7 +85,7 @@
             }
         } catch (javax.transaction.SystemException se) {
             logger.error("Exception during setRollbackOnly()", se);
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
     }
 
@@ -93,7 +98,7 @@
             return tx;
         } catch (javax.transaction.SystemException se) {
             logger.error("Exception during suspend()", se);
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
     }
 
@@ -109,18 +114,18 @@
                 }
                 context.getTransactionManager().resume(tx);
             }
-        } catch (javax.transaction.InvalidTransactionException ite) {
+        } catch (InvalidTransactionException ite) {
 
             txLogger.error("Could not resume the client's transaction, the transaction is no longer valid: " + ite.getMessage());
-            throw new org.apache.openejb.SystemException(ite);
+            throw new SystemException(ite);
         } catch (IllegalStateException e) {
 
             txLogger.error("Could not resume the client's transaction: " + e.getMessage());
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
         } catch (javax.transaction.SystemException e) {
 
             txLogger.error("Could not resume the client's transaction: The transaction reported a system exception: " + e.getMessage());
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
         }
     }
 
@@ -135,32 +140,32 @@
             } else {
                 tx.commit();
             }
-        } catch (javax.transaction.RollbackException e) {
+        } catch (RollbackException e) {
 
             txLogger.info("The transaction has been rolled back rather than commited: " + e.getMessage());
 
-        } catch (javax.transaction.HeuristicMixedException e) {
+        } catch (HeuristicMixedException e) {
 
             txLogger.info("A heuristic decision was made, some relevant updates have been committed while others have been rolled back: " + e.getMessage());
 
-        } catch (javax.transaction.HeuristicRollbackException e) {
+        } catch (HeuristicRollbackException e) {
 
             txLogger.info("A heuristic decision was made while commiting the transaction, some relevant updates have been rolled back: " + e.getMessage());
 
         } catch (SecurityException e) {
 
             txLogger.error("The current thread is not allowed to commit the transaction: " + e.getMessage());
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
 
         } catch (IllegalStateException e) {
 
             txLogger.error("The current thread is not associated with a transaction: " + e.getMessage());
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
 
         } catch (javax.transaction.SystemException e) {
             txLogger.error("The Transaction Manager has encountered an unexpected error condition while attempting to commit the transaction: " + e.getMessage());
 
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
         }
     }
 
@@ -178,12 +183,12 @@
         } catch (IllegalStateException e) {
 
             logger.error("The TransactionManager reported an exception while attempting to rollback the transaction: " + e.getMessage());
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
 
         } catch (javax.transaction.SystemException e) {
 
             logger.error("The TransactionManager reported an exception while attempting to rollback the transaction: " + e.getMessage());
-            throw new org.apache.openejb.SystemException(e);
+            throw new SystemException(e);
         }
     }
 
@@ -224,7 +229,7 @@
             if (txLogger.isInfoEnabled()) {
                 txLogger.info("TX " + policyToString() + ": Started transaction " + context.getTransactionManager().getTransaction());
             }
-        } catch (javax.transaction.NotSupportedException nse) {
+        } catch (NotSupportedException nse) {
             logger.error("", nse);
         }
     }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxManditory.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxManditory.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxManditory.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxManditory.java Wed Apr 11 23:56:57 2007
@@ -17,6 +17,9 @@
 package org.apache.openejb.core.transaction;
 
 import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
+
+import javax.transaction.TransactionRequiredException;
 
 public class TxManditory extends TransactionPolicy {
 
@@ -24,7 +27,7 @@
         super(Type.Mandatory, container);
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
 
         try {
 
@@ -32,27 +35,27 @@
 
             if (context.clientTx == null) {
 
-                throw new ApplicationException(new javax.transaction.TransactionRequiredException());
+                throw new ApplicationException(new TransactionRequiredException());
             }
 
             context.currentTx = context.clientTx;
 
         } catch (javax.transaction.SystemException se) {
             logger.error("Exception during getTransaction()", se);
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
-
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
 
         throw new ApplicationException(appException);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
         /* [1] Log the system exception or error *********/
         logSystemException(sysException);

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNever.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNever.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNever.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNever.java Wed Apr 11 23:56:57 2007
@@ -17,6 +17,9 @@
 package org.apache.openejb.core.transaction;
 
 import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
+
+import java.rmi.RemoteException;
 
 public class TxNever extends TransactionPolicy {
 
@@ -24,31 +27,31 @@
         super(Type.Never, container);
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
 
         try {
 
             if (context.getTransactionManager().getTransaction() != null) {
 
-                throw new ApplicationException(new java.rmi.RemoteException("Transactions not supported"));
+                throw new ApplicationException(new RemoteException("Transactions not supported"));
             }
 
         } catch (javax.transaction.SystemException se) {
             logger.error("Exception during getTransaction()", se);
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
-
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
 
         throw new ApplicationException(appException);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
         /* [1] Log the system exception or error *********/
         logSystemException(sysException);
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNotSupported.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNotSupported.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNotSupported.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxNotSupported.java Wed Apr 11 23:56:57 2007
@@ -17,6 +17,9 @@
 package org.apache.openejb.core.transaction;
 
 import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
+
+import javax.transaction.InvalidTransactionException;
 
 public class TxNotSupported extends TransactionPolicy {
 
@@ -24,24 +27,24 @@
         super(Type.NotSupported, container);
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
 
         try {
 
             context.clientTx = context.getTransactionManager().suspend();
         } catch (javax.transaction.SystemException se) {
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
         context.currentTx = null;
 
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
         if (context.clientTx != null) {
             try {
                 context.getTransactionManager().resume(context.clientTx);
-            } catch (javax.transaction.InvalidTransactionException ite) {
+            } catch (InvalidTransactionException ite) {
 
                 logger.error("Could not resume the client's transaction, the transaction is no longer valid: " + ite.getMessage());
             } catch (IllegalStateException e) {
@@ -54,12 +57,13 @@
         }
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
 
         throw new ApplicationException(appException);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
         /* [1] Log the system exception or error *********/
         logSystemException(sysException);
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequired.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequired.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequired.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequired.java Wed Apr 11 23:56:57 2007
@@ -19,6 +19,7 @@
 import javax.transaction.Status;
 
 import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
 
 public class TxRequired extends TransactionPolicy {
 
@@ -26,7 +27,7 @@
         super(Type.Required, container);
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
 
         try {
 
@@ -40,11 +41,11 @@
 
         } catch (javax.transaction.SystemException se) {
             logger.error("Exception during getTransaction()", se);
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
         try {
             if (context.clientTx != null) return;
@@ -57,16 +58,17 @@
 
         } catch (javax.transaction.SystemException se) {
             logger.error("Exception during getTransaction()", se);
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
 
         throw new ApplicationException(appException);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
         /* [1] Log the system exception or error **********/
         logSystemException(sysException);

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequiresNew.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequiresNew.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequiresNew.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxRequiresNew.java Wed Apr 11 23:56:57 2007
@@ -17,6 +17,7 @@
 package org.apache.openejb.core.transaction;
 
 import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
 
 import javax.transaction.Status;
 
@@ -26,7 +27,7 @@
         super(Type.RequiresNew, container);
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
 
         try {
 
@@ -35,12 +36,12 @@
             context.currentTx = context.getTransactionManager().getTransaction();
 
         } catch (javax.transaction.SystemException se) {
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
 
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
         try {
 
@@ -51,7 +52,7 @@
             }
 
         } catch (javax.transaction.SystemException se) {
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         } finally {
             if (context.clientTx != null) {
                 resumeTransaction(context, context.clientTx);
@@ -61,11 +62,13 @@
         }
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
+
         throw new ApplicationException(appException);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
         /* [1] Log the system exception or error **********/
         logSystemException(sysException);

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxSupports.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxSupports.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxSupports.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/TxSupports.java Wed Apr 11 23:56:57 2007
@@ -17,6 +17,7 @@
 package org.apache.openejb.core.transaction;
 
 import org.apache.openejb.ApplicationException;
+import org.apache.openejb.SystemException;
 
 public class TxSupports extends TransactionPolicy {
 
@@ -24,7 +25,7 @@
         super(Type.Supports, container);
     }
 
-    public void beforeInvoke(Object instance, TransactionContext context) throws org.apache.openejb.SystemException, org.apache.openejb.ApplicationException {
+    public void beforeInvoke(Object instance, TransactionContext context) throws SystemException, ApplicationException {
 
         try {
 
@@ -32,20 +33,21 @@
             context.currentTx = context.clientTx;
 
         } catch (javax.transaction.SystemException se) {
-            throw new org.apache.openejb.SystemException(se);
+            throw new SystemException(se);
         }
     }
 
-    public void afterInvoke(Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void afterInvoke(Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
     }
 
-    public void handleApplicationException(Throwable appException, TransactionContext context) throws ApplicationException {
+    public void handleApplicationException(Throwable appException, boolean rollback, TransactionContext context) throws ApplicationException, SystemException {
+        if (rollback && context.currentTx != null) markTxRollbackOnly(context.currentTx);
 
         throw new ApplicationException(appException);
     }
 
-    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws org.apache.openejb.ApplicationException, org.apache.openejb.SystemException {
+    public void handleSystemException(Throwable sysException, Object instance, TransactionContext context) throws ApplicationException, SystemException {
 
         boolean runningInTransaction = (context.currentTx != null);
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java Wed Apr 11 23:56:57 2007
@@ -57,6 +57,14 @@
     @XmlID
     protected String id;
 
+    public ApplicationException() {
+    }
+
+    public ApplicationException(String exceptionClass, boolean rollback) {
+        this.exceptionClass = exceptionClass;
+        this.rollback = rollback;
+    }
+
     public String getExceptionClass() {
         return exceptionClass;
     }

Modified: incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessEjbObjectTests.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessEjbObjectTests.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessEjbObjectTests.java (original)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessEjbObjectTests.java Wed Apr 11 23:56:57 2007
@@ -104,13 +104,8 @@
     public void test05_remove(){
         try{
             ejbObject.remove();
-            try{
-                ejbObject.businessMethod("Should throw an exception");
-                assertTrue( "Calling business method after removing the EJBObject does not throw an exception", false );
-            } catch (Exception e){
-                assertTrue( true );
-                return;
-            }
+            // you can't really remove a stateless handle
+            ejbObject.businessMethod("Should not throw an exception");
         } catch (Exception e){
             fail("Received Exception "+e.getClass()+ " : "+e.getMessage());
         }

Modified: incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessHandleTests.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessHandleTests.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessHandleTests.java (original)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessHandleTests.java Wed Apr 11 23:56:57 2007
@@ -80,13 +80,8 @@
     public void test02_EJBHome_remove(){
         try{
             ejbHome.remove(ejbHandle);
-            try{
-                ejbObject.businessMethod("Should throw an exception");
-                assertTrue( "Calling business method after removing the EJBObject does not throw an exception", false );
-            } catch (Exception e){
-                assertTrue( true );
-                return;
-            }
+            // you can't really remove a stateless handle
+            ejbObject.businessMethod("Should not throw an exception");
         } catch (Exception e){
             fail("Received Exception "+e.getClass()+ " : "+e.getMessage());
         }

Modified: incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbLocalObjectTests.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbLocalObjectTests.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbLocalObjectTests.java (original)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbLocalObjectTests.java Wed Apr 11 23:56:57 2007
@@ -90,14 +90,9 @@
 
     public void test04_remove() {
         try {
-            try {
-                ejbLocalObject.remove();
-                ejbLocalObject.businessMethod("Should throw an exception");
-                assertTrue("Calling business method after removing the EJBObject does not throw an exception", false);
-            } catch (Exception e) {
-                assertTrue(true);
-                return;
-            }
+            ejbLocalObject.remove();
+            // you can't really remove a stateless handle
+            ejbLocalObject.businessMethod("Should not throw an exception");
         } catch (Exception e) {
             fail("Received Exception " + e.getClass() + " : " + e.getMessage());
         }

Modified: incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbObjectTests.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbObjectTests.java?view=diff&rev=527791&r1=527790&r2=527791
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbObjectTests.java (original)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/stateless/StatelessPojoEjbObjectTests.java Wed Apr 11 23:56:57 2007
@@ -105,15 +105,8 @@
     public void test04_remove() {
         try {
             ejbObject.remove();
-            try {
-                ejbObject.businessMethod("Should throw an exception");
-                assertTrue(
-                        "Calling business method after removing the EJBObject does not throw an exception",
-                        false);
-            } catch (Exception e) {
-                assertTrue(true);
-                return;
-            }
+            // you can't really remove a stateless handle
+            ejbObject.businessMethod("Should not throw an exception");
         } catch (Exception e) {
             fail("Received Exception " + e.getClass() + " : " + e.getMessage());
         }