package async;
import javax.xml.stream.XMLStreamException;
//import async.AsyncTestBase.AsyncReaderWrapper;
import com.fasterxml.aalto.AsyncByteArrayFeeder;
import com.fasterxml.aalto.AsyncByteBufferFeeder;
import com.fasterxml.aalto.AsyncXMLInputFactory;
import com.fasterxml.aalto.AsyncXMLStreamReader;
import com.fasterxml.aalto.stax.InputFactoryImpl;
public class TestDoctypeParsing extends AsyncTestBase
{
public void testSimplest() throws Exception
{
for (int spaces = 0; spaces < 3; ++spaces) {
String SPC = spaces(spaces);
_testSimplest(SPC, 1);
_testSimplest(SPC, 2);
_testSimplest(SPC, 3);
_testSimplest(SPC, 5);
_testSimplest(SPC, 11);
_testSimplest(SPC, 1000);
}
}
public void testWithSystemId() throws Exception
{
for (int spaces = 0; spaces < 3; ++spaces) {
String SPC = spaces(spaces);
_testWithIds(SPC, 1);
_testWithIds(SPC, 2);
_testWithIds(SPC, 3);
_testWithIds(SPC, 6);
_testWithIds(SPC, 900);
}
}
public void testParseFull() throws Exception
{
for (int spaces = 0; spaces < 3; ++spaces) {
String SPC = spaces(spaces);
_testFull(SPC, true, 1);
_testFull(SPC, true, 2);
_testFull(SPC, true, 3);
_testFull(SPC, true, 6);
_testFull(SPC, true, 900);
}
}
public void testSkipFull() throws Exception
{
for (int spaces = 0; spaces < 3; ++spaces) {
String SPC = spaces(spaces);
_testFull(SPC, false, 1);
_testFull(SPC, false, 2);
_testFull(SPC, false, 3);
_testFull(SPC, false, 6);
_testFull(SPC, false, 900);
}
}
public void testInvalidDup() throws Exception
{
for (int spaces = 0; spaces < 3; ++spaces) {
String SPC = spaces(spaces);
_testInvalidDup(SPC, 1);
_testInvalidDup(SPC, 2);
_testInvalidDup(SPC, 3);
_testInvalidDup(SPC, 6);
_testInvalidDup(SPC, 900);
}
}
/*
/**********************************************************************
/* Helper methods
/**********************************************************************
*/
private void _testSimplest(final String spaces, final int chunkSize) throws Exception
{
final String XML = spaces + "<!DOCTYPE root> <root />";
final AsyncXMLInputFactory f = new InputFactoryImpl();
//test for byte array
AsyncXMLStreamReader<AsyncByteArrayFeeder> sr_array = null;
try {
sr_array = f.createAsyncForByteArray();
final AsyncReaderWrapperForByteArray reader_array = new AsyncReaderWrapperForByteArray(sr_array, chunkSize, XML);
_testSimplest(sr_array, reader_array);
} finally {
if (sr_array != null) {
sr_array.close();
}
}
//test for byte buffer
AsyncXMLStreamReader<AsyncByteBufferFeeder> sr_buffer = null;
try {
sr_buffer = f.createAsyncForByteBuffer();
final AsyncReaderWrapperForByteBuffer reader_buffer = new AsyncReaderWrapperForByteBuffer(sr_buffer, chunkSize, XML);
_testSimplest(sr_buffer, reader_buffer);
} finally {
if (sr_buffer != null) {
sr_buffer.close();
}
}
}
private void _testSimplest(final AsyncXMLStreamReader<?> sr, final AsyncReaderWrapper reader) throws Exception
{
int t = verifyStart(reader);
assertTokenType(DTD, t);
// as per Stax API, can't call getLocalName (ugh), but Stax2 gives us this:
assertEquals("root", sr.getPrefixedName());
assertTokenType(START_ELEMENT, reader.nextToken());
assertTokenType(END_ELEMENT, reader.nextToken());
}
private void _testWithIds(final String spaces, final int chunkSize) throws Exception
{
final String PUBLIC_ID = "-//OASIS//DTD DITA Topic//EN";
final String SYSTEM_ID = "file:/topic.dtd";
final String XML = spaces + "<!DOCTYPE root PUBLIC '" + PUBLIC_ID + "' \"" + SYSTEM_ID + "\"><root/>";
final AsyncXMLInputFactory f = new InputFactoryImpl();
//test for byte array
AsyncXMLStreamReader<AsyncByteArrayFeeder> sr_array = null;
try {
sr_array = f.createAsyncForByteArray();
final AsyncReaderWrapperForByteArray reader_array = new AsyncReaderWrapperForByteArray(sr_array, chunkSize, XML);
_testWithIds(sr_array, reader_array, PUBLIC_ID, SYSTEM_ID);
} finally {
if (sr_array != null) {
sr_array.close();
}
}
//test for byte buffer
AsyncXMLStreamReader<AsyncByteBufferFeeder> sr_buffer = null;
try {
sr_buffer = f.createAsyncForByteBuffer();
final AsyncReaderWrapperForByteBuffer reader_buffer = new AsyncReaderWrapperForByteBuffer(sr_buffer, chunkSize, XML);
_testWithIds(sr_buffer, reader_buffer, PUBLIC_ID, SYSTEM_ID);
} finally {
if (sr_buffer != null) {
sr_buffer.close();
}
}
}
private void _testWithIds(final AsyncXMLStreamReader<?> sr, final AsyncReaderWrapper reader, final String PUBLIC_ID, final String SYSTEM_ID) throws Exception
{
int t = verifyStart(reader);
assertTokenType(DTD, t);
assertTokenType(DTD, sr.getEventType());
assertEquals("root", sr.getPrefixedName());
assertEquals(PUBLIC_ID, sr.getDTDInfo().getDTDPublicId());
assertEquals(SYSTEM_ID, sr.getDTDInfo().getDTDSystemId());
assertTokenType(START_ELEMENT, reader.nextToken());
assertTokenType(END_ELEMENT, reader.nextToken());
}
private void _testFull(final String spaces, final boolean checkValue, final int chunkSize) throws Exception
{
final String SYSTEM_ID = "file:/something";
final String INTERNAL_SUBSET = "<!--My dtd-->\n"
+ "<!ELEMENT html (head, body)>"
+ "<!ATTLIST head title CDATA #IMPLIED>";
String XML = spaces + "<!DOCTYPE root SYSTEM '" + SYSTEM_ID + "' [" + INTERNAL_SUBSET + "]>\n<root/>";
final AsyncXMLInputFactory f = new InputFactoryImpl();
//test for byte array
AsyncXMLStreamReader<AsyncByteArrayFeeder> sr_array = null;
try {
sr_array = f.createAsyncForByteArray();
final AsyncReaderWrapperForByteArray reader_array = new AsyncReaderWrapperForByteArray(sr_array, chunkSize, XML);
_testFull(sr_array, reader_array, checkValue, SYSTEM_ID, INTERNAL_SUBSET);
} finally {
if (sr_array != null) {
sr_array.close();
}
}
//test for byte buffer
AsyncXMLStreamReader<AsyncByteBufferFeeder> sr_buffer = null;
try {
sr_buffer = f.createAsyncForByteBuffer();
final AsyncReaderWrapperForByteBuffer reader_buffer = new AsyncReaderWrapperForByteBuffer(sr_buffer, chunkSize, XML);
_testFull(sr_buffer, reader_buffer, checkValue, SYSTEM_ID, INTERNAL_SUBSET);
} finally {
if (sr_buffer != null) {
sr_buffer.close();
}
}
}
private void _testFull(final AsyncXMLStreamReader<?> sr, final AsyncReaderWrapper reader, final boolean checkValue, final String SYSTEM_ID, final String INTERNAL_SUBSET) throws Exception
{
int t = verifyStart(reader);
assertTokenType(DTD, t);
if (checkValue) {
assertNull(sr.getDTDInfo().getDTDPublicId());
assertEquals(SYSTEM_ID, sr.getDTDInfo().getDTDSystemId());
assertEquals("root", sr.getPrefixedName());
final String subset = sr.getText();
assertEquals(INTERNAL_SUBSET, subset);
}
assertTokenType(START_ELEMENT, reader.nextToken());
assertTokenType(END_ELEMENT, reader.nextToken());
assertTokenType(END_DOCUMENT, reader.nextToken());
assertFalse(sr.hasNext());
}
private void _testInvalidDup(final String spaces, final int chunkSize) throws Exception
{
final String XML = spaces + "<!DOCTYPE root> <!DOCTYPE root> <root />";
final AsyncXMLInputFactory f = new InputFactoryImpl();
//test for byte array
AsyncXMLStreamReader<AsyncByteArrayFeeder> sr_array = null;
try {
sr_array = f.createAsyncForByteArray();
final AsyncReaderWrapperForByteArray reader_array = new AsyncReaderWrapperForByteArray(sr_array, chunkSize, XML);
_testInvalidDup(sr_array, reader_array);
} finally {
if (sr_array != null) {
sr_array.close();
}
}
//test for byte buffer
AsyncXMLStreamReader<AsyncByteBufferFeeder> sr_buffer = null;
try {
sr_buffer = f.createAsyncForByteBuffer();
final AsyncReaderWrapperForByteBuffer reader_buffer = new AsyncReaderWrapperForByteBuffer(sr_buffer, chunkSize, XML);
_testInvalidDup(sr_buffer, reader_buffer);
} finally {
if (sr_buffer != null) {
sr_buffer.close();
}
}
}
private void _testInvalidDup(final AsyncXMLStreamReader<?> sr, final AsyncReaderWrapper reader) throws Exception
{
int t = verifyStart(reader);
assertTokenType(DTD, t);
assertEquals("root", sr.getPrefixedName());
// so far so good, but not any more:
try {
reader.nextToken();
} catch (XMLStreamException e) {
verifyException(e, "Duplicate DOCTYPE declaration");
}
}
}