<?xml version="1.0" ?>
<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You 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: chain-config.xml 481833 2006-12-03 17:32:52Z niallp $
-->


<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>


    <!-- ========== View 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.

           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"/>        


      <!-- 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"/>

      <!--
      If you want to use Tiles, uncomment this command, and the one in the
      'servlet-exception' chain below, and make sure you have the
      struts-tiles JAR included in your web application.

      <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"/>

      <!--
      If you want to use Tiles, uncomment this command, and the one in the
      'servlet-standard' chain below. This one is needed to allow Tiles to
      be used from global exception handlers.

      <command
          className="org.apache.struts.chain.servlet.TilesPreProcessor"/>
      -->

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

    </chain>


</catalog>
