Author: veithen
Date: Sat Oct 10 12:35:45 2009
New Revision: 823847
URL: http://svn.apache.org/viewvc?rev=823847&view=rev
Log:
* Applied a proper fix for the problem in ADB revealed by r823134, but that
avoids the regression caused by the change in XMLStreamReaderUtils in r822747.
* Increased unit test coverage for XMLStreamReaderUtils to avoid regression.
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java?rev=823847&r1=823846&r2=823847&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
Sat Oct 10 12:35:45 2009
@@ -64,26 +64,21 @@
*/
public static DataHandler getDataHandlerFromElement(XMLStreamReader reader)
throws XMLStreamException {
-
- // according to the pre and post conditions it is possible to have an
- // empty element eg. <ns3:inByteArray
xmlns:ns3="http://tempuri.org/"></ns3:inByteArray> for empty data handlers
- // in that case we return a new data handler.
- // This method is used by adb parser we can not return null since this
element is not null.
- reader.next();
- if (!reader.hasText()){
- DataHandler dataHandler = new DataHandler(new
ByteArrayDataSource(new byte[0]));
- // return from here since reader at the end element
- return dataHandler;
- }
DataHandlerReader dhr = getDataHandlerReader(reader);
String base64;
if (dhr == null) {
- // since we have advance the reader to next have to use the
- // reader.getText
- base64 = reader.getText();
- reader.next();
+ // In this case the best way to get the content of the element is
using
+ // the getElementText method
+ base64 = reader.getElementText();
} else {
+ int event = reader.next();
+ if (event == XMLStreamConstants.END_ELEMENT) {
+ // This means that the element is actaullay empty -> return
empty DataHandler
+ return new DataHandler(new ByteArrayDataSource(new byte[0]));
+ } else if (event != XMLStreamConstants.CHARACTERS) {
+ throw new XMLStreamException("Expected a CHARACTER event");
+ }
if (dhr.isBinary()) {
DataHandler dh = dhr.getDataHandler();
reader.next();
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java?rev=823847&r1=823846&r2=823847&view=diff
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/XMLStreamReaderUtilsTest.java
Sat Oct 10 12:35:45 2009
@@ -19,17 +19,54 @@
package org.apache.axiom.util.stax;
import java.io.StringReader;
+import java.util.Arrays;
+import java.util.Random;
import javax.activation.DataHandler;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
-import org.apache.axiom.om.util.StAXUtils;
-
import junit.framework.TestCase;
+import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axiom.util.base64.Base64StringBufferOutputStream;
+import org.apache.axiom.util.stax.xop.XOPDecodingStreamReader;
+import org.apache.commons.io.IOUtils;
+
public class XMLStreamReaderUtilsTest extends TestCase {
- public void testGetDataHandlerFromElementWithZeroLength() throws Exception
{
+ /**
+ * Test that {...@link
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+ * returns an empty {...@link DataHandler} when the element is empty. The
test uses
+ * an {...@link XMLStreamReader} instance that doesn't implement the
+ * {...@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
extension.
+ *
+ * @throws Exception
+ */
+ public void testGetDataHandlerFromElementWithZeroLengthNonDHR() throws
Exception {
+ testGetDataHandlerFromElementWithZeroLength(false);
+ }
+
+ /**
+ * Test that {...@link
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+ * returns an empty {...@link DataHandler} when the element is empty. The
test uses
+ * an {...@link XMLStreamReader} instance that implements the
+ * {...@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
extension.
+ *
+ * @throws Exception
+ */
+ public void testGetDataHandlerFromElementWithZeroLengthDHR() throws
Exception {
+ testGetDataHandlerFromElementWithZeroLength(true);
+ }
+
+ private void testGetDataHandlerFromElementWithZeroLength(boolean useDHR)
throws Exception {
XMLStreamReader reader = StAXUtils.createXMLStreamReader(new
StringReader("<test/>"));
+ if (useDHR) {
+ // To have an XMLStreamReader that uses the DataHandlerReader
extension, we wrap
+ // the parser using an XOPDecodingStreamReader (even if the
document doesn't contain
+ // any xop:Include).
+ reader = new XOPDecodingStreamReader(reader, null);
+ }
try {
reader.next();
@@ -45,4 +82,109 @@
reader.close();
}
}
+
+ /**
+ * Test that {...@link
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+ * throws an exception if the element has unexpected content. The test uses
+ * an {...@link XMLStreamReader} instance that doesn't implement the
+ * {...@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
extension.
+ *
+ * @throws Exception
+ */
+ public void testGetDataHandlerFromElementWithUnexpectedContentNonDHR()
throws Exception {
+ testGetDataHandlerFromElementWithUnexpectedContent(false);
+ }
+
+ /**
+ * Test that {...@link
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+ * throws an exception if the element has unexpected content. The test uses
+ * an {...@link XMLStreamReader} instance that implements the
+ * {...@link org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
extension.
+ *
+ * @throws Exception
+ */
+ public void testGetDataHandlerFromElementWithUnexpectedContentDHR() throws
Exception {
+ testGetDataHandlerFromElementWithUnexpectedContent(true);
+ }
+
+ private void testGetDataHandlerFromElementWithUnexpectedContent(boolean
useDHR) throws Exception {
+ XMLStreamReader reader = StAXUtils.createXMLStreamReader(new
StringReader("<test>\n<child/>\n</test>"));
+ if (useDHR) {
+ reader = new XOPDecodingStreamReader(reader, null);
+ }
+ try {
+ reader.next();
+
+ // Check precondition
+ assertTrue(reader.isStartElement());
+
+ try {
+ XMLStreamReaderUtils.getDataHandlerFromElement(reader);
+ fail("Expected XMLStreamException");
+ } catch (XMLStreamException ex) {
+ // Expected
+ }
+ } finally {
+ reader.close();
+ }
+ }
+
+ /**
+ * Test that {...@link
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+ * correctly decodes base64 data if the parser is non coalescing and
produces the data
+ * as multiple <tt>CHARACTER</tt> events. The test uses an {...@link
XMLStreamReader} instance
+ * that doesn't implement the {...@link
org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
+ * extension.
+ *
+ * @throws Exception
+ */
+ public void testGetDataHandlerFromElementNonCoalescingNonDHR() throws
Exception {
+ testGetDataHandlerFromElementNonCoalescing(false);
+ }
+
+ /**
+ * Test that {...@link
XMLStreamReaderUtils#getDataHandlerFromElement(XMLStreamReader)}
+ * correctly decodes base64 data if the parser is non coalescing and
produces the data
+ * as multiple <tt>CHARACTER</tt> events. The test uses an {...@link
XMLStreamReader} instance
+ * that implements the {...@link
org.apache.axiom.ext.stax.datahandler.DataHandlerReader}
+ * extension.
+ *
+ * @throws Exception
+ */
+ public void testGetDataHandlerFromElementNonCoalescingDHR() throws
Exception {
+ testGetDataHandlerFromElementNonCoalescing(true);
+ }
+
+ private void testGetDataHandlerFromElementNonCoalescing(boolean useDHR)
throws Exception {
+ // We generate base64 that is sufficiently large to force the parser
to generate
+ // multiple CHARACTER events
+ StringBuffer buffer = new StringBuffer("<test>");
+ Base64StringBufferOutputStream out = new
Base64StringBufferOutputStream(buffer);
+ byte[] data = new byte[65536];
+ new Random().nextBytes(data);
+ out.write(data);
+ out.complete();
+ buffer.append("</test>");
+ // StAXUtils return coalescing parsers, so we need to use
XMLInputFactory here
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
+ XMLStreamReader reader = factory.createXMLStreamReader(new
StringReader(buffer.toString()));
+ if (useDHR) {
+ reader = new XOPDecodingStreamReader(reader, null);
+ }
+ try {
+ reader.next();
+
+ // Check precondition
+ assertTrue(reader.isStartElement());
+
+ DataHandler dh =
XMLStreamReaderUtils.getDataHandlerFromElement(reader);
+
+ // Check postcondition
+ assertTrue(reader.isEndElement());
+ assertTrue(Arrays.equals(data,
IOUtils.toByteArray(dh.getInputStream())));
+ } finally {
+ reader.close();
+ }
+ }
}