<?xml version="1.0" encoding="UTF-8"?>
<!--
    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.
-->

<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods-v2.xsd">


    <simple-method method-name="transmitRequest" short-description="" login-required="false">
        <!-- Connect, there may be ofbiz HttpClient.java that may handle this well -->
        <call-service service-name="connectToGoogleCheckoutServer">
            <result-to-field result-name="conn"/>
        </call-service>
        <log level="info" message="step 1 done"/>
        <!-- Get the Content -->
        <call-simple-method method-name="createXMLOutput"/>
        <log level="info" message="step 2 done"/>
        <!-- Setup the Content -->
        <call-simple-method method-name="setupContent"/>
        <log level="info" message="step 3 done ${content}"/>
        <!-- Get Response -->
        <call-simple-method method-name="getResponse"/>
        <log level="info" message="step 4 done"/>
        <!-- Get Redirect from xml document response -->
        <log level="info" message="${response}"/>
        <call-simple-method method-name="getReDirectFromXmlDoc"/>
        <log level="info" message="step 5 done"/>
        <field-to-result field="redirect"/>
    </simple-method>
<!-- Step 1 -->
    <simple-method method-name="connectToGoogleCheckoutServer" short-description="create connection to Google Checkout server" login-required="false">
        <call-simple-method method-name="createRequestUrl"/>
        <call-simple-method method-name="getHttpAuth"/>
        <call-bsh><![CDATA[
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setDoInput (true);
            conn.setDoOutput (true);
            conn.setUseCaches (false);
            conn.setFollowRedirects(true);
            conn.setInstanceFollowRedirects(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Authorization", HttpAuth);
            conn.setRequestProperty("Host", conn.getURL().getHost());
            conn.setRequestProperty("content-type", "application/xml");
            conn.setRequestProperty("accept", "application/xml");
            conn.connect();
        return org.ofbiz.base.util.UtilMisc.toMap("conn", conn);
        ]]></call-bsh>
        <field-to-result field="conn"/>
    </simple-method>
    <simple-method method-name="createRequestUrl" short-description="" login-required="false">
        <!-- Setup Url spec -->
        <property-to-field resource="googleCheckout" property="basePostUrl" field="basePostUrl"/>
        <property-to-field resource="googleCheckout" property="merchantId" field="merchantId"/>
        <property-to-field resource="googleCheckout" property="request" field="request"/>
        <set field="urlSpec" value="${basePostUrl}${merchantId}"/>
        <create-object class-name="java.net.URL" field="url">
            <field field="urlSpec"/>
        </create-object>
    </simple-method>
    <simple-method method-name="getHttpAuth" short-description="" login-required="false">
        <property-to-field resource="googleCheckout" property="merchantId" field="merchantId"/>
        <property-to-field resource="googleCheckout" property="merchantKey" field="merchantKey"/>
        <set field="userNameAndPass" value="${merchantId}:${merchantKey}"/>
        <call-class-method method-name="base64Encode" class-name="org.ofbiz.base.util.Base64" ret-field="encodedValue">
            <field field="userNameAndPass"/>
        </call-class-method>
        <set field="HttpAuth" value="Basic ${encodedValue}"/>
    </simple-method>
<!-- Step 2 -->
    <simple-method method-name="createXMLOutput" short-description="" login-required="false">
        <!-- create writer -->
        <create-object class-name="java.io.StringWriter" field="XMLWriter"/>
        <!-- create screen context -->
        <call-class-method method-name="create" class-name="org.ofbiz.base.util.collections.MapStack" ret-field="xscreenContext"/>
        <!-- Add the shoppingCart to the MapStack -->
        <set field="inMap.shoppingCart" from-field="parameters.shoppingCart"/>
        <set-service-fields map="inMap" service-name="ConvertOfbizCartToGoogle" to-map="serMap"/>
        <call-service service-name="ConvertOfbizCartToGoogle" in-map-name="serMap">
            <result-to-field result-name="googleCart"/>
            <result-to-field result-name="flowSupport"/>
            <result-to-field result-name="sendInitialAuthDetails"/>
        </call-service>
        <set field="xscreenContext.googleCart" from-field="googleCart"/>
        <set field="xscreenContext.flowSupport" from-field="flowSupport"/>
        <set field="xscreenContext.sendInitialAuthDetails" from-field="sendInitialAuthDetails"/>
        <set field="xscreenContext.shoppingCart" from-field="parameters.shoppingCart"/>
        <!-- create string renderer -->
        <create-object class-name="org.ofbiz.widget.renderer.html.HtmlScreenRenderer" field="xhtmlStringRenderer"></create-object>
        <!-- create screen renderer -->
        <create-object class-name="org.ofbiz.widget.renderer.ScreenRenderer" field="screens">
            <field field="XMLWriter" type="java.lang.Appendable"/>
            <field field="xscreenContext" type="org.ofbiz.base.util.collections.MapStack"/>
            <field field="xhtmlStringRenderer" type="org.ofbiz.widget.renderer.ScreenStringRenderer"/>
        </create-object>
        <set field="xscreenContext.screens" from-field="screens"/>
        <create-object class-name="org.ofbiz.widget.renderer.ScreenRenderer" field="xscreens">
            <field field="XMLWriter" type="java.lang.Appendable"/>
            <field field="xscreenContext" type="org.ofbiz.base.util.collections.MapStack"/>
            <field field="xhtmlStringRenderer" type="org.ofbiz.widget.renderer.ScreenStringRenderer"/>
        </create-object>
        <!-- get uri -->
        <property-to-field resource="googleCheckout" property="xmlTemplateUri" field="screenUri"/>
        <call-object-method method-name="render" obj-field="xscreens">
            <field field="screenUri" type="String"/>
        </call-object-method>
        <set field="content" value="${groovy:XMLWriter.toString()}"/>
    </simple-method>
<!-- Step 3 -->
    <simple-method method-name="setupContent" short-description="" login-required="false">
        <call-bsh><![CDATA[
        sWriter = new OutputStreamWriter(conn.getOutputStream());
        return org.ofbiz.base.util.UtilMisc.toMap("sWriter", sWriter);
        ]]></call-bsh>
        <create-object class-name="java.io.BufferedWriter" field="writer">
            <field field="sWriter" type="java.io.Writer"/>
        </create-object>
        <call-object-method method-name="write" obj-field="writer">
            <field field="content" type="String"/>
        </call-object-method>
        <call-object-method method-name="close" obj-field="writer"/>
    </simple-method>
<!-- Step 4 -->
    <simple-method method-name="getResponse" short-description="" login-required="false">
        <clear-field field="sReader"/>
        <call-bsh><![CDATA[
        try {
          sReader = new InputStreamReader(conn.getInputStream());
        } catch (IOException ex) {
          sReader = new InputStreamReader(conn.getErrorStream());
        }
        return org.ofbiz.base.util.UtilMisc.toMap("sReader", sReader);
        ]]></call-bsh>

        <create-object class-name="java.io.BufferedReader" field="reader">
            <field field="sReader" type="java.io.Reader"/>
        </create-object>
        <call-bsh><![CDATA[
        StringBuffer buffer = new StringBuffer();
        String line = null;
        while (null != (line = reader.readLine())) {
            buffer.append(line);
        }
        return org.ofbiz.base.util.UtilMisc.toMap("buffer", buffer);
        ]]></call-bsh>
        <set field="response" value="${groovy:buffer.toString()}"/>
    </simple-method>
<!-- Step 5 -->
    <simple-method method-name="getReDirectFromXmlDoc" short-description="" login-required="false">
        <call-bsh><![CDATA[
            document = org.ofbiz.base.util.UtilXml.readXmlDocument(response, false);
        return org.ofbiz.base.util.UtilMisc.toMap("document", document);
        ]]></call-bsh>
        <call-object-method method-name="getDocumentElement" obj-field="document" ret-field="rootElement"/>
        <!-- May want to get the serial number to store eventually; would be an attribute of this rootElement,
                Skipping for now -->
        <call-simple-method method-name="getRedirectFromRootElement"/>
    </simple-method>
    <simple-method method-name="getRedirectFromRootElement" short-description="" login-required="false">
        <call-class-method method-name="childElementList" class-name="org.ofbiz.base.util.UtilXml" ret-field="childList">
            <field field="rootElement" type="org.w3c.dom.Element"/>
        </call-class-method>
        <call-bsh><![CDATA[
        redirect = null;
        childListIter = childList.iterator();
        while (childListIter.hasNext()){
            child = childListIter.next();
            org.ofbiz.base.util.Debug.logInfo("child =" + child,null);
            nodeName = child.getNodeName();
            if ("redirect-url".equals(nodeName)){
                redirect = org.ofbiz.base.util.UtilXml.elementValue(child);
            } else {
                redirect = document;
            }

        }
        return org.ofbiz.base.util.UtilMisc.toMap("redirect", redirect.toString());
        ]]></call-bsh>
    </simple-method>











    <simple-method method-name="setupHeaders" short-description="">
        <set field="true" value="true" type="Boolean"/>
        <set field="false" value="false" type="Boolean"/>

        <call-object-method method-name="setDoInput" obj-field="conn">
            <field field="true" type="boolean"/>
        </call-object-method>

        <call-object-method method-name="setDoOutput" obj-field="conn">
            <field field="true" type="boolean"/>
        </call-object-method>

        <call-object-method method-name="setUseCaches" obj-field="conn">
            <field field="false" type="boolean"/>
        </call-object-method>

        <call-object-method method-name="setFollowRedirects" obj-field="conn">
            <field field="true" type="boolean"/>
        </call-object-method>

        <call-object-method method-name="setInstanceFollowRedirects" obj-field="conn">
            <field field="true" type="boolean"/>
        </call-object-method>

        <call-object-method method-name="setRequestMethod" obj-field="conn">
            <string value="POST"/>
        </call-object-method>

        <call-simple-method method-name="getHttpAuth"/>
        <call-object-method method-name="setRequestProperty" obj-field="conn">
            <string value="Authorization"/>
            <field field="HttpAuth"/>
        </call-object-method>

        <call-simple-method method-name="getHttpHost"/>
        <call-object-method method-name="setRequestProperty" obj-field="conn">
            <string value="Host"/>
            <field field="HttpHost"/>
        </call-object-method>

        <call-object-method method-name="setRequestProperty" obj-field="conn">
            <string value="content-type"/>
            <string value="application/xml"/>
        </call-object-method>

        <call-object-method method-name="setRequestProperty" obj-field="conn">
            <string value="accept"/>
            <string value="application/xml"/>
        </call-object-method>

    </simple-method>
    <simple-method method-name="getHttpHost" short-description="">
        <call-bsh><![CDATA[
        HttpHost = conn.getURL().getHost();
        return org.ofbiz.base.util.UtilMisc.toMap("HttpHost", HttpHost);
        ]]></call-bsh>
    </simple-method>

</simple-methods>




