Author: veithen
Date: Sat Dec  6 08:26:08 2008
New Revision: 724004

URL: http://svn.apache.org/viewvc?rev=724004&view=rev
Log:
WSCOMMONS-393: Fixed the getText* methods to make sure that the behavior is 
consistent, namely that getText() and getTextCharacters() return the same data. 
In particular getTextCharacters() and related methods now work correctly for 
comment nodes. Also fixed an issue in getTextCharacters(int, char[], int, int) 
that triggered ArrayOutOfBoundsExceptions and caused invalid values (for the 
number of copied chars) to be returned.

Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/impl/llom/OMStAXWrapperTest.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java?rev=724004&r1=724003&r2=724004&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMStAXWrapper.java
 Sat Dec  6 08:26:08 2008
@@ -358,14 +358,12 @@
      * @see javax.xml.stream.XMLStreamReader#getTextLength()
      */
     public int getTextLength() {
-        int returnLength = 0;
         if (parser != null) {
-            returnLength = parser.getTextLength();
+            return parser.getTextLength();
         } else {
-            OMText textNode = (OMText) getNode();
-            returnLength = textNode.getText().length();
+            String text = getTextFromNode();
+            return text == null ? 0 : text.length();
         }
-        return returnLength;
     }
 
     /**
@@ -373,41 +371,42 @@
      * @see javax.xml.stream.XMLStreamReader#getTextStart()
      */
     public int getTextStart() {
-        int returnLength = 0;
         if (parser != null) {
-            returnLength = parser.getTextStart();
+            return parser.getTextStart();
+        } else {
+            // getTextCharacters always returns a new char array and the start
+            // index is therefore always 0
+            return 0;
         }
-
-        // Note - this has no relevant method in the OM
-        return returnLength;
     }
 
     /**
-     * @param i
-     * @param chars
-     * @param i1
-     * @param i2
+     * @param sourceStart
+     * @param target
+     * @param targetStart
+     * @param length
      * @return Returns int.
      * @throws XMLStreamException
      * @see javax.xml.stream.XMLStreamReader#getTextCharacters(int, char[], 
int, int)
      */
-    public int getTextCharacters(int i, char[] chars, int i1, int i2)
+    public int getTextCharacters(int sourceStart, char[] target, int 
targetStart, int length)
             throws XMLStreamException {
-        int returnLength = 0;
         if (parser != null) {
             try {
-                returnLength = parser.getTextCharacters(i, chars, i1, i2);
+                return parser.getTextCharacters(sourceStart, target, 
targetStart, length);
             } catch (XMLStreamException e) {
                 throw new OMStreamingException(e);
             }
         } else {
-            if (hasText()) {
-                OMText textNode = (OMText) getNode();
-                String str = textNode.getText();
-                str.getChars(i, i + i2, chars, i1);
+            String text = getTextFromNode();
+            if (text != null) {
+                int copied = Math.min(length, text.length()-sourceStart);
+                text.getChars(sourceStart, sourceStart + copied, target, 
targetStart);
+                return copied;
+            } else {
+                return 0;
             }
         }
-        return returnLength;
     }
 
     /**
@@ -415,17 +414,12 @@
      * @see javax.xml.stream.XMLStreamReader#getTextCharacters()
      */
     public char[] getTextCharacters() {
-        char[] returnArray = null;
         if (parser != null) {
-            returnArray = parser.getTextCharacters();
+            return parser.getTextCharacters();
         } else {
-            if (hasText()) {
-                OMText textNode = (OMText) getNode();
-                String str = textNode.getText();
-                returnArray = str.toCharArray();
-            }
+            String text = getTextFromNode();
+            return text == null ? null : text.toCharArray();
         }
-        return returnArray;
     }
 
     /**
@@ -433,19 +427,23 @@
      * @see javax.xml.stream.XMLStreamReader#getText()
      */
     public String getText() {
-        String returnString = null;
         if (parser != null) {
-            returnString = parser.getText();
+            return parser.getText();
         } else {
-            if (hasText()) {
-                if (getNode() instanceof OMText) {
-                    returnString = ((OMText) getNode()).getText();
-                } else if (getNode() instanceof OMComment) {
-                    returnString = ((OMComment) getNode()).getValue();
-                }
+            return getTextFromNode();
+        }
+    }
+    
+    private String getTextFromNode() {
+        if (hasText()) {
+            OMNode node = getNode();
+            if (node instanceof OMText) {
+                return ((OMText)node).getText();
+            } else if (node instanceof OMComment) {
+                return ((OMComment)node).getValue();
             }
         }
-        return returnString;
+        return null;
     }
 
     /**

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/impl/llom/OMStAXWrapperTest.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/impl/llom/OMStAXWrapperTest.java?rev=724004&r1=724003&r2=724004&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/impl/llom/OMStAXWrapperTest.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/impl/llom/OMStAXWrapperTest.java
 Sat Dec  6 08:26:08 2008
@@ -33,6 +33,7 @@
 import org.apache.axiom.om.OMText;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.axiom.om.impl.llom.factory.OMLinkedListImplFactory;
+import org.apache.axiom.om.impl.llom.util.AXIOMUtil;
 import org.apache.axiom.om.util.StAXUtils;
 
 public class OMStAXWrapperTest extends TestCase {
@@ -92,4 +93,22 @@
         assertTrue(Arrays.equals("hello world".toCharArray(), 
reader2.getTextCharacters())); // WSCOMMONS-338
         assertEquals(XMLStreamReader.END_ELEMENT, reader2.next());
     }
+    
+    public void testCommentEvent() throws Exception {
+        OMStAXWrapper reader = 
(OMStAXWrapper)AXIOMUtil.stringToOM("<a><!--comment 
text--></a>").getXMLStreamReader();
+        assertEquals(XMLStreamReader.START_ELEMENT, reader.next());
+        assertEquals(XMLStreamReader.COMMENT, reader.next());
+        assertEquals("comment text", reader.getText());
+        assertEquals("comment text", new String(reader.getTextCharacters(), 
reader.getTextStart(), reader.getTextLength()));
+        StringBuffer text = new StringBuffer();
+        char[] buf = new char[5];
+        for (int sourceStart = 0; ; sourceStart += buf.length) {
+            int nCopied = reader.getTextCharacters(sourceStart, buf, 0, 
buf.length);
+            text.append(buf, 0, nCopied);
+            if (nCopied < buf.length) {
+                break;
+            }
+        }
+        assertEquals("comment text", text.toString());
+    }
 }


Reply via email to