diff --git a/webservice.sl b/webservice.sl new file mode 100644 index 0000000..627e948 --- /dev/null +++ b/webservice.sl @@ -0,0 +1,167 @@ +# Sleep Webservice Utilities +# +# To use this: +# include('webservice.sl'); +# +# debug(7 | 34) highly recommended +# +# Functions: +# +# $ post("url", %hash) +# connects to "url", posts the data in the hash, returns a handle for reading +# +# % buildDataStructure("..."); +# creates a sleep hash tree from the XML document. each node in the hash is: +# name => string : tagname +# text => string : raw content of the tag (may be a bunch of spaces) +# attributes => hash : attributes for the tag +# children => array : an array of nodes (with this same structure) +# +# childrenToHash(%element) +# constructs a hash out of an element's children... uses the tagnames for the +# keys and each element for the values. +# +# walkData(%data, %functions) +# walks through %data, calls the function held by %functions["tagName"] when +# a tag is encountered. Argument $1 to the function is the current node. +# uses a postorder traversal; children left to right, parent +# +# printNice(%data); +# pretty prints a sleep hash tree +# +# Dependencies: +# +# This code assumes the following jars are in your Java classpath: +# +# commons-codec-1.2.jar - http://archive.apache.org/dist/commons/codec/ +# commons-httpclient-3.1.jar - http://hc.apache.org/downloads.cgi +# commons-logging-api.jar - http://archive.apache.org/dist/commons/logging/binaries/ +# commons-logging.jar - http://archive.apache.org/dist/commons/logging/binaries/ +# jdom.jar - http://www.jdom.org +# +# Contact: +# +# Raphael Mudge (rsmudge@gmail.com) +# +# Release 15 Jul 08 +# + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.PostMethod; + +import sleep.bridges.io.IOObject; + +import org.jdom.*; +import org.jdom.input.*; + +sub post +{ + local('$client $method $key $value $code'); + $client = [new HttpClient]; + $method = [new PostMethod: $1]; + + foreach $key => $value ($2) + { + [$method addParameter: $key, $value]; + } + + $code = [$client executeMethod: $method]; + + if ($code != [HttpStatus SC_OK]) + { + throw "Method failed: " . [$method getStatusLine]; + } + + return [SleepUtils getIOHandle: [$method getResponseBodyAsStream], $null]; +} + +sub buildDataStructure +{ + local('$builder $doc $buffer'); + + $buffer = allocate(strlen($1)); + writeb($buffer, $1); + closef($buffer); + + $builder = [new SAXBuilder]; + $doc = [$builder build: [$buffer getInputStream]]; + + closef($buffer); + + return [{ + local('$child %result'); + + %result["name"] = [$1 getName]; + %result["text"] = [$1 getText]; + %result["attributes"] = [{ + local('$attr %result'); + + foreach $attr ([SleepUtils getArrayWrapper: $1]) + { + %result[[$attr getName]] = [$attr getValue]; + } + + return %result; + }: [$1 getAttributes]]; + + %result["children"] = @(); + + foreach $child ([SleepUtils getArrayWrapper: [$1 getChildren]]) + { + push(%result["children"], [$this: $child]); + } + + return %result; + }: [$doc getRootElement]]; +} + +sub walkData +{ + local('$child'); + + foreach $child ($1["children"]) + { + walkData($child, $2); + } + + invoke($2, @($1), $1["name"]); +} + +sub childrenToHash +{ + local('$child %results'); + + foreach $child ($1["children"]) + { + %results[$child["name"]] = $child["text"]; + } + + return %results; +} + +sub printNice +{ + local('$k $v $2'); + + if (-isarray $1) + { + foreach $k => $v ($1) + { + println("$2 $+ $k $+ :"); + printNice($v, "$2 "); + } + } + else if (-ishash $1) + { + foreach $k => $v ($1) + { + println("$2 $+ $k $+ :"); + printNice($v, "$2 "); + } + } + else + { + println("$2 $+ $1"); + } +}