<!--
 ~ Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 ~
 ~ WSO2 Inc. 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.
 -->

        #####################  Define the macros ######################

#macro ( print_if_exist $field $default)
        #if($field && "$field" !="")
            $field
        #else
            $default
        #end
#end

#macro ( print_string_if_exist $field $default)
        #if($field && "$field" !="")
            "$field"
        #else
            "$default"
        #end
#end

#macro ( print_if_exist_only $tagname $field)
        #if($field && "$field" !="")
            <$tagname>$field</$tagname>
        #else
            ## print nothing.
        #end
#end

#macro ( print_list $tagname $list)
        #if($list && "$list" !="" && $list.size() > 0)
          <$tagname>
            #foreach($item in $list)
             $item #if( $foreach.hasNext ), #end
            #end
          </$tagname>
        #else
            ## print nothing.
        #end
#end

#macro ( timeout $config)
    #if( $config.get("actionSelect") == "neverTimeout" )
        ## print nothing.
    #elseif($config.get("actionDuration")|| $config.get("actionSelect"))
    <timeout>
        #print_if_exist_only("duration" $config.get("actionDuration"))
        #print_if_exist_only("responseAction" $config.get("actionSelect"))
    </timeout>
    #end
    <suspendOnFailure>
        #print_list( "errorCodes" $config.get("suspendErrorCode"))
        #print_if_exist_only("initialDuration" $config.get("suspendDuration"))
        #print_if_exist_only("maximumDuration" $config.get("suspendMaxDuration"))
        <progressionFactor>#print_if_exist( $config.get("factor") 1.0)</progressionFactor>
    </suspendOnFailure>
    <markForSuspension>
        #print_list("errorCodes" $config.get("retryErroCode"))
        <retriesBeforeSuspension>#print_if_exist( $config.get("retryTimeOut") 0)</retriesBeforeSuspension>
        <retryDelay>#print_if_exist( $config.get("retryDelay") 0)</retryDelay>
    </markForSuspension>
#end

        #macro ( http_endpoint $name $ep )
<endpoint name="$name">
<http uri-template="$util.escapeXml($ep.get("url"))">
#timeout( $ep.get('config') )
</http>
        #if($destinationBasedStatsEnabled)
<property name="ENDPOINT_ADDRESS" value="$util.escapeXml($ep.get("url"))"/>
        #end
        </endpoint>
        #end

        #macro ( draw_endpoint $type $endpoint_config )

        #set( $endpointClass = $endpoint_config.get("endpoint_type") )
        #set( $endpoints = $endpoint_config.get("${type}_endpoints"))
        #set( $ep_name = "${apiName}_API${type}Endpoint_${resourceNo}")

        ## IF endpoint secured
        #if($isEndpointSecured)
        #if($isSecureVaultEnabled)
<property xmlns="http://ws.apache.org/ns/synapse" name="password" expression="wso2:vault-lookup('$securevault_alias')"/>
<property xmlns="http://ws.apache.org/ns/synapse" name="unpw" expression="fn:concat('$username',':',get-property('password'))"/>
<property xmlns="http://ws.apache.org/ns/synapse" name="Authorization" expression="fn:concat('Basic ', base64Encode(get-property('unpw')))" scope="transport"/>
        #else
<property xmlns="http://ws.apache.org/ns/synapse" name="Authorization"  expression="fn:concat('Basic ', base64Encode('$username:$password'))" scope="transport" />
        #end
        #end
<send>
#if ($endpointClass == "http")
#http_endpoint($ep_name $endpoints)
#elseif ($endpointClass == "address")
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="$ep_name">
    #set( $advance_ep = $endpoints.get("config") )
    <address uri="$util.escapeXml($endpoints.get("url"))"
    #if($advance_ep.get("format") && $advance_ep.get("format") != "" && $advance_ep.get("format") != 'leave-as-is')
    format="$advance_ep.get("format")"
    #end
    #if($advance_ep.get("optimize") && $advance_ep.get("optimize") != "" && $advance_ep.get("optimize") != 'leave-as-is')
    optimize="$advance_ep.get("optimize")"
    #end
    >
    #timeout( $endpoints.get('config') )
</address>
#if($destinationBasedStatsEnabled)
<property name="ENDPOINT_ADDRESS" value="$util.escapeXml($endpoints.get("url"))"/>
#end
</endpoint>
        #elseif ($endpointClass == "wsdl")
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="$ep_name">
<wsdl uri="$util.escapeXml($endpoints.get("url"))" service="$!endpoint_config.get("wsdlendpointService")" port="$!endpoint_config.get("wsdlendpointPort")">
#timeout()
</wsdl>
        #if($destinationBasedStatsEnabled)
