<!--
  ~  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="synapse-handler" class="org.apache.synapse.handler.SynapseModule">

    <Description>
        This is a handler imnplementation of the Synapse mediation framework. This will engage to
        an existing service as a module with a SynapseHandler which will do the Synapse mediation
        in the handler chain but not dispatches the message to SynapseMessageReceiver
    </Description>

    <InFlow>
        <handler name="SynapseIn" class="org.apache.synapse.handler.SynapseInHandler">
            <order phase="OperationInPhase"/>
        </handler>
    </InFlow>

    <OutFlow>
        <handler name="SynapseOut" class="org.apache.synapse.handler.SynapseOutHandler">
            <order phase="OperationOutPhase"/>
        </handler>
    </OutFlow>
    
</module>
