From 3b17f6b01ab010b8d37d845bc177458a6c472e36 Mon Sep 17 00:00:00 2001 From: Nico Kutscherauer Date: Sun, 8 Dec 2019 03:09:06 +0100 Subject: [PATCH 1/2] Adds unit test case for issue#91 --- .../stax2/stream/TestExtLocationInfo.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/test/java/stax2/stream/TestExtLocationInfo.java diff --git a/src/test/java/stax2/stream/TestExtLocationInfo.java b/src/test/java/stax2/stream/TestExtLocationInfo.java new file mode 100644 index 00000000..8f31dfe9 --- /dev/null +++ b/src/test/java/stax2/stream/TestExtLocationInfo.java @@ -0,0 +1,129 @@ +package stax2.stream; + +import org.codehaus.stax2.LocationInfo; +import org.codehaus.stax2.XMLStreamReader2; +import stax2.BaseStax2Test; + +import javax.xml.stream.*; +import javax.xml.transform.stream.StreamSource; +import java.io.StringReader; + +/** + * Set of unit tests that checks that the {@link LocationInfo} implementation + * works as expected, provides proper values or -1 to indicate "don't know". + */ +public class TestExtLocationInfo + extends BaseStax2Test +{ + final static String URI = "main.xml"; + final static String INCL_URI = "include.xml"; + /** + * This document fragment tries ensure that external entities works ok + */ + final static String TEST_EXT_ENT = + "" + +"\n" // fc: 38; row 2 + +"]>\n" // fc: 74; row 3 + +"
" // fc: 77; row 4 + +"&incl;" // fc: 83; row 4 + +"
"; // fc: 89; row 4 + // EOF, fc: 98; row 7 + + /** + * This document fragment is used to be included from TEST_EXT_ENT + */ + final static String TEST_EXT_ENT_INCL = + ""; // first char: 0; row 1 + // EOF, fc: 40; row 2 + + + + public void testLocationsWithExtEntity() + throws XMLStreamException + { + + XMLResolver resolver = new XMLResolver() { + @Override + public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException { + if (INCL_URI.equals(systemID)){ + StreamSource src = new StreamSource(new StringReader(TEST_EXT_ENT_INCL), systemID); + return src; + } + fail("Unexpected systemID to resolve: " + systemID); + return null; + } + }; + XMLStreamReader2 sr = getReader(TEST_EXT_ENT, URI, resolver); + + assertRow(sr, 1, 1); + + assertTokenType(DTD, sr.next()); + assertTokenType(START_ELEMENT, sr.next()); + assertEquals("main", sr.getLocalName()); + assertRow(sr, 4, 4, URI); + + assertTokenType(START_ELEMENT, sr.next()); + assertEquals("include", sr.getLocalName()); + assertRow(sr, 1, 1, INCL_URI); + + + + assertTokenType(END_ELEMENT, sr.next()); + assertRow(sr, 1, 1, INCL_URI); + + + assertTokenType(END_ELEMENT, sr.next()); + assertRow(sr, 4, 4, URI); + + sr.close(); + } + + /* + //////////////////////////////////////// + // Private methods + //////////////////////////////////////// + */ + + private void assertRow(XMLStreamReader2 sr, int startRow, int endRow, String systemId) + throws XMLStreamException + { + LocationInfo li = sr.getLocationInfo(); + Location startLoc = li.getStartLocation(); + assertEquals("Incorrect starting systemID for event " + tokenTypeDesc(sr.getEventType()), systemId, startLoc.getSystemId()); + Location endLoc = li.getEndLocation(); + assertEquals("Incorrect ending systemID for event " + tokenTypeDesc(sr.getEventType()), systemId, endLoc.getSystemId()); + assertRow(sr, startRow, endRow); + } + private void assertRow(XMLStreamReader2 sr, int startRow, int endRow) + throws XMLStreamException + { + LocationInfo li = sr.getLocationInfo(); + Location startLoc = li.getStartLocation(); + assertEquals("Incorrect starting row for event "+tokenTypeDesc(sr.getEventType()), startRow, startLoc.getLineNumber()); + Location endLoc = li.getEndLocation(); + assertEquals("Incorrect ending row for event "+tokenTypeDesc(sr.getEventType()), endRow, endLoc.getLineNumber()); + } + + + private XMLStreamReader2 getReader(String contents, String systemId, XMLResolver xmlResolver) + throws XMLStreamException + { + XMLInputFactory f = getInputFactory(); + + if(xmlResolver != null){ + f.setXMLResolver(xmlResolver); + } + + setCoalescing(f, false); // shouldn't really matter + setNamespaceAware(f, true); + setSupportExternalEntities(f, true); + setReplaceEntities(f, true); + + + // No need to validate, just need entities + setValidating(f, false); + + return (XMLStreamReader2) f.createXMLStreamReader(new StreamSource(new StringReader(contents), systemId)); + } +} From e07296347916aba2e594f0a753f4a44529a6db5d Mon Sep 17 00:00:00 2001 From: Nico Kutscherauer Date: Sun, 8 Dec 2019 16:30:18 +0100 Subject: [PATCH 2/2] Tests offsets instead of rows in TextExtLocationInfo #91 --- .../stax2/stream/TestExtLocationInfo.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test/java/stax2/stream/TestExtLocationInfo.java b/src/test/java/stax2/stream/TestExtLocationInfo.java index 8f31dfe9..ea78aa61 100644 --- a/src/test/java/stax2/stream/TestExtLocationInfo.java +++ b/src/test/java/stax2/stream/TestExtLocationInfo.java @@ -35,7 +35,7 @@ public class TestExtLocationInfo */ final static String TEST_EXT_ENT_INCL = ""; // first char: 0; row 1 - // EOF, fc: 40; row 2 + // EOF, fc: 19; row 1 @@ -56,25 +56,25 @@ public Object resolveEntity(String publicID, String systemID, String baseURI, St }; XMLStreamReader2 sr = getReader(TEST_EXT_ENT, URI, resolver); - assertRow(sr, 1, 1); + assertOffset(sr, 0, 21); assertTokenType(DTD, sr.next()); assertTokenType(START_ELEMENT, sr.next()); assertEquals("main", sr.getLocalName()); - assertRow(sr, 4, 4, URI); + assertOffset(sr, 77, 83, URI); assertTokenType(START_ELEMENT, sr.next()); assertEquals("include", sr.getLocalName()); - assertRow(sr, 1, 1, INCL_URI); + assertOffset(sr, 0, 9, INCL_URI); assertTokenType(END_ELEMENT, sr.next()); - assertRow(sr, 1, 1, INCL_URI); + assertOffset(sr, 9, 19, INCL_URI); assertTokenType(END_ELEMENT, sr.next()); - assertRow(sr, 4, 4, URI); + assertOffset(sr, 89, 96, URI); sr.close(); } @@ -85,7 +85,7 @@ public Object resolveEntity(String publicID, String systemID, String baseURI, St //////////////////////////////////////// */ - private void assertRow(XMLStreamReader2 sr, int startRow, int endRow, String systemId) + private void assertOffset(XMLStreamReader2 sr, int startOffset, int endOffset, String systemId) throws XMLStreamException { LocationInfo li = sr.getLocationInfo(); @@ -93,16 +93,16 @@ private void assertRow(XMLStreamReader2 sr, int startRow, int endRow, String sys assertEquals("Incorrect starting systemID for event " + tokenTypeDesc(sr.getEventType()), systemId, startLoc.getSystemId()); Location endLoc = li.getEndLocation(); assertEquals("Incorrect ending systemID for event " + tokenTypeDesc(sr.getEventType()), systemId, endLoc.getSystemId()); - assertRow(sr, startRow, endRow); + assertOffset(sr, startOffset, endOffset); } - private void assertRow(XMLStreamReader2 sr, int startRow, int endRow) + private void assertOffset(XMLStreamReader2 sr, int startOffset, int endOffset) throws XMLStreamException { LocationInfo li = sr.getLocationInfo(); Location startLoc = li.getStartLocation(); - assertEquals("Incorrect starting row for event "+tokenTypeDesc(sr.getEventType()), startRow, startLoc.getLineNumber()); + assertEquals("Incorrect starting offset for event "+tokenTypeDesc(sr.getEventType()), startOffset, startLoc.getCharacterOffset()); Location endLoc = li.getEndLocation(); - assertEquals("Incorrect ending row for event "+tokenTypeDesc(sr.getEventType()), endRow, endLoc.getLineNumber()); + assertEquals("Incorrect ending offset for event "+tokenTypeDesc(sr.getEventType()), endOffset, endLoc.getCharacterOffset()); }