Sylvain Wallez wrote:
> Michael Melhem wrote:
>
>> Dear Cocoon community,
>>
>> It seems to me that pipelines can only handle two error cases: Namely
>> error 500 (General Exception) and error 404 (ResourceNotFoundException).
>>
>> There appears to be no way currently to handle specific errors that
>> might be thrown by pipeline components other than to render a general
>> Error 500 page. Am I mistaken?
>>
>> For example, it may be the case that a custom built generator could
>> throw custom Exceptions that a developer would like to handle in a
>> specific fashion.
>>
>> To that end, I propose that pipeline be extendend so that it they can
>> handle X number of errors depending on the amount of
>> <map:handle-errors> defined in the sitemap for that pipeline.
>>
>> <sitemap>
>> ...
>>
>> <map:handle-errors type="500">
>> <map:transform src="stylesheets/error2html.xsl"/>
>> <map:serialize/>
>> </map:handle-errors>
>>
>> <map:handle-errors type="404">
>> <map:transform src="stylesheets/error2html.xsl"/>
>> <map:serialize />
>> </map:handle-errors>
>>
>> <!-- one more or extra error-handles -->
>> <map:handle-errors type="someSpecificException">
>> <-- "type" here could me some sort of short code or the actual
>> full name of the Exception class? -->
>> <map:transform src="stylesheets/SpecificError2html.xsl"/>
>> <map:serialize status-code="500"/>
>> </map:handle-errors>
>>
>> etc..
>> </sitemap>
>>
>> Does anyone see any problems with this approach? Comments?
>>
>>
>
> I like this, and proposed something similar back in december (see
> http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=100739814405987&w=2)
>
> It didn't had much acceptance at that time both because it involved
> class names in the pipelines and because Nicola Ken was refactoring
> error notification ;)
And because it isn't strictly needed ;-)
> But I still would like to have something like this, as I think having to
> write a <handle-errors type="500"> and then using a <map:select> to
> select depending on the error type is counter-intuitive.
no, you would have a <handle-errors>, we decided that type="" would be
deprecated, since it's redundant.
> When an exception occurs, the sitemap engine builds a Notifying object
> that is available within the <handle-errors>. This Notifying has a
> getType() method which is exactly what we need for this "type" attribute.
There are many other attributes, not only getType.
I wrongly assumed that it would be a "level" of error.
We should start giving it a real meaning.
> But getType() always returns "error" unless your exception implements
> Notifying (which none does, and IMO having an exception implement
> Notifying to drive sitemap error-handling is mixing concerns).
Not really true...
> So we
> could configure the NotifyingBuilder so that it can associate exception
> classes to notifying types.
>
> <notifying-builder>
> <type name="404" src="org.apache.cocoon.ResourceNotFoundException"/>
> <type name="500" src="org.apache.cocoon.ProcessingException"/>
> <type name="access-denied" src="java.lang.SecurityException"/>
> <type name="my-error-case" src="my.app.someSpecificException"/>
> </notifying-builder>
This I like better...
It basically means that you make the mapping of the exception name to an
easy handle...
> Notice the two first lines that ensure compatibility with what we have
> today.
>
> And then in the pipelines :
> <map:handle-errors type="access-denied">
> <map:transform src="accessDenied.xsl"/>
> <map:serialize/>
> </map:handle-errors>
>
> <map:handle-errors type="my-error-case">
> <map:transform src="SpecificError2html.xsl"/>
> <map:serialize status-code="500"/>
> </map:handle-errors>
>
> Thoughts ?
I would rewrite your case like this:
<notifying-builder>
<type name="404" src="org.apache.cocoon.ResourceNotFoundException"/>
<type name="500" src="org.apache.cocoon.ProcessingException"/>
<type name="access-denied" src="java.lang.SecurityException"/>
<type name="my-error-case" src="my.app.someSpecificException"/>
</notifying-builder>
<map:handle-errors>
<map:match type="error" pattern="access-denied">
<map:transform src="accessDenied.xsl"/>
<map:serialize/>
<map:match>
<map:match type="error" pattern="my-error-case">
<map:transform src="SpecificError2html.xsl"/>
<map:serialize status-code="500"/>
<map:match>
<map:match pattern="*">
<map:serialize status-code="500"/>
<map:match>
</map:handle-errors>
But we could simply do:
<map:handle-errors>
<map:match type="error" pattern="access-denied">
<map:transform src="accessDenied.xsl"/>
<map:serialize/>
<map:match>
<map:match type="exception" pattern="my.app.someSpecificException">
<map:transform src="SpecificError2html.xsl"/>
<map:serialize status-code="500"/>
<map:match>
<map:match pattern="*">
<map:serialize status-code="500"/>
<map:match>
</map:handle-errors>
Of course, we will need to put a
<notifying-builder>
<type name="404" src="org.apache.cocoon.ResourceNotFoundException"/>
<type name="500" src="org.apache.cocoon.ProcessingException"/>
<type name="access-denied" src="java.lang.SecurityException"/>
<type name="my-error-case" src="my.app.someSpecificException"/>
</notifying-builder>
thing in cocoon.xconf to handle the major types of errors, so that the
match type="exception" is not used a lot, or even at all.
Other thoughts?
Keep calm Stefano, I know you get nervous when Sylvain and I discuss at
this speed, but believe me, we are communicating, it's not noise ;-P
--
Nicola Ken Barozzi [EMAIL PROTECTED]
- verba volant, scripta manent -
(discussions get forgotten, just code remains)
---------------------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]