package org.oliot.epcis.service.capture;
import java.io.IOException;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.servlet.AsyncContext;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletResponse;
class VocabularyCaptureReadListener implements ReadListener {
private ServletInputStream input = null;
private HttpServletResponse res = null;
private AsyncContext ac = null;
// store the processed data to be sent back to client later
private Queue<String> queue = new LinkedBlockingQueue<String>();
VocabularyCaptureReadListener(ServletInputStream in, HttpServletResponse r, AsyncContext c) {
input = in;
res = r;
ac = c;
}
public void onDataAvailable() throws IOException {
StringBuilder sb = new StringBuilder();
int len = -1;
byte b[] = new byte[1024];
// We need to check input#isReady before reading data.
// The ReadListener will be invoked again when
// the input#isReady is changed from false to true
while (input.isReady() && (len = input.read(b)) != -1) {
String data = new String(b, 0, len);
sb.append(data);
}
queue.add(sb.toString());
}
public void onAllDataRead() throws IOException {
res.setStatus(200);
ac.complete();
VocabularyCapture vc = new VocabularyCapture();
String inputString = queue.toString();
if (inputString.length() >= 2) {
inputString = inputString.substring(1, inputString.length() - 1);
}
vc.asyncPost(inputString);
}
public void onError(final Throwable t) {
res.setStatus(404);
ac.complete();
t.printStackTrace();
}
}