package async; import javax.xml.stream.XMLStreamConstants; 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 TestCDataParsing extends AsyncTestBase { public void testCDataParse() throws Exception { // let's try with different chunking, addition (or not) of space for (int spaces = 0; spaces < 3; ++spaces) { String SPC = " ".substring(0, spaces); _testCData(1, SPC); _testCData(2, SPC); _testCData(3, SPC); _testCData(5, SPC); _testCData(11, SPC); _testCData(999, SPC); } } public void testCDataSkip() throws Exception { // let's try with different chunking, addition (or not) of space for (int spaces = 0; spaces < 3; ++spaces) { String SPC = " ".substring(0, spaces); _testCDataSkip(1, SPC); _testCDataSkip(2, SPC); _testCDataSkip(3, SPC); _testCDataSkip(5, SPC); _testCDataSkip(11, SPC); _testCDataSkip(999, SPC); } } /* /********************************************************************** /* Secondary test methods /********************************************************************** */ private final static String XML = "<root><![CDATA[cdata\r\n&] ]] stuff]]>...<![CDATA[this\r\r and Unicode: "+UNICODE_SEGMENT+"!]]></root>"; private void _testCData(final int chunkSize, final String SPC) throws Exception { 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, SPC + XML); _testCData(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, SPC + XML); _testCData(sr_buffer, reader_buffer); } finally { if(sr_buffer != null) { sr_buffer.close(); } } } private void _testCData(final AsyncXMLStreamReader<?> sr, final AsyncReaderWrapper reader) throws Exception { int t = verifyStart(reader); assertTokenType(START_ELEMENT, t); assertEquals("root", sr.getLocalName()); assertEquals("", sr.getNamespaceURI()); assertEquals(0, sr.getAttributeCount()); // note: moved to next element by now, so: assertTokenType(CDATA, reader.nextToken()); String str = collectAsyncText(reader, CDATA); // moves to end-element assertEquals("cdata\n&] ]] stuff", str); assertTokenType(XMLStreamConstants.CHARACTERS, reader.currentToken()); str = collectAsyncText(reader, CHARACTERS); assertEquals("...", str); assertTokenType(XMLStreamConstants.CDATA, reader.currentToken()); str = collectAsyncText(reader, CDATA); assertEquals("this\n\n and Unicode: "+UNICODE_SEGMENT+"!", str); assertTokenType(XMLStreamConstants.END_ELEMENT, reader.currentToken()); assertEquals("root", sr.getLocalName()); assertEquals("", sr.getNamespaceURI()); assertTokenType(XMLStreamConstants.END_DOCUMENT, reader.nextToken()); assertFalse(sr.hasNext()); } private void _testCDataSkip(final int chunkSize, final String SPC) throws Exception { 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, SPC + XML); _testCDataSkip(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, SPC + XML); _testCDataSkip(sr_buffer, reader_buffer); } finally { if(sr_buffer != null) { sr_buffer.close(); } } } private void _testCDataSkip(AsyncXMLStreamReader<?> sr, AsyncReaderWrapper reader) throws Exception { int t = verifyStart(reader); assertTokenType(START_ELEMENT, t); assertEquals("root", sr.getLocalName()); assertEquals("", sr.getNamespaceURI()); assertEquals(0, sr.getAttributeCount()); // note: moved to next element by now, so: assertTokenType(CDATA, reader.nextToken()); assertTokenType(XMLStreamConstants.CHARACTERS, reader.nextToken()); assertTokenType(XMLStreamConstants.CDATA, reader.nextToken()); assertTokenType(XMLStreamConstants.END_ELEMENT, reader.nextToken()); assertEquals("root", sr.getLocalName()); assertEquals("", sr.getNamespaceURI()); assertTokenType(XMLStreamConstants.END_DOCUMENT, reader.nextToken()); assertFalse(sr.hasNext()); } }