You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ve...@apache.org on 2010/05/24 18:50:08 UTC
svn commit: r947712 - in /webservices/commons/trunk/modules/axiom/modules:
axiom-api/src/main/java/org/apache/axiom/om/util/
axiom-api/src/main/java/org/apache/axiom/util/stax/
axiom-api/src/test/java/org/apache/axiom/util/stax/
axiom-tests/src/test/ja...
Author: veithen
Date: Mon May 24 16:50:08 2010
New Revision: 947712
URL: http://svn.apache.org/viewvc?rev=947712&view=rev
Log:
Refactored the TextFromElementReader class and related code so that it can be used in a wider range of use cases.
Removed:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/TextFromElementReaderTest.java
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/ElementHelper.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java
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
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/util/ElementHelperTest.java
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/ElementHelper.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/ElementHelper.java?rev=947712&r1=947711&r2=947712&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/ElementHelper.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/ElementHelper.java Mon May 24 16:50:08 2010
@@ -31,7 +31,7 @@ import org.apache.axiom.om.ds.ByteArrayD
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.soap.SOAPHeaderBlock;
-import org.apache.axiom.util.stax.TextFromElementReader;
+import org.apache.axiom.util.stax.XMLStreamReaderUtils;
import org.apache.axiom.util.stax.xop.XOPUtils;
import javax.xml.namespace.QName;
@@ -243,8 +243,11 @@ public class ElementHelper {
}
// In all other cases, extract the data from the XMLStreamReader
try {
- return new TextFromElementReader(cache ? element.getXMLStreamReader()
- : element.getXMLStreamReaderWithoutCaching());
+ XMLStreamReader reader = element.getXMLStreamReader(cache);
+ if (reader.getEventType() == XMLStreamReader.START_DOCUMENT) {
+ reader.next();
+ }
+ return XMLStreamReaderUtils.getElementTextAsStream(reader, true);
} catch (XMLStreamException ex) {
throw new OMException(ex);
}
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java?rev=947712&r1=947711&r2=947712&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java Mon May 24 16:50:08 2010
@@ -25,8 +25,6 @@ import java.io.Reader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
-import org.apache.axiom.om.OMException;
-
/**
* {@link Reader} implementation that extracts the text nodes from an element given by an
* {@link XMLStreamReader}. The expected input is a document with only a document
@@ -45,8 +43,10 @@ import org.apache.axiom.om.OMException;
* {@link org.apache.axiom.om.util.ElementHelper#getTextAsStream(org.apache.axiom.om.OMElement)}
* should be called to get the most efficient stream implementation for a given an element.
*/
-public class TextFromElementReader extends Reader {
+// This class has package access -> use XMLStreamReaderUtils#getElementTextAsStream
+class TextFromElementReader extends Reader {
private final XMLStreamReader stream;
+ private final boolean allowNonTextChildren;
/**
* Flag indicating that we have reached the end of the document and that the underlying
@@ -66,25 +66,9 @@ public class TextFromElementReader exten
*/
private int sourceStart = -1;
- /**
- * Constructor.
- *
- * @param stream
- * the stream to extract the text nodes from
- * @throws IllegalStateException
- * if the stream doesn't start with the expected events
- * @throws XMLStreamException
- * if there was a parser error when attempting to position the
- * stream to the right event
- */
- public TextFromElementReader(XMLStreamReader stream) throws XMLStreamException {
+ TextFromElementReader(XMLStreamReader stream, boolean allowNonTextChildren) {
this.stream = stream;
- if (stream.getEventType() != XMLStreamReader.START_DOCUMENT) {
- throw new IllegalStateException("Expected START_DOCUMENT as first event from parser");
- }
- if (stream.next() != XMLStreamReader.START_ELEMENT) {
- throw new IllegalStateException("Expected START_ELEMENT event");
- }
+ this.allowNonTextChildren = allowNonTextChildren;
}
public int read(char[] cbuf, int off, int len) throws IOException {
@@ -106,18 +90,16 @@ public class TextFromElementReader exten
}
break;
case XMLStreamReader.START_ELEMENT:
- skipDepth++;
+ if (allowNonTextChildren) {
+ skipDepth++;
+ } else {
+ throw new IOException("Unexpected START_ELEMENT event");
+ }
break;
case XMLStreamReader.END_ELEMENT:
if (skipDepth == 0) {
- if (stream.next() == XMLStreamReader.END_DOCUMENT) {
- endOfStream = true;
- stream.close();
- return read == 0 ? -1 : read;
- } else {
- throw new IOException(
- "End of document expected after element");
- }
+ endOfStream = true;
+ return read == 0 ? -1 : read;
} else {
skipDepth--;
}
@@ -136,22 +118,11 @@ public class TextFromElementReader exten
}
}
} catch (XMLStreamException ex) {
- IOException ex2 = new IOException("Got an exception from the underlying parser " +
- "while reading the content of an element");
- ex2.initCause(ex);
- throw ex2;
+ throw new XMLStreamIOException(ex);
}
}
public void close() throws IOException {
- if (!endOfStream) {
- try {
- stream.close();
- } catch (XMLStreamException ex) {
- IOException ex2 = new IOException("Error when trying to close underlying parser");
- ex2.initCause(ex);
- throw ex2;
- }
- }
+ // Do nothing
}
}
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=947712&r1=947711&r2=947712&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 Mon May 24 16:50:08 2010
@@ -20,6 +20,7 @@
package org.apache.axiom.util.stax;
import java.io.IOException;
+import java.io.Reader;
import java.io.Writer;
import javax.activation.DataHandler;
@@ -149,6 +150,34 @@ public class XMLStreamReaderUtils {
}
/**
+ * Get the text content of the current element as a {@link Reader} object.
+ *
+ * @param reader
+ * The XML stream reader to read the element text from. The reader must be positioned
+ * on a {@link XMLStreamConstants#START_ELEMENT} event.
+ * @param allowNonTextChildren
+ * If set to <code>true</code>, non text child nodes are allowed and skipped. If set
+ * to <code>false</code> only text nodes are allowed and the presence of any other
+ * type of child node will trigger an exception.
+ * @return The reader from which the element text can be read. After the reader has reported the
+ * end of the stream, the XML stream reader will be positioned on the
+ * {@link XMLStreamConstants#END_ELEMENT} event corresponding to the initial
+ * {@link XMLStreamConstants#START_ELEMENT} event. Calling {@link Reader#close()} on the
+ * returned reader has no effect. Any parser exception will be reported by the reader
+ * using {@link XMLStreamIOException}.
+ * @throws IllegalStateException
+ * if the XML stream reader is not positioned on a
+ * {@link XMLStreamConstants#START_ELEMENT} event
+ */
+ public static Reader getElementTextAsStream(XMLStreamReader reader,
+ boolean allowNonTextChildren) {
+ if (reader.getEventType() != XMLStreamReader.START_ELEMENT) {
+ throw new IllegalStateException("Reader must be on a START_ELEMENT event");
+ }
+ return new TextFromElementReader(reader, allowNonTextChildren);
+ }
+
+ /**
* Searches the wrapper and delegate classes to find the original {@link XMLStreamReader}.
* This method should only be used when a consumer of Axiom really needs to
* access the original stream reader.
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=947712&r1=947711&r2=947712&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 Mon May 24 16:50:08 2010
@@ -18,6 +18,8 @@
*/
package org.apache.axiom.util.stax;
+import java.io.IOException;
+import java.io.Reader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Random;
@@ -185,4 +187,31 @@ public class XMLStreamReaderUtilsTest ex
reader.close();
}
}
+
+ public void testGetElementTextAsStream() throws Exception {
+ XMLStreamReader reader = StAXUtils.createXMLStreamReader(new StringReader("<a>test</a>"));
+ reader.next();
+ Reader in = XMLStreamReaderUtils.getElementTextAsStream(reader, false);
+ assertEquals("test", IOUtils.toString(in));
+ assertEquals(XMLStreamReader.END_ELEMENT, reader.getEventType());
+ }
+
+ public void testGetElementTextAsStreamWithAllowedNonTextChildren() throws Exception {
+ XMLStreamReader reader = StAXUtils.createXMLStreamReader(new StringReader("<a>xxx<b>yyy</b>zzz</a>"));
+ reader.next();
+ Reader in = XMLStreamReaderUtils.getElementTextAsStream(reader, true);
+ assertEquals("xxxzzz", IOUtils.toString(in));
+ }
+
+ public void testGetElementTextAsStreamWithForbiddenNonTextChildren() throws Exception {
+ XMLStreamReader reader = StAXUtils.createXMLStreamReader(new StringReader("<a>xxx<b>yyy</b>zzz</a>"));
+ reader.next();
+ Reader in = XMLStreamReaderUtils.getElementTextAsStream(reader, false);
+ try {
+ IOUtils.toString(in);
+ fail("Expected exception");
+ } catch (IOException ex) {
+ // Expected
+ }
+ }
}
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/util/ElementHelperTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/util/ElementHelperTest.java?rev=947712&r1=947711&r2=947712&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/util/ElementHelperTest.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/util/ElementHelperTest.java Mon May 24 16:50:08 2010
@@ -48,7 +48,6 @@ import org.apache.axiom.om.util.ElementH
import org.apache.axiom.testutils.activation.RandomDataSource;
import org.apache.axiom.testutils.io.CharacterStreamComparator;
import org.apache.axiom.testutils.io.IOTestUtils;
-import org.apache.axiom.util.stax.TextFromElementReader;
import org.apache.commons.io.IOUtils;
public class ElementHelperTest extends TestCase {
@@ -63,7 +62,7 @@ public class ElementHelperTest extends T
public void testGetTextAsStreamWithNonTextChildren() throws Exception {
OMElement element = AXIOMUtil.stringToOM("<a>A<b>B</b>C</a>");
- Reader in = new TextFromElementReader(element.getXMLStreamReader());
+ Reader in = ElementHelper.getTextAsStream(element, true);
assertEquals(element.getText(), IOUtils.toString(in));
}