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));
}