<!--
  ~ 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.
  -->

<module name="serviceModule" class="org.apache.axis2.InavalidModuleImpl">
    <InFlow>
        <handler name="h1" class="org.apache.axis2.ModuleHandler1">
            <order phase="Dispatch"/>
        </handler>
        <handler name="h2" class="org.apache.axis2.ModuleHandler1">
            <order phase="TransportIn"/>
        </handler>
    </InFlow>

    <OutFlow>
        <handler name="h3" class="org.apache.axis2.ModuleHandler1">
            <order phase="Dispatch"/>
        </handler>
    </OutFlow>

    <OutFaultFlow>
        <handler name="h4" class="org.apache.axis2.ModuleHandler1">
            <order phase="OperationOutFaultPhase"/>
        </handler>
    </OutFaultFlow>

    <InFaultFlow>
        <handler name="h5" class="org.apache.axis2.ModuleHandler1">
            <order phase="OperationInFaultPhase"/>
        </handler>
    </InFaultFlow>
</module>