<?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.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.html.HtmlScreenRenderer" field="xhtmlStringRenderer"></create-object>
        <!-- create screen renderer -->
        <create-object class-name="org.ofbiz.widget.screen.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.screen.ScreenStringRenderer"/>
        </create-object>
        <set field="xscreenContext.screens" from-field="screens"/>
        <create-object class-name="org.ofbiz.widget.screen.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.screen.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>




