package async;
import java.io.IOException;
import javax.xml.stream.XMLStreamException;
import com.fasterxml.aalto.AsyncByteArrayFeeder;
import com.fasterxml.aalto.AsyncXMLStreamReader;
/**
* Helper class used with async parser
*/
public class AsyncReaderWrapperForByteArray implements AsyncReaderWrapper
{
private final AsyncXMLStreamReader<AsyncByteArrayFeeder> _streamReader;
private final byte[] _xml;
private final int _bytesPerFeed;
private int _offset = 0;
public AsyncReaderWrapperForByteArray(AsyncXMLStreamReader<AsyncByteArrayFeeder> sr, String xmlString) {
this(sr, 1, xmlString);
}
public AsyncReaderWrapperForByteArray(AsyncXMLStreamReader<AsyncByteArrayFeeder> sr, int bytesPerCall, String xmlString)
{
_streamReader = sr;
_bytesPerFeed = bytesPerCall;
try {
_xml = xmlString.getBytes("UTF-8");
} 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) {
AsyncByteArrayFeeder 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);
feeder.feedInput(_xml, _offset, amount);
_offset += amount;
}
}
return token;
}
}