<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.2" xmlns:http="http://www.mulesource.org/schema/mule/http/2.2"
    xmlns:scripting="http://www.mulesource.org/schema/mule/scripting/2.2"
    xsi:schemaLocation="
       http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
       http://www.mulesource.org/schema/mule/vm/2.2 http://www.mulesource.org/schema/mule/vm/2.2/mule-vm.xsd
       http://www.mulesource.org/schema/mule/http/2.2 http://www.mulesource.org/schema/mule/http/2.2/mule-http.xsd
       http://www.mulesource.org/schema/mule/scripting/2.2 http://www.mulesource.org/schema/mule/scripting/2.2/mule-scripting.xsd">

    <!-- these properties are normally resolved by Spring's properties placeholder resolver -->
    <global-property name="acme.order.username" value="usr" />
    <global-property name="acme.order.password" value="pwd" />
    <global-property name="acme.order.hostname" value="localhost" />
    <global-property name="acme.order.port" value="9090" />

    <vm:endpoint name="OrderCreationQueue" path="order.creation.queue" synchronous="false" />
    <vm:endpoint name="OrderCreationResultQueue" path="order.creation.result.queue" synchronous="false" />

    <scripting:transformer name="OrderMapToMicroformat">
        <scripting:script engine="groovy"><![CDATA[
            def writer = new StringWriter()
            def xml = new groovy.xml.MarkupBuilder(writer)
            
            xml.order(xmlns: 'urn:acme:order:3:1') {
              customerId(payload.clientId)
              productId(payload.productCode)
              quantity(payload.quantity)
            }
            
            result = writer.toString()
            ]]>
        </scripting:script>
    </scripting:transformer>

    <message-properties-transformer name="ResourceCreatedTag">
        <add-message-property key="ResourceCreated" value="#[groovy:message.getProperty('http.status')=='201']" />
    </message-properties-transformer>

    <expression-transformer name="LocationToResourceId">
        <return-argument evaluator="groovy"
            expression="'' + org.apache.commons.lang.StringUtils.substringAfterLast(message.getProperty('Location'),'/')" />
    </expression-transformer>

    <model>

        <service name="OrderCreationService">
            <inbound>
                <inbound-endpoint ref="OrderCreationQueue" />
            </inbound>

            <outbound>
                <chaining-router>
                    <http:outbound-endpoint synchronous="true" host="${acme.order.hostname}" port="${acme.order.port}"
                        user="${acme.order.username}" password="${acme.order.password}" path="orders" responseTimeout="15"
                        method="POST" contentType="application/xml" encoding="UTF-8">

                        <transformers>
                            <transformer ref="OrderMapToMicroformat" />
                        </transformers>

                        <response-transformers>
                            <transformer ref="ResourceCreatedTag" />
                            <transformer ref="LocationToResourceId" />
                        </response-transformers>
                    </http:outbound-endpoint>

                    <outbound-endpoint ref="OrderCreationResultQueue" />
                </chaining-router>
            </outbound>
        </service>


        <service name="OrderCreationResultProcessorStub">
            <inbound>
                <inbound-endpoint ref="OrderCreationResultQueue" />
            </inbound>
            <log-component />
        </service>
    </model>

</mule>
