<?xml version="1.0" ?>


<!--

 Copyright 2002,2004 The Apache Software Foundation.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
      http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.

-->


<!--
    This file contains definitions of the standard Chain Of Responsibility
    chains that emulate Struts 1.2 processing functionality.  These chains
    are defined in a catalog named "struts" so that the application can
    use the default catalog for its own purposes, without any potential for
    name clashes.

    $Id$
-->


<catalog name="struts">

    <define name="lookup"
            className="org.apache.commons.chain.generic.LookupCommand"/>
    <!-- ========== Servlet Complete Request Chain ========================= -->

    <chain name="servlet-standard">

        <!-- Establish exception handling filter -->
        <command
                className="org.apache.struts.chain.commands.ExceptionCatcher"
                catalogName="struts"
                exceptionCommand="servlet-exception"/>

        <lookup
                catalogName="struts"
                name="process-action"
                optional="false"/>

        <lookup
                catalogName="struts"
                name="process-view"
                optional="false"/>

    </chain>


    <!-- ========== Action Processing chain ======================== -->
    <chain name="process-action">

        <!--
             This chain attempts to emulate (most of) the standard request
             processing in the standard org.apache.struts.action.RequestProcessor
             class, by performing the corresponding tasks in individual Commands
             that are composable.  The following list defines a cross reference
             between the processXxx methods and the Commands that perform the
             corresponding functionality:

             processMultipart        Integrated into servlet and legacy classes

             processPath             SelectAction (which also does processMapping)

             processException        ExceptionCatcher / ExceptionHandler

             processLocale           SelectLocale

             processContent          SetContentType

             processNoCache          RequestNoCache

             processPreprocess       LookupCommand with optional="true".  Multiple
                                     occurrences of this can easily be added, to
                                     support additional processing hooks at any
                                     point in the chain without modifying the
                                     standard definition.

             processCachedMessages   RemoveCachedMessages

             processMapping          SelectAction (which also does processPath)

             processRoles            AuthorizeAction

             processActionForm       CreateActionForm

             processPopulate         PopulateActionForm

             processValidate         ValidateActionForm / SelectInput

             processForward          SelectForward

             processInclude          SelectInclude / PerformInclude

             processActionCreate     CreateAction

             processActionPerform    ExecuteAction
        -->


        <!-- Look up optional preprocess command -->
        <lookup
                catalogName="struts"
                name="servlet-standard-preprocess"
                optional="true"/>


        <!-- Identify the Locale for this request -->
        <command
                className="org.apache.struts.chain.commands.servlet.SelectLocale"/>


        <!-- Set (if needed) the URI of the original request -->
        <command
                className="org.apache.struts.chain.commands.servlet.SetOriginalURI"/>


        <!-- Set (if needed) no cache HTTP response headers -->
        <command
                className="org.apache.struts.chain.commands.servlet.RequestNoCache"/>


        <!-- Set (if needed) the HTTP response content type -->
        <command
                className="org.apache.struts.chain.commands.servlet.SetContentType"/>


        <!-- Remove messages cached in the Session -->
        <command
                className="org.apache.struts.chain.commands.RemoveCachedMessages"/>


        <!-- Identify the ActionConfig for this request -->
        <command
                className="org.apache.struts.chain.commands.servlet.SelectAction"/>


        <!-- Authorize the selected ActionConfig for this request -->
        <command
                className="org.apache.struts.chain.commands.servlet.AuthorizeAction"/>


        <!-- Create (if needed) the ActionForm for this request -->
        <command
                className="org.apache.struts.chain.commands.CreateActionForm"/>


        <!-- Populate the ActionForm for this request -->
        <command
                className="org.apache.struts.chain.commands.servlet.PopulateActionForm"/>


        <!-- Validate the ActionForm for this request -->
        <command
                className="org.apache.struts.chain.commands.servlet.ValidateActionForm"/>


        <!-- Select the appropriate ForwardConfig for return to input page -->
        <command
                className="org.apache.struts.chain.commands.servlet.SelectInput"/>


        <!-- Lookup and execute a chain command if the current ActionConfig is 
             so-configured. -->
        <command
                className="org.apache.struts.chain.commands.ExecuteCommand"/>


        <!-- Select the appropriate ForwardConfig for action mappings that only
             have an ActionForward -->
        <command
                className="org.apache.struts.chain.commands.servlet.SelectForward"/>


        <!-- Select the include uri (if any) for the current action mapping -->
        <command
                className="org.apache.struts.chain.commands.SelectInclude"/>


        <!-- Perform the include (if needed) -->
        <command
                className="org.apache.struts.chain.commands.servlet.PerformInclude"/>


        <!-- Create (if needed) the Action for this request -->
        <command
                className="org.apache.struts.chain.commands.servlet.CreateAction"/>


        <!-- Execute the Action for this request -->
        <command
                className="org.apache.struts.chain.commands.servlet.ExecuteAction"/>
    </chain>

    <!-- ========== View Processing chain ======================== -->
    <chain name="process-view">


        <!-- Lookup and execute a chain command if the current ForwardConfig is
             so-configured. -->
        <command
                className="org.apache.struts.chain.commands.ExecuteForwardCommand"/>

        <command
                className="org.apache.struts.tiles.commands.TilesPreProcessor"/>

        <!-- Follow the returned ForwardConfig (if any) -->
        <command
                className="org.apache.struts.chain.commands.servlet.PerformForward"/>


    </chain>

    <!-- ========== Servlet Exception Handler Chain ======================== -->

    <chain name="servlet-exception">

        <!--
              This chain is designed to be invoked (by o.a.s.c.ExceptionCatcher)
              if an unhandled exception is thrown by any subsequent command
              in a processing chain (including the one that invokes a Struts
              action).  The standard definition of this chain supports the
              exception mapping of Struts 1.1, but can be replaced in order
              to handle exceptions differently.
        -->

        <!-- Execute the configured exception handler (if any) -->
        <command
                className="org.apache.struts.chain.commands.servlet.ExceptionHandler"/>

        <!-- Lookup and execute a chain command if the current ForwardConfig is
             so-configured. -->
        <command
                className="org.apache.struts.chain.commands.ExecuteForwardCommand"/>

        <command
                className="org.apache.struts.tiles.commands.TilesPreProcessor"/>

        <!-- Follow the returned ForwardConfig (if any) -->
        <command
                className="org.apache.struts.chain.commands.servlet.PerformForward"/>

    </chain>


</catalog>
