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/04/25 21:06:27 UTC

svn commit: r937856 - in /webservices/commons/trunk/modules/axiom/modules/axiom-api/src: main/java/org/apache/axiom/om/util/ main/java/org/apache/axiom/util/stax/ test/java/org/apache/axiom/util/stax/

Author: veithen
Date: Sun Apr 25 19:06:27 2010
New Revision: 937856

URL: http://svn.apache.org/viewvc?rev=937856&view=rev
Log:
WSCOMMONS-452: Moved some code that was intended for inclusion into Axiom.

Added:
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java
      - copied, changed from r909787, axis/axis2/java/transports/trunk/modules/base/src/main/java/org/apache/axis2/format/TextFromElementReader.java
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/TextFromElementReaderTest.java
      - copied, changed from r909787, axis/axis2/java/transports/trunk/modules/base/src/test/java/org/apache/axis2/format/TextFromElementReaderTest.java
Modified:
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/ElementHelper.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=937856&r1=937855&r2=937856&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 Sun Apr 25 19:06:27 2010
@@ -25,16 +25,24 @@ import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.OMSourcedElement;
+import org.apache.axiom.om.OMText;
 import org.apache.axiom.om.ds.ByteArrayDataSource;
 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 javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
+import java.io.Writer;
 import java.net.URLDecoder;
 import java.util.Iterator;
 
@@ -219,4 +227,74 @@ public class ElementHelper {
         
         return block;
     }
+    
+    /**
+     * Returns a stream representing the concatenation of the text nodes that are children of a
+     * given element.
+     * The stream returned by this method produces exactly the same character sequence as the
+     * the stream created by the following expression:
+     * <pre>new StringReader(element.getText())</pre>
+     * The difference is that the stream implementation returned by this method is guaranteed
+     * to have constant memory usage and is optimized for performance.
+     * 
+     * @param element the element to read the text nodes from
+     * @param cache whether to enable caching when accessing the element
+     * @return a stream representing the concatenation of the text nodes
+     * 
+     * @see OMElement#getText()
+     */
+    public static Reader getTextAsStream(OMElement element, boolean cache) {
+        // If the element is not an OMSourcedElement and has not more than one child, then the most
+        // efficient way to get the Reader is to build a StringReader
+        if (!(element instanceof OMSourcedElement) && (!cache || element.isComplete())) {
+            OMNode child = element.getFirstOMChild();
+            if (child == null) {
+                return new StringReader("");
+            } else if (child.getNextOMSibling() == null) {
+                return new StringReader(child instanceof OMText ? ((OMText)child).getText() : "");
+            }
+        }
+        // In all other cases, extract the data from the XMLStreamReader
+        return new TextFromElementReader(cache ? element.getXMLStreamReader()
+                : element.getXMLStreamReaderWithoutCaching());
+    }
+    
+    /**
+     * Write the content of the text nodes that are children of a given element to a
+     * {@link Writer}.
+     * If <code>cache</code> is true, this method has the same effect as the following instruction:
+     * <pre>out.write(element.getText())</pre>
+     * The difference is that this method is guaranteed to have constant memory usage and is
+     * optimized for performance.
+     * 
+     * @param element the element to read the text nodes from
+     * @param out the stream to write the content to
+     * @param cache whether to enable caching when accessing the element
+     * @throws XMLStreamException if an error occurs when reading from the element
+     * @throws IOException if an error occurs when writing to the stream
+     * 
+     * @see OMElement#getText()
+     */
+    public static void writeTextTo(OMElement element, Writer out, boolean cache)
+            throws XMLStreamException, IOException {
+        
+        XMLStreamReader reader = cache ? element.getXMLStreamReader()
+                : element.getXMLStreamReaderWithoutCaching();
+        int depth = 0;
+        while (reader.hasNext()) {
+            switch (reader.next()) {
+                case XMLStreamReader.CHARACTERS:
+                case XMLStreamReader.CDATA:
+                    if (depth == 1) {
+                        out.write(reader.getText());
+                    }
+                    break;
+                case XMLStreamReader.START_ELEMENT:
+                    depth++;
+                    break;
+                case XMLStreamReader.END_ELEMENT:
+                    depth--;
+            }
+        }
+    }
 }

Copied: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java (from r909787, axis/axis2/java/transports/trunk/modules/base/src/main/java/org/apache/axis2/format/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?p2=webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java&p1=axis/axis2/java/transports/trunk/modules/base/src/main/java/org/apache/axis2/format/TextFromElementReader.java&r1=909787&r2=937856&rev=937856&view=diff
==============================================================================
--- axis/axis2/java/transports/trunk/modules/base/src/main/java/org/apache/axis2/format/TextFromElementReader.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/TextFromElementReader.java Sun Apr 25 19:06:27 2010
@@ -1,23 +1,23 @@
 /*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
-package org.apache.axis2.format;
+package org.apache.axiom.util.stax;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -44,8 +44,6 @@ import org.apache.axiom.om.OMException;
  * Note that this class should in general not be used directly. Instead, 
  * {@link ElementHelper#getTextAsStream(org.apache.axiom.om.OMElement)}
  * should be called to get the most efficient stream implementation for a given an element.
- * <p>
- * NOTICE: The code in this class will be moved to Axiom (or somewhere else). Use with care!
  */
 public class TextFromElementReader extends Reader {
     private final XMLStreamReader stream;
@@ -88,7 +86,6 @@ public class TextFromElementReader exten
         }
     }
 
-    @Override
     public int read(char[] cbuf, int off, int len) throws IOException {
         if (endOfStream) {
             return -1;
@@ -145,7 +142,6 @@ public class TextFromElementReader exten
         }
     }
 
-    @Override
     public void close() throws IOException {
         if (!endOfStream) {
             try {

Copied: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/TextFromElementReaderTest.java (from r909787, axis/axis2/java/transports/trunk/modules/base/src/test/java/org/apache/axis2/format/TextFromElementReaderTest.java)
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/TextFromElementReaderTest.java?p2=webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/TextFromElementReaderTest.java&p1=axis/axis2/java/transports/trunk/modules/base/src/test/java/org/apache/axis2/format/TextFromElementReaderTest.java&r1=909787&r2=937856&rev=937856&view=diff
==============================================================================
--- axis/axis2/java/transports/trunk/modules/base/src/test/java/org/apache/axis2/format/TextFromElementReaderTest.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/TextFromElementReaderTest.java Sun Apr 25 19:06:27 2010
@@ -1,23 +1,23 @@
 /*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
 
-package org.apache.axis2.format;
+package org.apache.axiom.util.stax;
 
 import java.io.Reader;
 import java.io.StringReader;
@@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamReader;
 import junit.framework.TestCase;
 
 import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axiom.util.stax.TextFromElementReader;
 import org.apache.commons.io.IOUtils;
 
 // Note: this class only contains a single test method because most aspects of TextFromElementReader