You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2010/09/01 20:57:32 UTC
svn commit: r991651 - in /tapestry/tapestry5/trunk/tapestry-ioc/src:
main/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImpl.java
test/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImplTest.java
Author: hlship
Date: Wed Sep 1 18:57:32 2010
New Revision: 991651
URL: http://svn.apache.org/viewvc?rev=991651&view=rev
Log:
Handle the unlikely case where an exception includes a property that is the same exception (i.e., detect the infinite loop)
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImplTest.java
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImpl.java?rev=991651&r1=991650&r2=991651&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImpl.java Wed Sep 1 18:57:32 2010
@@ -128,7 +128,13 @@ public class ExceptionAnalyzerImpl imple
if (cause == null && Throwable.class.isAssignableFrom(pa.getType()))
{
// Ignore the property, but track it as the cause.
- cause = (Throwable) pa.get(t);
+
+ Throwable nestedException = (Throwable) pa.get(t);
+
+ // Handle the case where an exception is its own cause (avoid endless loop!)
+ if (t != nestedException)
+ cause = nestedException;
+
continue;
}
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImplTest.java?rev=991651&r1=991650&r2=991651&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ExceptionAnalyzerImplTest.java Wed Sep 1 18:57:32 2010
@@ -179,4 +179,37 @@ public class ExceptionAnalyzerImplTest e
assertEquals(ei.getProperty("code"), "0099");
}
+ @SuppressWarnings("all")
+ public static class SelfCausedException extends RuntimeException
+ {
+ public SelfCausedException(String message)
+ {
+ super(message);
+ }
+
+ public Throwable getCause()
+ {
+ return this;
+ }
+ }
+
+ @Test
+ public void exception_that_is_its_own_cause()
+ {
+ String message = "Hey! We've Got Not Tomatoes!";
+
+ Throwable t = new SelfCausedException(message);
+
+ ExceptionAnalysis ea = analyzer.analyze(t);
+
+ assertEquals(ea.getExceptionInfos().size(), 1);
+
+ ExceptionInfo ei = ea.getExceptionInfos().get(0);
+
+ assertEquals(ei.getClassName(), SelfCausedException.class.getName());
+ assertEquals(ei.getMessage(), message);
+
+ assertTrue(ei.getPropertyNames().isEmpty());
+ assertFalse(ei.getStackTrace().isEmpty());
+ }
}