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

    <!-- Introduction to the script mediator using in-line scripts -->

    <definitions>

        <!-- define a reuseable endpoint definition and use it within config -->
        <endpoint name="stockquote" address="http://localhost:9000/axis2/services/SimpleStockQuoteService"/>

    </definitions>

    <rules>
        <in>
            <!-- transform the custom quote request into a standard quote requst expected by the service -->
            <script.js><![CDATA[
               var symbol = mc.getPayloadXML()..*::Code.toString();
               mc.setPayloadXML(
                  <m:getQuote xmlns:m="http://services.samples/xsd">
                     <m:request>
                        <m:symbol>{symbol}</m:symbol>
                     </m:request>
                  </m:getQuote>);
            ]]></script.js>

            <!-- send message to real endpoint referenced by name "stockquote" and stop -->
            <send>
                <endpoint ref="stockquote"/>
            </send>
        </in>

        <out>
            <!-- transform the standard response back into the custom format the client expects -->
            <script.js><![CDATA[
               var symbol = mc.getPayloadXML()..*::symbol.toString();
               var price = mc.getPayloadXML()..*::last.toString();
               mc.setPayloadXML(
                  <m:CheckPriceResponse xmlns:m="http://www.apache-synapse.org/test">
	               <m:Code>{symbol}</m:Code>
	               <m:Price>{price}</m:Price>
                  </m:CheckPriceResponse>);
            ]]></script.js>

            <!-- now send the custom response back to the client and stop -->
            <send/>
        </out>
    </rules>

</synapse> 