Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changes / fixes for Issue #67 #186

Merged
merged 2 commits into from
Dec 21, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/java/com/ctc/wstx/dtd/MinimalDTDReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ protected void skipCommentContent()
if (c == '-') {
return;
}
if (c == '\n') skipCRLF(c);
cowtowncoder marked this conversation as resolved.
Show resolved Hide resolved
} else 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();
}
}