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

<synapse xmlns="http://ws.apache.org/ns/synapse">

    <!-- using custom sequences for incoming and outgoing message mediation with proxy services -->
    <definitions>
        <set-property name="proxy_wsdl" src="file:repository/conf/sample/resources/proxy/sample_proxy_1.wsdl"/>

        <sequence name="proxy_in">
            <send>
                <endpoint address="http://localhost:9000/axis2/services/SimpleStockQuoteService"/>
            </send>
        </sequence>

        <sequence name="proxy_out">
            <log level="custom">
                <property name="message" value="Executing inside the out sequence"/>
            </log>
            <send/>
        </sequence>

    </definitions>

    <proxies>
        <proxy name="StockQuoteProxy">
            <wsdl key="proxy_wsdl"/>
            <target inSequence="proxy_in" outSequence="proxy_out"/>
        </proxy>
    </proxies>

    <rules>
        <send/>
    </rules>

</synapse>