/* -*- c-basic-offset: 4; indent-tabs-mode: nil; -*- //------100-columns-wide------>|*/
// for license please see accompanying LICENSE.txt file (available also at http://www.xmlpull.org/)
package org.xmlpull.v1.xmlrpc;
import java.util.*;
import java.io.*;
import org.xmlpull.v1.*;
/**
* @author Stefan Haustein
*/
public class XmlRpcParserME {
XmlPullParser parser;
/**
* Creates a new XmlRpcParser, using the given XmlPullParser.
*/
public XmlRpcParserME(XmlPullParser parser) {
this.parser = parser;
}
/**
* Parses an XML RPC method call response.
* The return values are collected in a Vector.
*
* @return The return values collected in a Vector.
*/
public Vector parseResponse() throws XmlPullParserException, IOException {
Vector result = new Vector();
parser.nextTag();
parser.require(XmlPullParser.START_TAG, "", "methodResponse");
parser.nextTag();
parser.require(XmlPullParser.START_TAG, "", "params");
while (parser.nextTag() == XmlPullParser.START_TAG) {
parser.require(XmlPullParser.START_TAG, "", "param");
parser.nextTag();
result.addElement(parseValue());
parser.nextTag();
parser.require(XmlPullParser.END_TAG, "", "param");
}
parser.require(XmlPullParser.END_TAG, "", "params");
parser.nextTag();
parser.require(XmlPullParser.END_TAG, "", "methodResponse");
parser.next();
parser.require(XmlPullParser.END_DOCUMENT, null, null);
return result;
}
protected Object parseType(String name) throws IOException, XmlPullParserException {
// System.out.println("type:"+name);
if (name.equals("int") || name.equals("i4"))
return new Integer(Integer.parseInt(parser.nextText()));
else if (name.equals("array"))
return parseArray();
else if (name.equals("struct"))
return parseStruct();
else // String and unrecognized types...
return parser.nextText();
// throw new RuntimeException("unexpected element: " + name);
}
/**
* Parses an XML-RPC value element. Returns the
* content of the element as a corresponding Java object.
*
* precondition: parser is on a "value" start tag
* postcondition: parser is on a "value" end tag
*/
Object parseValue() throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, "", "value"); // precondition
parser.next();
Object result = null;
if (parser.getEventType() == XmlPullParser.TEXT) {
result = parser.getText();
parser.nextTag();
}
if (parser.getEventType() == XmlPullParser.START_TAG) {
if (result != null && ((String) result).trim().length() > 0)
throw new RuntimeException("illegal mixed content!");
String name = parser.getName();
result = parseType(name);
parser.require(XmlPullParser.END_TAG, "", name);
parser.nextTag();
}
parser.require(XmlPullParser.END_TAG, "", "value"); // postcond.
return result;
}
/** Parses an XML-RPC array and returns it as a Java Vector
*
*
* Precondition: On "array" start tag
* Postcondition: On "array" end tag
*
*/
Vector parseArray() throws IOException, XmlPullParserException {
Vector v = new Vector();
parser.require(XmlPullParser.START_TAG, "", "array");
parser.nextTag();
parser.require(XmlPullParser.START_TAG, "", "data");
while (parser.nextTag() == XmlPullParser.START_TAG)
v.addElement(parseValue());
parser.require(XmlPullParser.END_TAG, "", "data");
parser.nextTag();
parser.require(XmlPullParser.END_TAG, "", "array");
return v;
}
Hashtable parseStruct() throws IOException, XmlPullParserException {
Hashtable struct = new Hashtable();
parser.require(XmlPullParser.START_TAG, "", "struct");
while (parser.nextTag() == XmlPullParser.START_TAG) {
parser.require(XmlPullParser.START_TAG, "", "member");
parser.nextTag();
parser.require(XmlPullParser.START_TAG, "", "name");
String name = parser.nextText();
parser.require(XmlPullParser.END_TAG, "", "name");
parser.nextTag();
struct.put(name, parseValue());
parser.nextTag();
parser.require(XmlPullParser.END_TAG, "", "member");
}
parser.require(XmlPullParser.END_TAG, "", "struct");
return struct;
}
/*main method, temporarily included for simple testing only
public static void main(String[] argv)
throws IOException, XmlPullParserException {
String test =
"\n"
+ "\n"
+ " \n"
+ " South Dakota\n"
+ " \n"
+ " \n"
+ " foobar\n"
+ " v\n"
+ " \n"
+ " \n"
+ " 3.14\n"
+ " \n"
+ "\n";
System.out.println("test input:\n" + test);
XmlPullParser xp = new org.kxml2.io.KXmlParser();
xp.setInput(new java.io.StringReader(test));
System.out.println(
"parsing result: " + new XmlRpcParser(xp).parseResponse());
}
*/
}