this code sample were taken from
http://svn.apache.org/viewvc?view=revision&revision=584440
see
https://cwiki.apache.org/confluence/display/OFBIZ/Google+Checkout+Integration
it has since been removed from the svn.
I like chris's work because it is a good example of how to extend simple-methods using java scripting (BSH).
though dated this is a source also
http://ofbiz.apache.org/docs/minilang.html#MethodExample
I am showing how to use Groovy to accomplish the same processes mostly as examples.
Note: work in progress feel free to add you examples.
<simple-method method-name="transmitRequest" short-description=""> <!-- Connect, there may be ofbiz HttpClient.java that may handle this well --> <call-simple-method method-name="connectWithRedirectHack"/> <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-name="redirect"/> </simple-method> <!-- Step 1 --> <simple-method method-name="connectWithRedirectHack" short-description=""> <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> </simple-method> <simple-method method-name="createRequestUrl" short-description=""> <!-- Setup Url spec --> <property-to-field resource="googleCheckout" property="basePostUrl" field-name="basePostUrl"/> <property-to-field resource="googleCheckout" property="merchantId" field-name="merchantId"/> <property-to-field resource="googleCheckout" property="request" field-name="request"/> <set field="urlSpec" value="${basePostUrl}${merchantId}${request}"/> <create-object class-name="java.net.URL" field-name="url"> <field field-name="urlSpec"/> </create-object> </simple-method> <simple-method method-name="getHttpAuth" short-description=""> <property-to-field resource="googleCheckout" property="merchantId" field-name="merchantId"/> <property-to-field resource="googleCheckout" property="merchantKey" field-name="merchantKey"/> <set field="userNameAndPass" value="${merchantId}:${merchantKey}"/> <call-class-method method-name="base64Encode" class-name="org.ofbiz.base.util.Base64" ret-field-name="encodedValue"> <field field-name="userNameAndPass"/> </call-class-method> <set field="HttpAuth" value="Basic ${encodedValue}"/> </simple-method> <!-- Step 2 --> <simple-method method-name="createXMLOutput" short-description=""> <!-- create writer --> <create-object class-name="java.io.StringWriter" field-name="XMLWriter"/> <!-- create screen context --> <call-class-method method-name="create" class-name="org.ofbiz.base.util.collections.MapStack" ret-field-name="xscreenContext"/> <!-- Add the shoppingCart to the MapStack --> <set field="inMap.shoppingCart" from-field="parameters.shoppingCart"/> <set-service-fields map-name="inMap" service-name="ConvertOfbizCartToGoogle" to-map-name="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-name="xhtmlStringRenderer"></create-object> <!-- create screen renderer --> <create-object class-name="org.ofbiz.widget.screen.ScreenRenderer" field-name="screens"> <field field-name="XMLWriter" type="java.io.Writer"/> <field field-name="xscreenContext" type="org.ofbiz.base.util.collections.MapStack"/> <field field-name="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-name="xscreens"> <field field-name="XMLWriter" type="java.io.Writer"/> <field field-name="xscreenContext" type="org.ofbiz.base.util.collections.MapStack"/> <field field-name="xhtmlStringRenderer" type="org.ofbiz.widget.screen.ScreenStringRenderer"/> </create-object> <!-- get uri --> <property-to-field resource="googleCheckout" property="xmlTemplateUri" field-name="screenUri"/> <call-object-method method-name="render" obj-field-name="xscreens"> <field field-name="screenUri" type="String"/> </call-object-method> <set field="content" value="${bsh:XMLWriter.toString()}"/> </simple-method> <!-- Step 3 --> <simple-method method-name="setupContent" short-description=""> <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-name="writer"> <field field-name="sWriter" type="java.io.Writer"/> </create-object> <call-object-method method-name="write" obj-field-name="writer"> <field field-name="content" type="String"/> </call-object-method> <call-object-method method-name="close" obj-field-name="writer"/> </simple-method> <!-- Step 4 --> <simple-method method-name="getResponse" short-description=""> <clear-field field-name="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-name="reader"> <field field-name="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="${bsh:buffer.toString()}"/> </simple-method> <!-- Step 5 --> <simple-method method-name="getReDirectFromXmlDoc" short-description=""> <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-name="document" ret-field-name="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=""> <call-class-method method-name="childElementList" class-name="org.ofbiz.base.util.UtilXml" ret-field-name="childList"> <field field-name="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-name="conn"> <field field-name="true" type="boolean"/> </call-object-method> <call-object-method method-name="setDoOutput" obj-field-name="conn"> <field field-name="true" type="boolean"/> </call-object-method> <call-object-method method-name="setUseCaches" obj-field-name="conn"> <field field-name="false" type="boolean"/> </call-object-method> <call-object-method method-name="setFollowRedirects" obj-field-name="conn"> <field field-name="true" type="boolean"/> </call-object-method> <call-object-method method-name="setInstanceFollowRedirects" obj-field-name="conn"> <field field-name="true" type="boolean"/> </call-object-method> <call-object-method method-name="setRequestMethod" obj-field-name="conn"> <string value="POST"/> </call-object-method> <call-simple-method method-name="getHttpAuth"/> <call-object-method method-name="setRequestProperty" obj-field-name="conn"> <string value="Authorization"/> <field field-name="HttpAuth"/> </call-object-method> <call-simple-method method-name="getHttpHost"/> <call-object-method method-name="setRequestProperty" obj-field-name="conn"> <string value="Host"/> <field field-name="HttpHost"/> </call-object-method> <call-object-method method-name="setRequestProperty" obj-field-name="conn"> <string value="content-type"/> <string value="application/xml"/> </call-object-method> <call-object-method method-name="setRequestProperty" obj-field-name="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>