package net.zschech.gwt.comettest.server;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import net.zschech.gwt.comet.server.CometServlet;
import net.zschech.gwt.comet.server.CometServletResponse;
import net.zschech.gwt.comet.server.CometSession;
import net.zschech.gwt.comettest.client.CometTestEntryPoint.TestData;
public class MessagingTestServlet extends CometServlet {
@Override
protected void doComet(final CometServletResponse cometResponse) throws ServletException, IOException {
HttpServletRequest request = cometResponse.getRequest();
final int connectionCount = Integer.parseInt(request.getParameter("c"), Character.MAX_RADIX);
final boolean session = "true".equals(request.getParameter("session"));
final int count = Integer.parseInt(request.getParameter("count"));
final int batch = Integer.parseInt(request.getParameter("batch"));
final int delay = Integer.parseInt(request.getParameter("delay"));
final boolean string = "string".equals(request.getParameter("mode"));
final CometSession cometSession = cometResponse.getSession(false);
final boolean order = request.getRequestURI().endsWith("order");
if (session && cometSession == null) {
cometResponse.terminate();
return;
}
if (session && connectionCount != 1) {
return;
}
new Thread() {
public void run() {
try {
if (cometSession == null) {
for (int i = 0; i < count; i++) {
if (!cometResponse.isTerminated()) {
if (batch > 1) {
List<Serializable> messages = new ArrayList<Serializable>(batch);
for (int b = 0; b < batch; b++) {
messages.add(getMessage(string, order, i * batch + b));
}
synchronized (cometResponse) {
if (!cometResponse.isTerminated()) {
cometResponse.write(messages);
}
}
}
else {
synchronized (cometResponse) {
if (!cometResponse.isTerminated()) {
cometResponse.write(getMessage(string, order, i));
}
}
}
if (delay > 0) {
try {
sleep(delay);
}
catch (InterruptedException e) {
throw new InterruptedIOException();
}
}
}
}
cometResponse.terminate();
}
else {
for (int i = 0; i < count; i++) {
for (int b = 0; b < batch; b++) {
cometSession.enqueue(getMessage(string, order, i * batch + b));
}
if (delay > 0) {
try {
sleep(delay);
}
catch (InterruptedException e) {
throw new InterruptedIOException();
}
}
}
// there is no proper way to wait for the queue to drain :-(
while (cometSession.isValid() && !cometSession.getQueue().isEmpty()) {
try {
sleep(1);
}
catch (InterruptedException e) {
throw new InterruptedIOException();
}
}
cometSession.invalidate();
}
}
catch (IOException e) {
log("Error writing data", e);
}
}
}.start();
}
protected Serializable getMessage(boolean string, boolean order, int i) {
double data = order ? i : System.currentTimeMillis();
return string ? String.valueOf(data) : new TestData(data, null);
}
}