summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCDecoder.java
diff options
context:
space:
mode:
authorBenjamin Culkin <scorpress@gmail.com>2024-05-19 17:56:33 -0400
committerBenjamin Culkin <scorpress@gmail.com>2024-05-19 17:56:33 -0400
commitaedc34d55462a75e329bbf342251ff6504cd117e (patch)
treebcc8f1f2352582717b484df302aeea6696b8f000 /projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCDecoder.java
Initial import from SVN
Diffstat (limited to 'projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCDecoder.java')
-rw-r--r--projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCDecoder.java114
1 files changed, 114 insertions, 0 deletions
diff --git a/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCDecoder.java b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCDecoder.java
new file mode 100644
index 0000000..8da71fe
--- /dev/null
+++ b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCDecoder.java
@@ -0,0 +1,114 @@
+/*
+Wotonomy: OpenStep design patterns for pure Java applications.
+Copyright (C) 2000 Intersect Software Corporation
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, see http://www.gnu.org
+*/
+
+package net.wotonomy.web.xml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import net.wotonomy.foundation.internal.WotonomyException;
+import net.wotonomy.foundation.xml.XMLDecoder;
+
+import org.xml.sax.SAXException;
+
+/**
+* An implementation of XMLDecoder that reads objects from
+* XMLRPC format.
+* This implementation is not thread-safe, so a new instances
+* should be created to accomodate multiple threads.
+*/
+public class XMLRPCDecoder implements XMLDecoder
+{
+ XMLRPCDecoderHelper helper = new XMLRPCDecoderHelper();
+
+ /**
+ * Decodes an object in XML-RPC format from the specified input stream.
+ * @param anInputStream The input stream from which to read.
+ * The stream will be read fully.
+ * @param aDescription A description to accompany error messages
+ * for the stream, typically a file name.
+ * @param aURL A URL against which relative references within the
+ * XML will be resolved.
+ * @return The object that was constructed from the XML content,
+ * or null if no object could be constructed.
+ */
+ public Object decode(
+ InputStream anInputStream, String aDescription, URL aURL )
+ {
+ Object result = null;
+
+ try {
+ SAXParser sparser = SAXParserFactory.newInstance().newSAXParser();
+ sparser.parse(anInputStream,helper,aURL.toExternalForm());
+ result = helper.getResult();
+ } catch (ParserConfigurationException e) {
+ throw new WotonomyException("Problem in parser configuration", e );
+ } catch (IOException e) {
+ throw new WotonomyException("IOException thrown while parsing", e );
+ } catch (SAXException e) {
+ throw new WotonomyException("SAXException thrown while parsing", e );
+ }
+ helper.reset();
+ return result;
+ }
+
+ /**
+ * Decodes an XML-RPC message from the specified input stream.
+ * Stand-alone values not wrapped in "methodCall" or "param"
+ * tags will be treated as a response.
+ * @param anInputStream The input stream from which to read.
+ * The stream will be read fully.
+ * @param aReceiver an XMLRPCReceiver that will be invoked with
+ * the appropriate method: request, response, or fault.
+ */
+ public void decode(
+ InputStream anInputStream, XMLRPCReceiver aReceiver )
+ {
+ try
+ {
+ SAXParser sparser = SAXParserFactory.newInstance().newSAXParser();
+ sparser.parse(anInputStream,helper);
+
+ if ( helper.isRequest() )
+ {
+ aReceiver.request( helper.getMethodName(), helper.getParameters() );
+ }
+ else
+ if ( helper.isFault() )
+ {
+ aReceiver.fault( helper.getFaultCode(), helper.getFaultString() );
+ }
+ else // all else is considered a response
+ {
+ aReceiver.response( helper.getResult() );
+ }
+ } catch (ParserConfigurationException e) {
+ throw new WotonomyException("Problem in parser configuration", e );
+ } catch (IOException e) {
+ throw new WotonomyException("IOException thrown while parsing", e );
+ } catch (SAXException e) {
+ throw new WotonomyException("SAXException thrown while parsing", e );
+ }
+ helper.reset();
+ }
+}