X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FXMLRPC.java;h=050199a68537d3778035c94138f19d5aa0612795;hb=67ae88c5e4724a81c1df1a1e3375e8ecffcaa333;hp=efcccf7532019ceb8cecec6423f2318461ad91c6;hpb=8c1756ef3fd42cc2f324baf47e13a83f51045efe;p=org.ibex.core.git diff --git a/src/org/xwt/XMLRPC.java b/src/org/xwt/XMLRPC.java index efcccf7..050199a 100644 --- a/src/org/xwt/XMLRPC.java +++ b/src/org/xwt/XMLRPC.java @@ -30,19 +30,21 @@ import org.bouncycastle.util.encoders.Base64; * convert. * */ -class XMLRPC extends JSCallable { +class XMLRPC extends JS { - /** the url to connect to */ - protected String url = null; + public XMLRPC(String url, String method) { this(url, method, new HTTP(url)); } + public XMLRPC(String url, String method, HTTP http) { this.http = http; this.url = url; this.method = method; } + public Object get(Object name) { return new XMLRPC(url, (method.equals("") ? "" : method + ".") + name.toString(), http); } - /** the method name to invoke on the remove server */ - protected String methodname = null; /** this holds character content as we read it in -- since there is only one per instance, we don't support mixed content */ protected AccessibleCharArrayWriter content = new AccessibleCharArrayWriter(100); + protected String url = null; ///< the url to connect to + protected String method = null; ///< the method name to invoke on the remove server + protected HTTP http = null; ///< the HTTP connection to use + private Hash tracker; ///< used to detect multi-ref data + protected boolean fault = false; ///< True iff the return value is a fault (and should be thrown as an exception) - /** the HTTP connection to use */ - protected HTTP http = null; /** The object stack. As we process xml elements, pieces of the * return value are pushed onto and popped off of this stack. @@ -67,50 +69,35 @@ class XMLRPC extends JSCallable { */ protected Vec objects = null; - /** used to detect multi-ref data */ - private Hash tracker; - /** True iff the return value is a fault (and should be thrown as an exception) */ - protected boolean fault = false; - - - // Methods to Recieve and parse XML-RPC Response //////////////////////////////////////////////////// + // Recieve //////////////////////////////////////////////////////////////// private class Helper extends XML { public Helper() { super(BUFFER_SIZE); } public void startElement(XML.Element c) { content.reset(); - if (c.localName.equals("fault")) fault = true; - else if (c.localName.equals("struct")) objects.setElementAt(new JS(), objects.size() - 1); - else if (c.localName.equals("array")) objects.setElementAt(null, objects.size() - 1); - else if (c.localName.equals("value")) objects.addElement(""); + //#switch(c.getLocalName()) + case "fault": fault = true; + case "struct": objects.setElementAt(new JS(), objects.size() - 1); + case "array": objects.setElementAt(null, objects.size() - 1); + case "value": objects.addElement(""); + //#end } public void endElement(XML.Element c) { - - if (c.localName.equals("int") || c.localName.equals("i4")) - objects.setElementAt(new Integer(new String(content.getBuf(), 0, content.size())), objects.size() - 1); - - else if (c.localName.equals("boolean")) - objects.setElementAt(content.getBuf()[0] == '1' ? Boolean.TRUE : Boolean.FALSE, objects.size() - 1); - - else if (c.localName.equals("string")) + //#switch(c.getLocalName()) + case "int": objects.setElementAt(new Integer(new String(content.getBuf(), 0, content.size())), objects.size() - 1); + case "i4": objects.setElementAt(new Integer(new String(content.getBuf(), 0, content.size())), objects.size() - 1); + case "boolean": objects.setElementAt(content.getBuf()[0] == '1' ? Boolean.TRUE : Boolean.FALSE, objects.size() - 1); + case "string": objects.setElementAt(new String(content.getBuf(), 0, content.size()), objects.size() - 1); + case "double": objects.setElementAt(new Double(new String(content.getBuf(), 0, content.size())), objects.size() - 1); + case "base64": objects.setElementAt(new Res.ByteArray(Base64.decode(new String(content.getBuf(), 0, content.size())), + null), objects.size() - 1); + case "name": objects.addElement(new String(content.getBuf(), 0, content.size())); + case "value": if ("".equals(objects.lastElement())) objects.setElementAt(new String(content.getBuf(), 0, content.size()), objects.size() - 1); - - else if (c.localName.equals("double")) - objects.setElementAt(new Double(new String(content.getBuf(), 0, content.size())), objects.size() - 1); - - else if (c.localName.equals("base64")) - objects.setElementAt(new Res.ByteArray(Base64.decode(new String(content.getBuf(), 0, content.size())), null), objects.size() - 1); - - else if (c.localName.equals("name")) - objects.addElement(new String(content.getBuf(), 0, content.size())); - - else if (c.localName.equals("value") && "".equals(objects.lastElement())) - objects.setElementAt(new String(content.getBuf(), 0, content.size()), objects.size() - 1); - - else if (c.localName.equals("dateTime.iso8601")) { + case "dateTime.iso8601": String s = new String(content.getBuf(), 0, content.size()); // strip whitespace @@ -135,24 +122,28 @@ class XMLRPC extends JSCallable { if (Log.on) Log.log(this, "error parsing date : " + s); if (Log.on) Log.log(this, e); } - - } else if (c.localName.equals("member")) { + case "member": Object memberValue = objects.elementAt(objects.size() - 1); String memberName = (String)objects.elementAt(objects.size() - 2); JS struct = (JS)objects.elementAt(objects.size() - 3); - struct.put(memberName, memberValue); + try { + struct.put(memberName, memberValue); + } catch (JSExn e) { + throw new Error("this should never happen"); + } objects.setSize(objects.size() - 2); - - } else if (c.localName.equals("data")) { + case "data": int i; for(i=objects.size() - 1; objects.elementAt(i) != null; i--); JSArray arr = new JSArray(); - for(int j = i + 1; j\n"); + content.append(" \n"); + content.append(" "); + content.append(method); + content.append("\n"); + content.append(" \n"); + for(int i=0; i\n"); + appendObject(args.elementAt(i), content); + content.append(" \n"); + } + content.append(" \n"); + content.append(" "); + return content.toString(); + } /** Appends the XML-RPC representation of o to sb */ - void appendObject(Object o, StringBuffer sb) throws JS.Exn { + void appendObject(Object o, StringBuffer sb) throws JSExn { if (o == null) { - throw new JS.Exn("attempted to send a null value via XML-RPC"); + throw new JSExn("attempted to send a null value via XML-RPC"); } else if (o instanceof Number) { if ((double)((Number)o).intValue() == ((Number)o).doubleValue()) { @@ -212,7 +222,7 @@ class XMLRPC extends JSCallable { } catch (IOException e) { if (Log.on) Log.log(this, "caught IOException while attempting to send a ByteStream via XML-RPC"); if (Log.on) Log.log(this, e); - throw new JS.Exn("caught IOException while attempting to send a ByteStream via XML-RPC"); + throw new JSExn("caught IOException while attempting to send a ByteStream via XML-RPC"); } } else if (o instanceof String) { @@ -255,7 +265,7 @@ class XMLRPC extends JSCallable { sb.append("\n"); } else if (o instanceof JSArray) { - if (tracker.get(o) != null) throw new JS.Exn("attempted to send multi-ref data structure via XML-RPC"); + if (tracker.get(o) != null) throw new JSExn("attempted to send multi-ref data structure via XML-RPC"); tracker.put(o, Boolean.TRUE); sb.append(" \n"); JSArray a = (JSArray)o; @@ -263,7 +273,7 @@ class XMLRPC extends JSCallable { sb.append(" \n"); } else if (o instanceof JS) { - if (tracker.get(o) != null) throw new JS.Exn("attempted to send multi-ref data structure via XML-RPC"); + if (tracker.get(o) != null) throw new JSExn("attempted to send multi-ref data structure via XML-RPC"); tracker.put(o, Boolean.TRUE); JS j = (JS)o; sb.append(" \n"); @@ -277,127 +287,53 @@ class XMLRPC extends JSCallable { sb.append(" \n"); } else { - throw new JS.Exn("attempt to send object of type " + o.getClass().getName() + " via XML-RPC"); + throw new JSExn("attempt to send object of type " + o.getClass().getName() + " via XML-RPC"); } } - public Object call_(JSArray args) throws JS.Exn, IOException { - if (Log.verbose) Log.log(this, "call to " + url + " : " + methodname); - - if (tracker == null) tracker = new Hash(); - else tracker.clear(); - - if (objects == null) objects = new Vec(); - else objects.setSize(0); - - final String content = send(args, http); - if (Log.verbose) { - String s; - BufferedReader br2 = new BufferedReader(new StringReader(content)); - while ((s = br2.readLine()) != null) Log.log(this, "send: " + s); - } - - InputStream is = http.POST("text/xml", content); - try { - BufferedReader br = !Log.verbose ? - new BufferedReader(new InputStreamReader(is)) : - new BufferedReader(new FilterReader(new InputStreamReader(is)) { - public int read() throws IOException { - int i = super.read(); - if (Log.on) Log.log(this, "recv: " + ((char)i)); - return i; - } - public int read(char[] c, int off, int len) throws IOException { - int ret = super.read(c, off, len); - if (ret == -1) return ret; - String s; - BufferedReader br2 = new BufferedReader(new StringReader(new String(c, off, ret))); - while ((s = br2.readLine()) != null) Log.log(this, "recv: " + s); - return ret; - } - }); - return null; - } finally { - is.close(); - } - } - protected String send(JSArray args, HTTP http) throws JS.Exn, IOException { - StringBuffer content = new StringBuffer(); - content.append("\r\n"); - content.append("\n"); - content.append(" \n"); - content.append(" "); - content.append(methodname); - content.append("\n"); - content.append(" \n"); - for(int i=0; i\n"); - appendObject(args.elementAt(i), content); - content.append(" \n"); - } - content.append(" \n"); - content.append(" "); - return content.toString(); - } - - protected Object recieve(BufferedReader br) throws JS.Exn, IOException { - // parse XML reply - try { - new Helper().parse(br); - } catch (XML.XMLException e) { - if (Log.on) Log.log(this, "reply from server was not well-formed XML: " + e); - throw new JS.Exn("reply from server was not well-formed XML: " + e); - } - - if (fault) throw new JS.Exn(objects.elementAt(0)); - if (objects.size() == 0) return null; - return objects.elementAt(0); - } + // Call Sequence ////////////////////////////////////////////////////////////////////////// - public final Object call(Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JS.Exn { + public final Object call(Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn { JSArray args = new JSArray(); for(int i=0; i