Skip to content

Commit

Permalink
Fix for Issue #67 (#186)
Browse files Browse the repository at this point in the history
  • Loading branch information
Orbisman authored Dec 21, 2023
1 parent 8b49745 commit 819c896
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/main/java/com/ctc/wstx/dtd/MinimalDTDReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,8 @@ protected void skipCommentContent()
if (c == '-') {
return;
}
} else if (c == '\n' || c == '\r') {
}
if (c == '\n' || c == '\r') {
skipCRLF(c);
}
}
Expand Down
9 changes: 8 additions & 1 deletion src/test/java/wstxtest/stream/TestComments.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -42,13 +43,19 @@ public void runTest(XMLInputFactory f, InputConfigIterator it)
+"<!-- Longer comment that contains quite a bit of content\n"
+" so that we can check boundary - conditions too... -->"
+"<!----><!-- and entities: &amp; &#12;&#x1d; -->\n"
+"<!--\n"
+"Comment spanning mulitple lines with no spaces\n"
+"-->\n"
+"<!-- \n"
+" Comment spanning mulitple lines with spaces \n"
+" -->\n"
+"</root>";
XMLStreamReader sr = constructStreamReader(f, XML);
streamAndCheck(sr, it, XML, XML, false);
// Let's also test real streaming...
sr = constructStreamReader(f, XML);
streamAndCheck(sr, it, XML, XML, true);
}

}

136 changes: 132 additions & 4 deletions src/test/java/wstxtest/stream/TestLocation.java
Original file line number Diff line number Diff line change
@@ -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;

/**
Expand Down Expand Up @@ -153,7 +162,7 @@ public void testOffsetIncrementing()
doTestOffset(true, false); // coalesce
doTestOffset(true, true); // coalesce
}

/*
/////////////////////////////////////////////////////////
// Helper methods:
Expand Down Expand Up @@ -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 = "<?xml version=\"1.0\"?>\n" +
"<!DOCTYPE menu [\n" +
"<!--\n" +
"Some comment with no spaces\n" +
"-->\n" +
"<!ELEMENT menu (modulo)* >\n" +
"]>\n" +
"<menu value=\"foo\"></menu>";

String input2 = "<?xml version=\"1.0\"?>\n" +
"<!DOCTYPE menu [\n" +
"<!-- \n" +
" Some comment with spaces\n" +
" -->\n" +
"<!ELEMENT menu (modulo)* >\n" +
"]>\n" +
"<menu value=\"foo\"></menu>";

List<String> 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<String> doTestCommentLocation(String input, boolean supportDtd)
throws XMLStreamException
{
List<String> lstLineData = new ArrayList<String>();
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();
}
}

0 comments on commit 819c896

Please sign in to comment.