<?xml version="1.0" encoding="ISO-8859-1" ?>
<!--
  ~  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.
  -->

<document>
    <properties>
        <title>Apache Synapse - Sample 351</title>
    </properties>
    <body>
        <section name="Sample 351: Inline Scripts with the Script Mediator">
            <div class="xmlConf">&lt;definitions xmlns="http://ws.apache.org/ns/synapse"&gt;

    &lt;sequence name="main"&gt;
        &lt;in&gt;
            &lt;!-- transform the custom quote request into a standard quote requst expected by the service --&gt;
            &lt;script language="js"&gt;
                var symbol = mc.getPayloadXML()..*::Code.toString();
                mc.setPayloadXML(
                &lt;m:getQuote xmlns:m="http://services.samples"&gt;
                    &lt;m:request&gt;
                        &lt;m:symbol&gt;{symbol}&lt;/m:symbol&gt;
                    &lt;/m:request&gt;
                &lt;/m:getQuote&gt;);
            &lt;/script&gt;
            &lt;send&gt;
                &lt;endpoint&gt;
                    &lt;address uri="http://localhost:9000/services/SimpleStockQuoteService"/&gt;
                &lt;/endpoint&gt;
            &lt;/send&gt;
        &lt;/in&gt;
        &lt;out&gt;
            &lt;!-- transform the standard response back into the custom format the client expects --&gt;
            &lt;script language="js"&gt;
                var symbol = mc.getPayloadXML()..*::symbol.toString();
                var price = mc.getPayloadXML()..*::last.toString();
                mc.setPayloadXML(
                &lt;m:CheckPriceResponse xmlns:m="http://services.samples/xsd"&gt;
                    &lt;m:Code&gt;{symbol}&lt;/m:Code&gt;
                    &lt;m:Price&gt;{price}&lt;/m:Price&gt;
                &lt;/m:CheckPriceResponse&gt;);
            &lt;/script&gt;
            &lt;send/&gt;
        &lt;/out&gt;
    &lt;/sequence&gt;

&lt;/definitions&gt;</div>
            <subsection name="Objective">
                <p>
                    <a href="sample350.html">Sample 350</a> shows how to use scripts stored as
                    external resources for mediation. This sample demonstrates how small scriplets
                    can be specified inline with the Synapse configuration thus avoiding the requirement
                    to have an external registry.
                </p>
            </subsection>
            <subsection name="Pre-requisites">
                <p>
                    <ul>
                        <li>
                            Deploy the SimpleStockQuoteService in the sample Axis2 server and start Axis2
                        </li>
                        <li>
                            Start Synapse using the configuration numbered 351 (repository/conf/sample/synapse_sample_351.xml)
                            <div class="command">
                                Unix/Linux: sh synapse.sh -sample 351<br/>
                                Windows: synapse.bat -sample 351
                            </div>
                        </li>
                    </ul>
                </p>
            </subsection>
            <subsection name="Executing the Client">
                <p>
                    The functionality and the behavior of this sample is identical to
                    <a href="sample350.html">sample 350</a>. Only difference is that, the 2 JS functions
                    are embedded in the Synapse configuration. To try this out run the following
                    command on the sample client.
                </p>
                <div class="command">ant stockquote -Daddurl=http://localhost:9000/services/SimpleStockQuoteService -Dtrpurl=http://localhost:8280/ -Dmode=customquote</div>
            </subsection>
        </section>
        <p><a href="../samples.html">Back to Catalog</a></p>        
    </body>
</document>