<?xml version="1.0" encoding="UTF-8"?>
<!-- 
This sample program is provided AS IS and may be used, executed, copied and
modified without royalty payment by customer (a) for its own instruction and
study, (b) in order to develop applications designed to run with an IBM
WebSphere product, either for customer's own internal use or for redistribution
by customer, as part of such an application, in customer's own products. 

5724-J34 (C) COPYRIGHT International Business Machines Corp. 2011
All Rights Reserved * Licensed Materials - Property of IBM
-->
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dp="http://www.datapower.com/extensions"
    xmlns:str="http://exslt.org/strings"
    extension-element-prefixes="dp"
    exclude-result-prefixes="dp str">
    
    <xsl:variable name="cache-config" select="document('local:///cache-config.xml')" />
    <xsl:variable name="cache-url" select="$cache-config/cache/@url" />
    <xsl:variable name="cache-timeout" select="$cache-config/cache/@timeout" />
    <xsl:variable name="cache-resource" select="$cache-config/cache/@resource" />
    <xsl:variable name="cache-grid" select="$cache-config/cache/@grid" />
    <xsl:variable name="cache-username" select="$cache-config/cache/@username" />
    <xsl:variable name="cache-password" select="$cache-config/cache/@password" />
    
    <xsl:template name="cacheGet">
        <xsl:param name="type" />
        <xsl:param name="key" />
        
        <xsl:call-template name="cacheCall">
            <xsl:with-param name="type" select="$type" />
            <xsl:with-param name="key" select="$key" />
            <xsl:with-param name="method" select="'GET'" />
        </xsl:call-template>
    </xsl:template>
    
    <xsl:template name="cacheSet">
        <xsl:param name="type" />
        <xsl:param name="key" />
        <xsl:param name="ttl" />
        <xsl:param name="data" />
        
        <xsl:call-template name="cacheCall">
            <xsl:with-param name="type" select="$type" />
            <xsl:with-param name="key" select="$key" />
            <xsl:with-param name="method" select="'POST'" />
            <xsl:with-param name="ttl" select="$ttl" />
            <xsl:with-param name="data" select="$data" />
        </xsl:call-template>
    </xsl:template>
    
    <xsl:template name="cacheCall">
        <xsl:param name="type" />
        <xsl:param name="key" />
        <xsl:param name="method" />
        <xsl:param name="ttl" />
        <xsl:param name="data" />
                
        <xsl:variable name="parameters">
            <xsl:choose>
                <xsl:when test="number($ttl) > 0">
                    <xsl:value-of select="concat('ttl=',$ttl,'&amp;xml=true')" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'xml=true'" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="url" select="concat('http://',$cache-url,'/',$cache-resource,'/',$cache-grid,'/',$cache-grid,'_',$type,'.LUT/',$key,'?',$parameters)" />
        
        <xsl:variable name="headers">
            <header name="Authorization">Basic <xsl:value-of select="dp:encode(concat($cache-username,':',$cache-password),'base-64')" /></header>
            <header name="Content-Type"><xsl:value-of select="dp:http-request-header('Content-Type')" /></header>
            <xsl:call-template name="loadCookies" />
        </xsl:variable>

        <xsl:variable name="result">
            <dp:url-open response="responsecode" target="{$url}" http-headers="$headers" timeout="{$cache-timeout}">
                <xsl:copy-of select="$data" />
            </dp:url-open>
        </xsl:variable>
        
        <xsl:call-template name="saveCookies">
            <xsl:with-param name="cookieHeader" select="$result/url-open/headers"/>
        </xsl:call-template>

        <xsl:if test="$result/url-open/responsecode = '200'">
            <dp:set-response-header name="'Content-Type'" value="$result/url-open/headers/header[@name = 'Content-Type']"/>
            <xsl:copy-of select="$result/url-open/response/*" />
        </xsl:if>
        
    </xsl:template>
    
    <!-- - - - - - - - - - - - - - - - - -->
    
    <xsl:template name="loadCookies">
        
        <xsl:variable name="cookies" select="dp:variable('var://system/cache/cookies')"/>
        
        <xsl:if test="count($cookies/cookies/cookie) > 0">
            <header name="Cookie">
                <xsl:for-each select="$cookies/cookies/cookie">
                    <xsl:value-of select="concat(@name,'=',text(),';')"/>
                </xsl:for-each>
            </header>
        </xsl:if>
        
    </xsl:template>
    
    <xsl:template name="saveCookies">
        <xsl:param name="cookieHeader"/>

        <xsl:variable name="cookieList" select="dp:variable('var://system/cache/cookies')"/>
        
        <xsl:variable name="newCookieList">
            <cookies>
                <xsl:choose> 
                    <xsl:when test="count($cookieList/cookies/cookie) = 0">
                        <xsl:for-each select="$cookieHeader/header[@name = 'Set-Cookie']">
                            <cookie>
                                <xsl:attribute name="name">
                                    <xsl:value-of select="substring-before(text(),'=')"/>
                                </xsl:attribute>
                                <xsl:value-of select="substring-after(text(),'=')"/>
                            </cookie>
                        </xsl:for-each>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:for-each select="$cookieList/cookies/cookie">
                            <xsl:variable name="cookieListName" select="string(@name)" />
                            <cookie>
                                <xsl:attribute name="name">
                                    <xsl:value-of select="$cookieListName"/>
                                </xsl:attribute> 
                                <xsl:choose>
                                    <xsl:when test="$cookieHeader/header[@name = 'Set-Cookie' and substring-before(text(),'=') = $cookieListName]">
                                        <xsl:value-of select="substring-after($cookieHeader/header[@name = 'Set-Cookie' and substring-before(text(),'=') = $cookieListName],'=')"/>    
                                    </xsl:when>
                                    <xsl:otherwise>
                                        <xsl:value-of select="text()"/>
                                    </xsl:otherwise>
                                </xsl:choose>
                            </cookie>
                        </xsl:for-each>
                    </xsl:otherwise>
                </xsl:choose>
            </cookies>
        </xsl:variable>

        <dp:set-variable name="'var://system/cache/cookies'" value="$newCookieList"/>
    </xsl:template>
    
</xsl:stylesheet>

