"A User's Look at the Cocoon Architecture" by Matthew Langham and Carsten Ziegeler [1] explains it very well: Matchers, and selectors are executed immediately when the sitemap is processed. But generators, transformers, and serializers are not executed immediately. They are chained to build the processing pipeline. Only when a pipeline is complete (when a serializer is added) is the whole pipeline executed.

The ExceptionHandlerAction does a redirect by using redirector.sendStatus(statusCode) which sends a content-less response to the browser, i.e. the generators, transformers and serializers are never executed because the pipeline is terminated.

You can use
        CocoonComponentManager.getCurrentEnvironment().setStatus(500);
to set the status code without terminating the pipeline.
Alex

[1] http://www.peachpit.com/articles/article.aspx?p=30037&seqNum=1

On 05.10.2007, at 16:19, Jean-Claude Vogel wrote:

Hello,

I have a problem with action usage in error handling in sitemap.

The problem is that when I have an error handle by 'exportExceptionHandler' I loose the XML stream generated by 'GENERATOR LINE' (see following pipeline). So in a browser I receive only a status code return but no xml error stream. When I suppress the 'THIS LINE' line of the sitemap I get my xml error stream in the browser.

So I would like to know why the fact to use an action here (exportExceptionHandler) changes the XML stream in handle-errors.

I add that even if there are other solutions to make the same thing, I would like to keep my ExceptionHandlerAction class (or similar) to be able to have specific actions in my code.

I would to use error-handling in my pipeline like that :
  <map:pipeline>
    ...
            <map:handle-errors>
                <map:select type="exception">
                    <map:when test="exportException">
<map:generate type="exception"/> GENERATOR LINE <map:act type="exportExceptionHandler" /> THIS LINE
                        <map:serialize type="xml" />
                    </map:when>
                </map:select>
            </map:handle-errors>
    ...
  </map:pipeline>



Following is my Action implementation named 'exportExceptionHandler' in my code :

public class ExceptionHandlerAction implements Action {
    /** General log stream */
private static final Log log = LogFactory.getLog (ExceptionHandlerAction.class);

    /** HTTP status code in success case */
    static final int SUCCESS_STATUS_CODE = 200;
    /** HTTP status code in bad request case */
    static final int BAD_REQUEST_STATUS_CODE = 444;//RAPHAEL'S HACK
    /** HTTP status code in internal server error case */
    static final int INTERNAL_SERVER_ERROR_STATUS_CODE = 500;


    public Map act(Redirector redirector,
                   SourceResolver resolver,
                   Map objectModel,
                   String source,
                   Parameters parameters) throws Exception {

        int statusCode = INTERNAL_SERVER_ERROR_STATUS_CODE;

Throwable throwable = ObjectModelHelper.getThrowable (objectModel);
        Throwable cause = throwable.getCause();

        if (cause instanceof BadParameterException) {
            statusCode = BAD_REQUEST_STATUS_CODE;
        } else if (cause instanceof MissingParameterException) {
            statusCode = BAD_REQUEST_STATUS_CODE;
        }

StringBuffer msg = new StringBuffer("************ Status Code : ");
        msg.append(statusCode).append("\ncaused by : ").append(cause);
        log.warn(msg);

        System.out.println("On est bien passé par là");


        redirector.sendStatus(statusCode);

        return objectModel;
    }
}

Thank for all reply.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to