package async;
import java.io.IOException;
import java.nio.ByteBuffer;
import javax.xml.stream.XMLStreamException;
import com.fasterxml.aalto.AsyncByteBufferFeeder;
import com.fasterxml.aalto.AsyncXMLStreamReader;
/**
* Helper class used with async parser
*/
public class AsyncReaderWrapperForByteBuffer implements AsyncReaderWrapper
{
private final AsyncXMLStreamReader<AsyncByteBufferFeeder> _streamReader;
private final byte[] _xml;
private final int _bytesPerFeed;
private int _offset = 0;
private final ByteBuffer _buf;
public AsyncReaderWrapperForByteBuffer(AsyncXMLStreamReader<AsyncByteBufferFeeder> sr, String xmlString) {
this(sr, 1, xmlString);
}
public AsyncReaderWrapperForByteBuffer(AsyncXMLStreamReader<AsyncByteBufferFeeder> sr, int bytesPerCall, String xmlString)
{
_streamReader = sr;
_bytesPerFeed = bytesPerCall;
try {
_xml = xmlString.getBytes("UTF-8");
_buf = ByteBuffer.allocate(_bytesPerFeed);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public String currentText() throws XMLStreamException {
return _streamReader.getText();
}
@Override
public int currentToken() throws XMLStreamException {
return _streamReader.getEventType();
}
@Override
public int nextToken() throws XMLStreamException
{
int token;
while ((token = _streamReader.next()) == AsyncXMLStreamReader.EVENT_INCOMPLETE) {
_buf.clear();
AsyncByteBufferFeeder feeder = _streamReader.getInputFeeder();
if (!feeder.needMoreInput()) {
AsyncTestBase.fail("Got EVENT_INCOMPLETE, could not feed more input");
}
if (_offset >= _xml.length) { // end-of-input?
feeder.endOfInput();
} else {
int amount = Math.min(_bytesPerFeed, _xml.length - _offset);
_buf.put(_xml, _offset, amount);
_buf.flip();
feeder.feedInput(_buf);
_offset += amount;
}
}
return token;
}
}