You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by dj...@apache.org on 2010/08/07 02:07:35 UTC

svn commit: r983147 - in /openejb/trunk/openejb3/container: openejb-core/src/main/java/org/apache/openejb/assembler/classic/ openejb-core/src/main/java/org/apache/openejb/config/ openejb-core/src/main/java/org/apache/openejb/core/ openejb-core/src/test...

Author: djencks
Date: Sat Aug  7 00:07:34 2010
New Revision: 983147

URL: http://svn.apache.org/viewvc?rev=983147&view=rev
Log:
OPENEJB-1195, OPENEJB-980 Implement support for turning on and off app exception inheritedness.  Merge annotations and xml properly

Added:
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/InheritedAppExceptionTest.java
Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AnnotationDeployerTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/EntityManagerPropogationTest.java
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AssemblyDescriptor.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ApplicationExceptionInfo.java Sat Aug  7 00:07:34 2010
@@ -20,4 +20,5 @@ package org.apache.openejb.assembler.cla
 public class ApplicationExceptionInfo extends InfoObject {
     public String exceptionClass;
     public boolean rollback;
+    public boolean inherited;
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Sat Aug  7 00:07:34 2010
@@ -610,7 +610,7 @@ public class Assembler extends Assembler
                         Class exceptionClass = classLoader.loadClass(exceptionInfo.exceptionClass);
                         for (DeploymentInfo deploymentInfo : deployments.values()) {
                             CoreDeploymentInfo coreDeploymentInfo = (CoreDeploymentInfo) deploymentInfo;
-                            coreDeploymentInfo.addApplicationException(exceptionClass, exceptionInfo.rollback);
+                            coreDeploymentInfo.addApplicationException(exceptionClass, exceptionInfo.rollback, exceptionInfo.inherited);
                         }
                     } catch (ClassNotFoundException e) {
                         logger.error("createApplication.invalidClass", e, exceptionInfo.exceptionClass, e.getMessage());

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Sat Aug  7 00:07:34 2010
@@ -233,6 +233,16 @@ public class AnnotationDeployer implemen
         return getModule().getValidation();
     }
 