<property name="ENDPOINT_ADDRESS" value="$util.escapeXml($endpoints.get("url"))"/>
        #end
        </endpoint>
        #elseif ($endpointClass == "failover")
        #set( $failover_endpoints = $endpoint_config.get("${type}_failovers"))
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="$ep_name">
<failover>
    #http_endpoint("${ep_name}_0" $endpoints)
    #set( $i = 1)
    #foreach($endpoint in $failover_endpoints)
    #http_endpoint("${ep_name}_$i" $endpoint)
    #set( $i = $i + 1)
    #end
</failover>
</endpoint>
        #elseif ($endpointClass == "load_balance")
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="$ep_name">
#if($endpoint_config.get("sessionManagement") && $endpoint_config.get("sessionManagement") != "" && $endpoint_config.get("sessionManagement") != "none")
<session type="$endpoint_config.get("sessionManagement")">
#if($endpoint_config.get("sessionTimeOut") && $endpoint_config.get("sessionTimeOut") != "")
<sessionTimeout>$endpoint_config.get("sessionTimeOut")</sessionTimeout>
#end
</session>
        #end
<loadbalance algorithm="$!endpoint_config.get("algoClassName")"
        #if($endpoint_config.get("failOver") && $endpoint_config.get("failOver") != "" && $endpoint_config.get("failOver") == "False")
        failover="false"
        #end>
        #set( $i = 0)
        #foreach($endpoint in $endpoints)
        #http_endpoint("${ep_name}_$i" $endpoint)
        #set( $i = $i + 1)
        #end
        </loadbalance>
        </endpoint>
        #end
        </send>
        #if($destinationBasedStatsEnabled)
<bam>
<serverProfile name="$!profileName">
    <streamConfig name="$!streamName" version="$!streamVersion"/>
</serverProfile>
</bam>
        #end
        #end

        ######################## End of Macros ######################################


<api xmlns="http://ws.apache.org/ns/synapse"  name="$!apiName" context="$!apiContext" version="$!apiVersion" transports="$!transport" version-type="context">
#if($apiIsBlocked)
## if API is blocked send the API Block message
<resource faultSequence=#print_string_if_exist($faultSequence "fault")>
    <inSequence>
        <payloadFactory>
            <format>
                <am:fault xmlns:am="http://wso2.org/apimanager">
                    <am:code>700700</am:code>
                    <am:message>API blocked</am:message>
                    <am:description>This API has been blocked temporarily. Please try again later or contact the system administrators.</am:description>
                </am:fault>
            </format>
        </payloadFactory>
        <property name="HTTP_SC" value="503" scope="axis2"/>
        <property name="RESPONSE" value="true"/>
        <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
        <header name="To" action="remove"/>
        <send/>
    </inSequence>
</resource>
#else
## api not blocked
#set ($resourceNo = 0)
#foreach($resource in $resources)
<resource xmlns="http://ws.apache.org/ns/synapse"
#if($resource.getUriTemplate().contains("{") ||
($resource.getUriTemplate().contains("*") && !$resource.getUriTemplate().endsWith("/*")))
uri-template="$util.escapeXml($resource.getUriTemplate())"
#else
url-mapping="$resource.getUriTemplate()"
#end
methods="$resource.getMethodsAsString()" faultSequence=#print_string_if_exist($faultSequence "fault")>
<inSequence>
    #if(!$resource.getMediationScript().equalsIgnoreCase("null"))
    <script language="js">
        <![CDATA[
                        $resource.getMediationScript()
                ]]>
    </script>
    <filter source="boolean(get-property('CONTENT_TYPE'))" regex="false">
        <then>
            <property name="messageType" value="application/xml" scope="axis2"/>
        </then>
        <else>
            <property name="messageType" expression="get-property('CONTENT_TYPE')" scope="axis2"/>
        </else>
    </filter>
    #else
    <property name="HTTP_SC" value="501" scope="axis2"/>
    #end
    #if($resource.getMethodsAsString().contains("GET")||$resource.getMethodsAsString().contains("DELETE"))
    <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
    #end
    <respond/>
</inSequence>
<outSequence>
    <send/>
</outSequence>
</resource>
        #set ($resourceNo = $resourceNo + 1)
        #end  ## end of resource iterator
        ## print the handlers
        #if($handlers.size() > 0)
<handlers xmlns="http://ws.apache.org/ns/synapse">
#foreach($handler in $handlers)
<handler xmlns="http://ws.apache.org/ns/synapse" class="$handler.className">
    #if($handler.hasProperties())
    #set ($map = $handler.getProperties() )
    #foreach($property in $map.entrySet())
    <property name="$!property.key" value="$!property.value"/>
    #end
    #end
</handler>
#end
</handlers>
#end
#if($apiStatus == 'PROTOTYPED')
#end
#end
## end of apiIsBlocked check
</api>
