Author: jochen Date: Thu Feb 23 14:35:40 2006 New Revision: 380254 URL: http://svn.apache.org/viewcvs?rev=380254&view=rev Log: Nested object arrays could not be parsed. The "string" tag could not be parsed.
Added: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/StringParser.java webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/SAXParsers.java webservices/xmlrpc/trunk/src/changes/ webservices/xmlrpc/trunk/src/changes/changes.xml webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java Modified: webservices/xmlrpc/trunk/.classpath webservices/xmlrpc/trunk/.project webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcStreamTransport.java webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeFactoryImpl.java webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/ObjectArrayParser.java webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/serializer/StringSerializer.java webservices/xmlrpc/trunk/pom.xml webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java Modified: webservices/xmlrpc/trunk/.classpath URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/.classpath?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/.classpath (original) +++ webservices/xmlrpc/trunk/.classpath Thu Feb 23 14:35:40 2006 @@ -4,7 +4,7 @@ <classpathentry kind="src" path="client/src/main/java"/> <classpathentry kind="src" path="server/src/main/java"/> <classpathentry kind="src" path="tests/src/test/java"/> - <classpathentry output="tests/src/test/resources" kind="src" path="tests/src/test/resources"/> + <classpathentry kind="src" path="tests/src/test/resources"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/> <classpathentry kind="output" path="target/classes"/> Modified: webservices/xmlrpc/trunk/.project URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/.project?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/.project (original) +++ webservices/xmlrpc/trunk/.project Thu Feb 23 14:35:40 2006 @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <projectDescription> - <name>ws-xmlrpc-3</name> + <name>ws-xmlrpc</name> <comment>Apache XML-RPC is a Java implementation of XML-RPC, a popular protocol that uses XML over HTTP to implement remote procedure calls. Compared to SOAP, or JAX-RPC, it is stable, much simpler and easier to Modified: webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcStreamTransport.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcStreamTransport.java?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcStreamTransport.java (original) +++ webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcStreamTransport.java Thu Feb 23 14:35:40 2006 @@ -15,7 +15,6 @@ */ package org.apache.xmlrpc.client; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -32,6 +31,7 @@ import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig; import org.apache.xmlrpc.parser.XmlRpcResponseParser; import org.apache.xmlrpc.serializer.XmlRpcWriter; +import org.apache.xmlrpc.util.SAXParsers; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -43,13 +43,6 @@ * the response, */ public abstract class XmlRpcStreamTransport extends XmlRpcTransportImpl { - private static final SAXParserFactory spf; - static { - spf = SAXParserFactory.newInstance(); - spf.setNamespaceAware(true); - spf.setValidating(false); - } - /** Creates a new instance on behalf of the given client. */ protected XmlRpcStreamTransport(XmlRpcClient pClient) { @@ -228,14 +221,8 @@ } } - protected XMLReader newXMLReader() throws XmlRpcClientException { - try { - return spf.newSAXParser().getXMLReader(); - } catch (ParserConfigurationException e) { - throw new XmlRpcClientException("Failed to create XMLReader: " + e.getMessage(), e); - } catch (SAXException e) { - throw new XmlRpcClientException("Failed to create XMLReader: " + e.getMessage(), e); - } + protected XMLReader newXMLReader() throws XmlRpcException { + return SAXParsers.newXMLReader(); } protected Object readResponse(XmlRpcStreamRequestConfig pConfig, InputStream pStream) throws XmlRpcException { Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeFactoryImpl.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeFactoryImpl.java?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeFactoryImpl.java (original) +++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/common/TypeFactoryImpl.java Thu Feb 23 14:35:40 2006 @@ -35,6 +35,7 @@ import org.apache.xmlrpc.parser.NullParser; import org.apache.xmlrpc.parser.ObjectArrayParser; import org.apache.xmlrpc.parser.SerializableParser; +import org.apache.xmlrpc.parser.StringParser; import org.apache.xmlrpc.parser.TypeParser; import org.apache.xmlrpc.serializer.BooleanSerializer; import org.apache.xmlrpc.serializer.ByteArraySerializer; @@ -192,6 +193,8 @@ return new MapParser(pConfig, pContext, this); } else if (ByteArraySerializer.BASE_64_TAG.equals(pLocalName)) { return new ByteArrayParser(); + } else if (StringSerializer.STRING_TAG.equals(pLocalName)) { + return new StringParser(); } } return null; Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/ObjectArrayParser.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/ObjectArrayParser.java?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/ObjectArrayParser.java (original) +++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/ObjectArrayParser.java Thu Feb 23 14:35:40 2006 @@ -97,7 +97,7 @@ } startValueTag(); break; - case 3: + default: super.startElement(pURI, pLocalName, pQName, pAttrs); break; } Added: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/StringParser.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/StringParser.java?rev=380254&view=auto ============================================================================== --- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/StringParser.java (added) +++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/parser/StringParser.java Thu Feb 23 14:35:40 2006 @@ -0,0 +1,13 @@ +package org.apache.xmlrpc.parser; + +import org.xml.sax.SAXException; + + +/** Parser implementation for parsing a string. + */ +public class StringParser extends AtomicParser { + protected void setResult(String pResult) throws SAXException { + super.setResult((Object) pResult); + } + +} Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/serializer/StringSerializer.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/serializer/StringSerializer.java?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/serializer/StringSerializer.java (original) +++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/serializer/StringSerializer.java Thu Feb 23 14:35:40 2006 @@ -22,6 +22,10 @@ /** A [EMAIL PROTECTED] TypeSerializer} for strings. */ public class StringSerializer extends TypeSerializerImpl { + /** (Optional) Tag name of a string value. + */ + public static final String STRING_TAG = "string"; + public void write(ContentHandler pHandler, Object pObject) throws SAXException { write(pHandler, null, pObject.toString()); } Added: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/SAXParsers.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/SAXParsers.java?rev=380254&view=auto ============================================================================== --- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/SAXParsers.java (added) +++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/SAXParsers.java Thu Feb 23 14:35:40 2006 @@ -0,0 +1,32 @@ +package org.apache.xmlrpc.util; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.xmlrpc.XmlRpcException; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + + +/** Utility class for working with SAX parsers. + */ +public class SAXParsers { + private static final SAXParserFactory spf; + static { + spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + spf.setValidating(false); + } + + /** Creates a new instance of [EMAIL PROTECTED] XMLReader}. + */ + public static XMLReader newXMLReader() throws XmlRpcException { + try { + return spf.newSAXParser().getXMLReader(); + } catch (ParserConfigurationException e) { + throw new XmlRpcException("Unable to create XML parser: " + e.getMessage(), e); + } catch (SAXException e) { + throw new XmlRpcException("Unable to create XML parser: " + e.getMessage(), e); + } + } +} Modified: webservices/xmlrpc/trunk/pom.xml URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/pom.xml?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/pom.xml (original) +++ webservices/xmlrpc/trunk/pom.xml Thu Feb 23 14:35:40 2006 @@ -114,6 +114,12 @@ <organization>Zenplex</organization> </developer> </developers> + <contributors> + <contributor> + <name>Walter Mundt</name> + <email>[EMAIL PROTECTED]</email> + </contributor> + </contributors> <licenses> <license> <name>The Apache Software License, Version 2.0</name> @@ -223,6 +229,10 @@ </dependencies> <reporting> <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>changes-maven-plugin</artifactId> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java?rev=380254&r1=380253&r2=380254&view=diff ============================================================================== --- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java (original) +++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java Thu Feb 23 14:35:40 2006 @@ -23,9 +23,6 @@ import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.xmlrpc.XmlRpcException; @@ -38,6 +35,7 @@ import org.apache.xmlrpc.serializer.DefaultXMLWriterFactory; import org.apache.xmlrpc.serializer.XmlRpcWriter; import org.apache.xmlrpc.serializer.XmlWriterFactory; +import org.apache.xmlrpc.util.SAXParsers; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -51,25 +49,12 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer implements XmlRpcStreamRequestProcessor { private static final Log log = LogFactory.getLog(XmlRpcStreamServer.class); - private static final SAXParserFactory spf; private XmlWriterFactory writerFactory = new DefaultXMLWriterFactory(); - static { - spf = SAXParserFactory.newInstance(); - spf.setNamespaceAware(true); - spf.setValidating(false); - } protected XmlRpcRequest getRequest(final XmlRpcStreamRequestConfig pConfig, InputStream pStream) throws XmlRpcException { final XmlRpcRequestParser parser = new XmlRpcRequestParser(pConfig, getTypeFactory()); - final XMLReader xr; - try { - xr = spf.newSAXParser().getXMLReader(); - } catch (ParserConfigurationException e) { - throw new XmlRpcException("Unable to create XML parser: " + e.getMessage(), e); - } catch (SAXException e) { - throw new XmlRpcException("Unable to create XML parser: " + e.getMessage(), e); - } + final XMLReader xr = SAXParsers.newXMLReader(); xr.setContentHandler(parser); try { xr.parse(new InputSource(pStream)); Added: webservices/xmlrpc/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/src/changes/changes.xml?rev=380254&view=auto ============================================================================== --- webservices/xmlrpc/trunk/src/changes/changes.xml (added) +++ webservices/xmlrpc/trunk/src/changes/changes.xml Thu Feb 23 14:35:40 2006 @@ -0,0 +1,64 @@ +<document> + <properties> + <title>Changes in Apache XML-RPC</title> + </properties> + <body> + <release version="3.0-SNAPSHOT" date="Not yet released"> + <action dev="jochen" type="fix" due-to="Walter Mundt" + due-to-email="[EMAIL PROTECTED]"> + Nested object arrays could not be parsed. + </action> + <action dev="jochen" type="fix" due-to="Walter Mundt" + due-to-email="[EMAIL PROTECTED]"> + The "string" tag could not be parsed. + </action> + <action dev="jochen" type="enhancement"> + The project is now splitted into three jar files: + common, client, and server. + </action> + </release> + <release version="3.0a1" date="17-Feb-2005"> + <action dev="jochen" type="enhancement"> + Complete rewrite, adding vendor extensions: + Streaming mode, support for all primitive Java types, + nulls, DOM elements, and JAXB objects. + </action> + </release> + <release version="2.0.2" date="Not yet released"> + <action dev="jochen" type="fix" issue="XMLRPC-67" + due-to="Mike Bailey" due-to-email="mike at blueoak.com"> + A missing increment in LiteXmlRpcTransport.initConnection() + prevented, that the method could finally fail, resulting + in a never ending loop. + </action> + </release> + <release version="2.0.1" date="28-Dec-2005"> + <action dev="jochen" type="fix" issue="XMLRPC-68" + due-to="Johan Oskarson" due-to-email="johan at oskarsson.nu"> + The Webserver class was unable to handle basic authentication, + because the BASE64 codec wasn't initialized. + </action> + <action dev="jochen" type="fix" issue="XMLRPC-69" + due-to="Claude Zervas" due-to-email="claude at utlco.com"> + The characters 0x20, 0xe000, and 0x10000 have been escaped + without reason. + </action> + <action dev="jochen" type="fix" issue="XMLRPC-73" + due-to="Thomas Mohaupt" due-to-email="Thomas.Mohaupt at gmail.com"> + The wrong version of commons-codec was downloaded by build.xml. + </action> + <action dev="jochen" type="enhancement" + due-to="Jimisola Laursen" due-to-email="[EMAIL PROTECTED]"> + Added the CommonsXmlRpcTransportFactory. + </action> + <action dev="jochen" type="enhancement" + due-to="Henry Story" due-to-email="[EMAIL PROTECTED]"> + Added the possibility to specify a timezone for interpreting + incoming date values. + </action> + <action dev="jochen" type="enhancement"> + Upgrade to commons-httpclient 3.0. + </action> + </release> + </body> +</document> Added: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java?rev=380254&view=auto ============================================================================== --- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java (added) +++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ParserTest.java Thu Feb 23 14:35:40 2006 @@ -0,0 +1,79 @@ +package org.apache.xmlrpc.test; + +import java.io.IOException; +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.apache.xmlrpc.XmlRpcException; +import org.apache.xmlrpc.client.XmlRpcClient; +import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; +import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig; +import org.apache.xmlrpc.parser.XmlRpcResponseParser; +import org.apache.xmlrpc.util.SAXParsers; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; + + +/** Test for the various parsers. + */ +public class ParserTest extends TestCase { + private Object parseResponse(final String s) throws XmlRpcException, IOException, SAXException, SAXParseException { + XmlRpcStreamRequestConfig config = new XmlRpcClientConfigImpl(); + XmlRpcClient client = new XmlRpcClient(); + XmlRpcResponseParser parser = new XmlRpcResponseParser(config, client.getTypeFactory()); + XMLReader xr = SAXParsers.newXMLReader(); + xr.setContentHandler(parser); + try { + xr.parse(new InputSource(new StringReader(s))); + } catch (SAXParseException e) { + throw e; + } + Object o = parser.getResult(); + return o; + } + + /** Tests, whether strings can be parsed with, + * or without, the "string" tag. + */ + public void testStringType() throws Exception { + final String[] strings = new String[]{ + "3", "<string>3</string>", + " <string>3</string> " + }; + for (int i = 0; i < strings.length; i++) { + final String s = + "<?xml version='1.0' encoding='UTF-8'?>\n" + + "<methodResponse><params><param>\n" + + "<value>" + strings[i] + "</value></param>\n" + + "</params></methodResponse>\n"; + Object o = parseResponse(s); + assertEquals("3", o); + } + } + + /** Tests, whether nested arrays can be parsed. + */ + public void testNestedObjectArrays() throws Exception { + final String s = + "<?xml version='1.0' encoding='UTF-8'?>\n" + + "<methodResponse><params><param>\n" + + "<value><array><data><value><array>\n" + + "<data><value>array</value>\n" + + "<value>string</value></data></array>\n" + + "</value></data></array></value></param>\n" + + "</params></methodResponse>\n"; + Object o = parseResponse(s); + assertTrue(o instanceof Object[]); + Object[] outer = (Object[]) o; + assertEquals(1, outer.length); + o = outer[0]; + assertTrue(o instanceof Object[]); + Object[] inner = (Object[]) o; + assertEquals(2, inner.length); + assertEquals("array", inner[0]); + assertEquals("string", inner[1]); + } +}