+    private static void mergeApplicationExceptionAnnotation(AssemblyDescriptor assemblyDescriptor, Class<?> exceptionClass, ApplicationException annotation) {
+        org.apache.openejb.jee.ApplicationException applicationException = assemblyDescriptor.getApplicationException(exceptionClass);
+        if (applicationException.getRollback() == null) {
+            applicationException.setRollback(annotation.rollback());
+        }
+        if (applicationException.getInherited() == null) {
+            applicationException.setInherited(annotation.inherited());
+        }
+    }
+
     public static class DiscoverAnnotatedBeans implements DynamicDeployer {
 
         public static final Set<String> knownResourceEnvTypes = new TreeSet<String>(asList(
@@ -547,24 +557,16 @@ public class AnnotationDeployer implemen
                 ejbModule.getEjbJar().setAssemblyDescriptor(assemblyDescriptor);
             }
 
-            // https://issues.apache.org/jira/browse/OPENEJB-980
-            startupLogger.debug("Searching for inherited application exceptions (see OPENEJB-980) - it doesn't care whether inherited is true/false");
-            List<Class> appExceptions;
-            appExceptions = finder.findInheritedAnnotatedClasses(ApplicationException.class);
+            startupLogger.debug("Searching for annotated application exceptions (see OPENEJB-980)");
+            List<Class> appExceptions = finder.findAnnotatedClasses(ApplicationException.class);
             for (Class<?> exceptionClass : appExceptions) {
                 startupLogger.debug("...handling " + exceptionClass);
+                ApplicationException annotation = exceptionClass.getAnnotation(ApplicationException.class);
                 if (assemblyDescriptor.getApplicationException(exceptionClass) == null) {
-                    ApplicationException annotation = exceptionClass.getAnnotation(ApplicationException.class);
-                    // OPENEJB-980
-                    if (annotation == null) {
-                        Class<?> parentExceptionClass = exceptionClass;
-                        while (annotation == null) {
-                            parentExceptionClass = parentExceptionClass.getSuperclass();
-                            annotation = parentExceptionClass.getAnnotation(ApplicationException.class);
-                        }
-                    }
                     startupLogger.debug("...adding " + exceptionClass + " with rollback=" + annotation.rollback());
-                    assemblyDescriptor.addApplicationException(exceptionClass, annotation.rollback());
+                    assemblyDescriptor.addApplicationException(exceptionClass, annotation.rollback(), annotation.inherited());
+                } else {
+                    mergeApplicationExceptionAnnotation(assemblyDescriptor, exceptionClass, annotation);
                 }
             }
 
@@ -1528,6 +1530,7 @@ public class AnnotationDeployer implemen
             return ejbModule;
         }
 
+        //TODO why is this necessary, we scan for exceptions with this annotation elsewhere.
         private void processApplicationExceptions(Class<?> clazz, AssemblyDescriptor assemblyDescriptor) {
             /*
              * @ApplicationException
@@ -1536,8 +1539,12 @@ public class AnnotationDeployer implemen
                 for (Class<?> exception : method.getExceptionTypes()) {
                     ApplicationException annotation = exception.getAnnotation(ApplicationException.class);
                     if (annotation == null) continue;
-                    if (assemblyDescriptor.getApplicationException(exception) != null) continue;
-                    assemblyDescriptor.addApplicationException(exception, annotation.rollback());
+                    if (assemblyDescriptor.getApplicationException(exception) != null) {
+                        mergeApplicationExceptionAnnotation(assemblyDescriptor, exception, annotation);
+                    } else {
+                        logger.info("Found previously undetected application exception {} listed on a method {} with annotation {}", method, exception, annotation);
+                        assemblyDescriptor.addApplicationException(exception, annotation.rollback(), annotation.inherited());
+                    }
                 }
             }
         }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java Sat Aug  7 00:07:34 2010
@@ -389,7 +389,8 @@ public class EjbJarInfoBuilder {
         for (ApplicationException applicationException : jar.getEjbJar().getAssemblyDescriptor().getApplicationException()) {
             ApplicationExceptionInfo info = new ApplicationExceptionInfo();
             info.exceptionClass = applicationException.getExceptionClass();
-            info.rollback = applicationException.getRollback();
+            info.rollback = applicationException.isRollback();
+            info.inherited = applicationException.isInherited();
             ejbJarInfo.applicationException.add(info);
         }
     }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Sat Aug  7 00:07:34 2010
@@ -256,11 +256,19 @@ public class CoreDeploymentInfo extends 
         }
     }
 
-    public void addApplicationException(Class exception, boolean rollback) {
-        if (rollback) {
-            exceptions.put(exception, ExceptionType.APPLICATION_ROLLBACK);
+    public void addApplicationException(Class exception, boolean rollback, boolean inherited) {
+        if (inherited) {
+            if (rollback) {
+                exceptions.put(exception, ExceptionType.APPLICATION_ROLLBACK);
+            } else {
+                exceptions.put(exception, ExceptionType.APPLICATION);
+            }
         } else {
-            exceptions.put(exception, ExceptionType.APPLICATION);
+            if (rollback) {
+                exceptions.put(exception, ExceptionType.APPLICATION_ROLLBACK_NOT_INHERITED);
+            } else {
+                exceptions.put(exception, ExceptionType.APPLICATION_NOT_INHERITED);
+            }
         }
     }
 
@@ -271,9 +279,24 @@ public class CoreDeploymentInfo extends 
         }
 
         // check the registered app exceptions
-        ExceptionType type = exceptions.get(e.getClass());
-        if (type != null) {
-            return type;
+        Class<?> exceptionClass = e.getClass();
+        boolean inherited = false;
+        while (exceptionClass != Object.class) {
+            ExceptionType type = exceptions.get(exceptionClass);
+            if (type == ExceptionType.APPLICATION || type == ExceptionType.APPLICATION_ROLLBACK) {
+                return type;
+            }
+            if (type != null) {
+                if (inherited) {
+                    return ExceptionType.SYSTEM;
+                }
+                if (type == ExceptionType.APPLICATION_NOT_INHERITED) {
+                    return ExceptionType.APPLICATION;
+                }
+                return ExceptionType.APPLICATION_ROLLBACK;
+            }
+            exceptionClass = exceptionClass.getSuperclass();
+            inherited = true;
         }
 
         // Unregistered - runtime exceptions are system exception and the rest are application exceptions

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ExceptionType.java Sat Aug  7 00:07:34 2010
@@ -19,5 +19,7 @@ package org.apache.openejb.core;
 public enum ExceptionType {
     APPLICATION,
     APPLICATION_ROLLBACK,
+    APPLICATION_NOT_INHERITED,
+    APPLICATION_ROLLBACK_NOT_INHERITED,
     SYSTEM,
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AnnotationDeployerTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AnnotationDeployerTest.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AnnotationDeployerTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AnnotationDeployerTest.java Sat Aug  7 00:07:34 2010
@@ -57,12 +57,11 @@ public class AnnotationDeployerTest {
                 assemblyDescriptor.getApplicationException(BusinessException.class);
         assertThat(appEx, notNullValue());
         assertThat(appEx.getExceptionClass(), is(BusinessException.class.getName()));
-        assertThat(appEx.getRollback(), is(true));
+        assertThat(appEx.isRollback(), is(true));
 
+        //inheritance is now handled at runtime, only explicitly mentioned exceptions are in the assembly descriptor
         appEx = assemblyDescriptor.getApplicationException(ValueRequiredException.class);
-        assertThat(appEx, notNullValue());
-        assertThat(appEx.getExceptionClass(), is(ValueRequiredException.class.getName()));
-        assertThat(appEx.getRollback(), is(true));
+        assertThat(appEx, nullValue());
     }
     
     @Test

Added: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/InheritedAppExceptionTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/InheritedAppExceptionTest.java?rev=983147&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/InheritedAppExceptionTest.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/InheritedAppExceptionTest.java Sat Aug  7 00:07:34 2010
@@ -0,0 +1,70 @@
+/*
+ * 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.core;
+
+import java.util.HashMap;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+import org.apache.openejb.loader.SystemInstance;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+
+
+public class InheritedAppExceptionTest {
+
+    public static class AE1 extends RuntimeException {
+    }
+    public static class AE2 extends AE1 {
+    }
+    public static class AE3 extends AE2 {
+    }
+    public static class AE4 extends AE3 {
+    }
+    public static class AE5 extends AE4 {
+    }
+    public static class AE6 extends AE5 {
+    }
+    public static class AE7 extends AE6 {
+    }
+
+    @Test
+    public void testRollback() throws Exception {
+        SystemInstance.init(new Properties());
+        CoreDeploymentInfo cdi = new CoreDeploymentInfo("foo", null, new ModuleContext("foo", new AppContext("foo", SystemInstance.get(), null, null, null), null), Object.class, null, new HashMap<String, String>());
+        cdi.addApplicationException(AE1.class, true, true);
+        cdi.addApplicationException(AE3.class, true, false);
+        cdi.addApplicationException(AE6.class, false, true);
+
+        assertEquals(ExceptionType.APPLICATION_ROLLBACK, cdi.getExceptionType(new AE1()));
+        assertEquals(ExceptionType.APPLICATION_ROLLBACK, cdi.getExceptionType(new AE2()));
+        assertEquals(ExceptionType.APPLICATION_ROLLBACK, cdi.getExceptionType(new AE3()));
+        assertEquals(ExceptionType.SYSTEM, cdi.getExceptionType(new AE4()));
+        assertEquals(ExceptionType.SYSTEM, cdi.getExceptionType(new AE5()));
+        assertEquals(ExceptionType.APPLICATION, cdi.getExceptionType(new AE6()));
+        assertEquals(ExceptionType.APPLICATION, cdi.getExceptionType(new AE7()));
+    }
+}

Modified: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/EntityManagerPropogationTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/EntityManagerPropogationTest.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/EntityManagerPropogationTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/EntityManagerPropogationTest.java Sat Aug  7 00:07:34 2010
@@ -260,8 +260,8 @@ public class EntityManagerPropogationTes
         ejbJar.addEnterpriseBean(new StatefulBean("Transactionx6", EndNodeBean.class));
         
         ejbJar.setAssemblyDescriptor(new AssemblyDescriptor());
-        ejbJar.getAssemblyDescriptor().addApplicationException(IllegalArgumentException.class, false);
-        ejbJar.getAssemblyDescriptor().addApplicationException(ArgumentException.class, false);
+        ejbJar.getAssemblyDescriptor().addApplicationException(IllegalArgumentException.class, false, true);
+        ejbJar.getAssemblyDescriptor().addApplicationException(ArgumentException.class, false, true);
         
 //        List<ContainerTransaction> declared = ejbJar.getAssemblyDescriptor().getContainerTransaction();
 

Modified: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationException.java Sat Aug  7 00:07:34 2010
@@ -63,8 +63,8 @@ public class ApplicationException implem
 
     @XmlElement(name = "exception-class", required = true)
     protected String exceptionClass;
-    protected boolean rollback;
-    protected boolean inherited;
+    protected Boolean rollback;
+    protected Boolean inherited;
     @XmlAttribute
     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
     @XmlID
@@ -90,19 +90,27 @@ public class ApplicationException implem
         this.exceptionClass = value;
     }
 
-    public boolean getRollback() {
+    public Boolean getRollback() {
         return rollback;
     }
 
-    public void setRollback(boolean value) {
+    public boolean isRollback() {
+        return rollback == null? false: rollback;
+    }
+
+    public void setRollback(Boolean value) {
         this.rollback = value;
     }
 
-    public boolean isInherited() {
+    public Boolean getInherited() {
         return inherited;
     }
 
-    public void setInherited(boolean inherited) {
+    public boolean isInherited() {
+        return inherited == null? true: inherited;
+    }
+
+    public void setInherited(Boolean inherited) {
         this.inherited = inherited;
     }
 

Modified: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AssemblyDescriptor.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AssemblyDescriptor.java?rev=983147&r1=983146&r2=983147&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AssemblyDescriptor.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/AssemblyDescriptor.java Sat Aug  7 00:07:34 2010
@@ -206,7 +206,7 @@ public class AssemblyDescriptor {
         return getApplicationException(clazz.getName());
     }
 
-    public void addApplicationException(Class clazz, boolean rollback) {
+    public void addApplicationException(Class clazz, boolean rollback, boolean inherited) {
         getApplicationException().add(new ApplicationException(clazz, rollback));
     }