You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2005/08/13 23:21:08 UTC
svn commit: r232525 - in /cocoon/branches/BRANCH_2_1_X/src:
java/org/apache/cocoon/util/location/ webapp/stylesheets/system/
Author: sylvain
Date: Sat Aug 13 14:20:59 2005
New Revision: 232525
URL: http://svn.apache.org/viewcvs?rev=232525&view=rev
Log:
Ensure all locations are in the stacktrace (e.g. SAXParseException does have a location but does not print it)
Modified:
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedException.java
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedRuntimeException.java
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/Location.java
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocationImpl.java
cocoon/branches/BRANCH_2_1_X/src/webapp/stylesheets/system/exception2html.xslt
Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedException.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedException.java?rev=232525&r1=232524&r2=232525&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedException.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedException.java Sat Aug 13 14:20:59 2005
@@ -20,6 +20,7 @@
import java.util.List;
import org.apache.avalon.framework.CascadingException;
+import org.apache.cocoon.util.ExceptionUtils;
/**
* A cascading and located <code>Exception</code>. It is also {@link MultiLocatable} to easily build
@@ -33,21 +34,50 @@
private List locations;
public LocatedException(String message) {
- super(message, null);
+ this(message, null, null);
}
- public LocatedException(String message, Throwable thr) {
- super(message, thr);
+ public LocatedException(String message, Throwable cause) {
+ this(message, cause, null);
}
public LocatedException(String message, Location location) {
- super(message, null);
- addLocation(location);
+ this(message, null, location);
}
- public LocatedException(String message, Throwable thr, Location location) {
- super(message, thr);
+ public LocatedException(String message, Throwable cause, Location location) {
+ super(message, cause);
+ addCauseLocations(this, cause);
addLocation(location);
+ }
+
+ /**
+ * Add to the location stack all locations of an exception chain. This allows to have all possible
+ * location information in the stacktrace, as some exceptions like SAXParseException don't output
+ * their location in printStackTrace().
+ * <p>
+ * Traversal of the call chain stops at the first <code>Locatable</code> exception which is supposed
+ * to handle the loction of its causes by itself.
+ * <p>
+ * This method is static as a convenience for {@link LocatedRuntimeException other implementations}
+ * of locatable exceptions.
+ *
+ * @param self the current locatable exception
+ * @param cause the cause of <code>self</code>
+ */
+ public static void addCauseLocations(MultiLocatable self, Throwable cause) {
+ if (cause == null || cause instanceof Locatable) {
+ // Locatable handles its location itself
+ return;
+ }
+ // Add parent location first
+ addCauseLocations(self, ExceptionUtils.getCause(cause));
+ // then ourselve's
+ Location loc = ExceptionUtils.getLocation(cause);
+ if (loc != null) {
+ loc = new LocationImpl("[cause location]", loc.getURI(), loc.getLineNumber(), loc.getColumnNumber());
+ self.addLocation(loc);
+ }
}
public Location getLocation() {
Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedRuntimeException.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedRuntimeException.java?rev=232525&r1=232524&r2=232525&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedRuntimeException.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocatedRuntimeException.java Sat Aug 13 14:20:59 2005
@@ -33,20 +33,21 @@
private List locations;
public LocatedRuntimeException(String message) {
- super(message, null);
+ this(message, null, null);
}
- public LocatedRuntimeException(String message, Throwable thr) {
- super(message, thr);
+ public LocatedRuntimeException(String message, Throwable cause) {
+ this(message, cause, null);
}
public LocatedRuntimeException(String message, Location location) {
- super(message, null);
+ this(message, null, location);
addLocation(location);
}
- public LocatedRuntimeException(String message, Throwable thr, Location location) {
- super(message, thr);
+ public LocatedRuntimeException(String message, Throwable cause, Location location) {
+ super(message, cause);
+ LocatedException.addCauseLocations(this, cause);
addLocation(location);
}
Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/Location.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/Location.java?rev=232525&r1=232524&r2=232525&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/Location.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/Location.java Sat Aug 13 14:20:59 2005
@@ -30,7 +30,7 @@
/**
* Constant for unknown locations.
*/
- public static final Location UNKNOWN = new LocationImpl(null, null);
+ public static final Location UNKNOWN = LocationImpl.UNKNOWN;
/**
* Get the description of this location
Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocationImpl.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocationImpl.java?rev=232525&r1=232524&r2=232525&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocationImpl.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/util/location/LocationImpl.java Sat Aug 13 14:20:59 2005
@@ -30,6 +30,9 @@
private final int line;
private final int column;
private final String description;
+
+ // Package private: outside this package, use Location.UNKNOWN.
+ static final LocationImpl UNKNOWN = new LocationImpl(null, null);
/**
* The string representation of an unknown location: "<code>[unknown location]</code>".
@@ -92,7 +95,7 @@
if (location instanceof LocationImpl) {
return (LocationImpl)location;
} else if (location == null) {
- return (LocationImpl)Location.UNKNOWN;
+ return UNKNOWN;
} else {
return new LocationImpl(location);
}
@@ -103,11 +106,11 @@
* "<code>path/to/file.xml:3:40</code>") to a Location object.
*
* @param text the text to parse
- * @return the location
+ * @return the location (possibly UNKNOWN if text was null or in an incorrect format)
*/
- public static LocationImpl valueOf(String text) {
+ public static LocationImpl valueOf(String text) throws IllegalArgumentException {
if (text == null || text.length() == 0) {
- return (LocationImpl)Location.UNKNOWN;
+ return UNKNOWN;
}
// Do we have a description?
@@ -138,10 +141,10 @@
}
}
} catch(Exception e) {
- // Ignore: we throw another one below
+ // Ignore: handled below
}
- throw new IllegalArgumentException("Invalid location string: " + text);
+ return UNKNOWN;
}
/**
Modified: cocoon/branches/BRANCH_2_1_X/src/webapp/stylesheets/system/exception2html.xslt
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/webapp/stylesheets/system/exception2html.xslt?rev=232525&r1=232524&r2=232525&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/webapp/stylesheets/system/exception2html.xslt (original)
+++ cocoon/branches/BRANCH_2_1_X/src/webapp/stylesheets/system/exception2html.xslt Sat Aug 13 14:20:59 2005
@@ -82,8 +82,9 @@
</xsl:for-each>
</strong>
<table>
- <xsl:for-each select="ex:locations/*">
- <!--xsl:sort select="position()" order="descending"/-->
+ <xsl:for-each select="ex:locations/*[string(.) != '[cause location]']">
+ <!-- [cause location] indicates location of a cause, which
+ the exception generator outputs separately -->
<tr class="row-{position() mod 2}">
<td><xsl:call-template name="print-location"/></td>
<td><em><xsl:value-of select="."/></em></td>