I seem to recall you need to do:
<map:selector name="exception"
src="org.apache.cocoon.selection.ExceptionSelector">
<exception name="process"
class="org.apache.cocoon.ProcessingException" unroll="true"/>
<exception name="e501" class="com.dotech.util.StatusCode501Exception"/>
<exception name="runtime" class="java.lang.RuntimeException"
unroll="true"/>
</map:selector>
I'm actually surprised because if StatusCode501Exception is a
RuntimeException I would expect you to be getting a
ConfigurationException as the runtime exception hides the e501 exception.
Ralph
Daniel Curran wrote:
I have put another 4 hours into looking at this.
I believe that I should be using unroll="true" on the exceptions in
order to dig down to the appropriate exception.
When I generate="notifying" my exception looks as such -
org.apache.cocoon.ProcessingException: Exception in
StreamGenerator.generate(): java.lang.RuntimeException:
java.lang.RuntimeException: com.dotech.util.StatusCode501Exception: 501
In this case I want access to com.dotech.util.StatusCode501Exception.
My selectors section in components has the following.
<map:selector name="exception"
src="org.apache.cocoon.selection.ExceptionSelector">
<exception name="process"
class="org.apache.cocoon.ProcessingException" unroll="true"/>
<exception name="runtime" class="java.lang.RuntimeException"
unroll="true"/>
<exception name="e501"
class="com.dotech.util.StatusCode501Exception"/>
</map:selector>
I have my handle-errors section setup to select on these exceptions,
and a transform outputs an indication of which <map:when> path was taken.
The expected behavior is that <map:when test="e501"> is going to be
the chosen path, but the selected path is <map:when test="runtime"/>
I have inspected ExceptionSelector.java and the recursive function
find(Throwable thr) looks like it should be digging down through
RuntimeException to expose StatusCode501Exception.
My idea now is that in order to unroll an exception the exception must
at some point extend
org.apache.commons.lang.exception.NestableException, and that
java.lang.RuntimeException obviously does not extend this exception.
I might be off base with this estimate as I haven't had the time to
dig deeper into the source code. If anyone knows anything about this
bit of code I would be interested in more information on it. If this
is the case is there anyway that I could get around the
RuntimeException problem?
Thanks,
Dan
Daniel Curran wrote:
It turns out that my transform was setup incorrectly.
Instead of throwing an exception for a status code of 200, I was
getting the default status code of 200 back as I was returning well
formatted XML.
I am now running up against a problem of correctly catching my thrown
exception. When an exception is thrown at runtime via XSLT it is
caught as an org.apache.cocoon.ProcessingException.
What this does is cause all of the different exceptions I am throwing
to be treated as a ProcessingException by the sitemap.
<map:selector name="exception"
src="org.apache.cocoon.selection.XPathExceptionSelector">
<exception name="200"
class="com.dotech.util.StatusCode200Exception"/>
<exception name="201"
class="com.dotech.util.StatusCode201Exception"/>
<exception name="202"
class="com.dotech.util.StatusCode202Exception"/>
<exception name="404"
class="com.dotech.util.StatusCode404Exception"/>
<exception name="405"
class="com.dotech.util.StatusCode405Exception"/>
<exception name="406"
class="com.dotech.util.StatusCode406Exception"/>
<exception name="500"
class="com.dotech.util.StatusCode500Exception"/>
<exception name="501"
class="com.dotech.util.StatusCode501Exception"/>
</map:selector>
None of the above selections end up matching.
I have been attemping to use the the java code for the exception I am
throwing is -
public class ThrowException{
public static void statusCode200() throws StatusCode200Exception {
throw new StatusCode200Exception("200");
}
... other methods for the different status codes in the same
pattern ...
}
class StatusCode200Exception extends Exception {
public StatusCode200Exception(String error){
super(error);
}
... other status types in same pattern ...
}
My question now becomes how would I go about trapping the portion of
the processing exception with a xpath expression.
I have tried something like -
<map:selector name="exception"
src="org.apache.cocoon.selection.XPathExceptionSelector">
<exception name="process"
class="org.apache.cocoon.ProcessingException">
<xpath name="200" test="getMessage=200"/>
</exception>
</map:selector>
But I the test is not matching correctly. I must be doing something
wrong with my xpath test. Any ideas?
Thanks,
Dan
Daniel Curran wrote:
Since I need to make a choice between a number of different
exceptions to throw I used a xalan java extension, and then an
exception selector in the handle-errors section.
This did the trick. In the transform I have defined
<exception:statusCode200/> which will cause Java to throw a
StatusCode200Exception which I can pick up in the handle-errors
section and return <map:serialize type="xml" status-code="200"/>
Using the java extension allows me to easily define which error code
that I wish to throw and to pick based on an xsl:if or xsl:choose.
Thanks for the advice, it worked out great,
Dan
Joerg Heinicke wrote:
On 10.04.2006 08:34, Bertrand Delacretaz wrote:
I don't think there is a standard way of throwing Exceptions from
XSLT code, but calling a small Java extension class from XSLT to
throw the Exception should do the trick, if you need to do this
from XSLT.
I could not read from his message that he needs exceptions from
XSLT, but there is an easy solution for it: <xsl:message
terminate="yes"/>.
Regards,
Jörg
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]