diff --git a/src/main/java/com/ctc/wstx/dtd/MinimalDTDReader.java b/src/main/java/com/ctc/wstx/dtd/MinimalDTDReader.java index e609ca96..9ff746d0 100644 --- a/src/main/java/com/ctc/wstx/dtd/MinimalDTDReader.java +++ b/src/main/java/com/ctc/wstx/dtd/MinimalDTDReader.java @@ -320,7 +320,8 @@ protected void skipCommentContent() if (c == '-') { return; } - } else if (c == '\n' || c == '\r') { + } + if (c == '\n' || c == '\r') { skipCRLF(c); } } diff --git a/src/test/java/wstxtest/stream/TestComments.java b/src/test/java/wstxtest/stream/TestComments.java index 9e9aadea..cf7575c4 100644 --- a/src/test/java/wstxtest/stream/TestComments.java +++ b/src/test/java/wstxtest/stream/TestComments.java @@ -31,6 +31,7 @@ public void testValid() /** * Method called via input config iterator, with all possible * configurations + * - Added additional comment formats for issue [ WSTX-67 ] */ @Override public void runTest(XMLInputFactory f, InputConfigIterator it) @@ -42,6 +43,12 @@ public void runTest(XMLInputFactory f, InputConfigIterator it) +"" +"\n" + +"\n" + +"\n" +""; XMLStreamReader sr = constructStreamReader(f, XML); streamAndCheck(sr, it, XML, XML, false); @@ -49,6 +56,6 @@ public void runTest(XMLInputFactory f, InputConfigIterator it) sr = constructStreamReader(f, XML); streamAndCheck(sr, it, XML, XML, true); } - + } diff --git a/src/test/java/wstxtest/stream/TestLocation.java b/src/test/java/wstxtest/stream/TestLocation.java index 73a42bdf..6f3afa6e 100644 --- a/src/test/java/wstxtest/stream/TestLocation.java +++ b/src/test/java/wstxtest/stream/TestLocation.java @@ -1,10 +1,19 @@ package wstxtest.stream; -import java.io.*; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; import java.util.Random; -import javax.xml.stream.*; -import org.codehaus.stax2.*; +import javax.xml.stream.Location; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.codehaus.stax2.XMLStreamReader2; + import com.ctc.wstx.stax.WstxInputFactory; /** @@ -153,7 +162,7 @@ public void testOffsetIncrementing() doTestOffset(true, false); // coalesce doTestOffset(true, true); // coalesce } - + /* ///////////////////////////////////////////////////////// // Helper methods: @@ -199,4 +208,123 @@ public void doTestOffset(boolean coal, boolean readAll) } } } + + /** + * This test was added due to bug [WSTX-67]: Wrong line number for XML event + * location in elements following comment with no spaces, split across + * multiple lines. + */ + public void testLocationAfterComment() + throws XMLStreamException + { + String input1 = "\n" + + "\n" + + "\n" + + "]>\n" + + ""; + + String input2 = "\n" + + "\n" + + "\n" + + "]>\n" + + ""; + + List lstLineData = doTestCommentLocation(input1, false); + + assertEquals(5, lstLineData.size()); + assertEquals("[7 - START_DOCUMENT] {L=1;C=1;O=0;}", lstLineData.get(0)); + assertEquals("[11 - DTD] {L=2;C=1;O=22;}", lstLineData.get(1)); + assertEquals("[1 - START_ELEMENT] {L=8;C=1;O=106;}", lstLineData.get(2)); + assertEquals("[2 - END_ELEMENT] {L=8;C=19;O=124;}", lstLineData.get(3)); + assertEquals("[8 - END_DOCUMENT] {L=8;C=26;O=131;}", lstLineData.get(4)); + + lstLineData = doTestCommentLocation(input1, true); + + assertEquals(5, lstLineData.size()); + assertEquals("[7 - START_DOCUMENT] {L=1;C=1;O=0;}", lstLineData.get(0)); + assertEquals("[11 - DTD] {L=2;C=1;O=22;}", lstLineData.get(1)); + assertEquals("[1 - START_ELEMENT] {L=8;C=1;O=106;}", lstLineData.get(2)); + assertEquals("[2 - END_ELEMENT] {L=8;C=19;O=124;}", lstLineData.get(3)); + assertEquals("[8 - END_DOCUMENT] {L=8;C=26;O=131;}", lstLineData.get(4)); + + lstLineData = doTestCommentLocation(input2, false); + + assertEquals(5, lstLineData.size()); + assertEquals("[7 - START_DOCUMENT] {L=1;C=1;O=0;}", lstLineData.get(0)); + assertEquals("[11 - DTD] {L=2;C=1;O=22;}", lstLineData.get(1)); + assertEquals("[1 - START_ELEMENT] {L=8;C=1;O=107;}", lstLineData.get(2)); + assertEquals("[2 - END_ELEMENT] {L=8;C=19;O=125;}", lstLineData.get(3)); + assertEquals("[8 - END_DOCUMENT] {L=8;C=26;O=132;}", lstLineData.get(4)); + + lstLineData = doTestCommentLocation(input2, true); + + assertEquals(5, lstLineData.size()); + assertEquals("[7 - START_DOCUMENT] {L=1;C=1;O=0;}", lstLineData.get(0)); + assertEquals("[11 - DTD] {L=2;C=1;O=22;}", lstLineData.get(1)); + assertEquals("[1 - START_ELEMENT] {L=8;C=1;O=107;}", lstLineData.get(2)); + assertEquals("[2 - END_ELEMENT] {L=8;C=19;O=125;}", lstLineData.get(3)); + assertEquals("[8 - END_DOCUMENT] {L=8;C=26;O=132;}", lstLineData.get(4)); + } + + public List doTestCommentLocation(String input, boolean supportDtd) + throws XMLStreamException + { + List lstLineData = new ArrayList(); + Reader reader = new StringReader(input); + + // Force woodstox factory instance + XMLInputFactory f = new com.ctc.wstx.stax.WstxInputFactory(); + + f.setProperty(XMLInputFactory.SUPPORT_DTD, supportDtd); + f.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); + f.setProperty(XMLInputFactory.IS_VALIDATING, false); + // Should shrink it to get faster convergence + XMLStreamReader rdr = f.createXMLStreamReader(reader); + + lstLineData.add(getLocation(rdr)); + while (rdr.hasNext()) { + rdr.next(); + lstLineData.add(getLocation(rdr)); + } + + return lstLineData; + } + + private String getLocation(XMLStreamReader xmlReader) + { + int eventType = xmlReader.getEventType(); + StringBuilder sb = new StringBuilder(); + sb.append("[").append(eventType).append(" - "); + + switch (eventType) { + case XMLStreamReader.ENTITY_REFERENCE: sb.append("ENTITY_REFERENCE"); break; + case XMLStreamReader.COMMENT: sb.append("COMMENT"); break; + case XMLStreamReader.PROCESSING_INSTRUCTION: sb.append("PROCESSING_INSTRUCTION"); break; + case XMLStreamReader.CHARACTERS: sb.append("CHARACTERS"); break; + case XMLStreamReader.START_ELEMENT: sb.append("START_ELEMENT"); break; + case XMLStreamConstants.END_ELEMENT: sb.append("END_ELEMENT"); break; + case XMLStreamConstants.CDATA: sb.append("CDATA"); break; + case XMLStreamConstants.DTD: sb.append("DTD"); break; + case XMLStreamReader.END_DOCUMENT: sb.append("END_DOCUMENT"); break; + case XMLStreamReader.START_DOCUMENT: sb.append("START_DOCUMENT"); break; + default: sb.append("unknown (" + eventType + ")"); break; + } + sb.append("] {"); + + Location loc = xmlReader.getLocation(); + sb.append("L=").append(loc.getLineNumber()).append(";"); + sb.append("C=").append(loc.getColumnNumber()).append(";"); + sb.append("O=").append(loc.getCharacterOffset()).append(";"); + sb.append("}"); + + //System.out.println(sb.toString()); + + return sb.toString(); + } }