package manual;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.xml.stream.util.XMLEventAllocator;
import com.fasterxml.aalto.AsyncByteBufferFeeder;
import com.fasterxml.aalto.AsyncXMLInputFactory;
import com.fasterxml.aalto.AsyncXMLStreamReader;
import com.fasterxml.aalto.evt.EventAllocatorImpl;
import com.fasterxml.aalto.stax.InputFactoryImpl;
/**
* Manually runnable reproduction of [aalto-xml#29]
*/
public class Issue29Repro implements Runnable
{
private static String xml = "<?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='4095288169' from='localhost' version='1.0' xml:lang='en'>";
private static int NUM_THREADS = 5;
private static XMLEventAllocator allocator = EventAllocatorImpl.getDefaultInstance();
private static AsyncXMLInputFactory inputFactory = new InputFactoryImpl();
public static void main(String[] args) throws InterruptedException {
ExecutorService ex = Executors.newFixedThreadPool(NUM_THREADS);
for (int i = 0; i < 100000; i++) {
ex.submit(new Issue29Repro(i));
}
ex.shutdown();
ex.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
}
private final int count;
public Issue29Repro(int count) {
this.count = count;
}
@Override
public void run() {
try {
ByteBuffer bb = StandardCharsets.UTF_8.encode(xml);
AsyncXMLStreamReader<AsyncByteBufferFeeder> parser = inputFactory.createAsyncForByteBuffer();
parser.getInputFeeder().feedInput(bb);
while (parser.hasNext()) {
int eventType = parser.next();
if (eventType == AsyncXMLStreamReader.EVENT_INCOMPLETE) {
break;
}
allocator.allocate(parser);
}
} catch (Exception e) {
System.out.println("Error in " + count);
e.printStackTrace();
}
}
}