/* Copyright (c) 2001 - 2008 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.flow.controller;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.flow.ControlFlowCallback;
import org.geoserver.flow.FlowController;
import org.geoserver.ows.Request;
import org.geotools.util.logging.Logging;
/**
* Base class for flow controllers using a single queue
*
* @author Andrea Aime - OpenGeo
*
*/
public abstract class SingleQueueFlowController implements FlowController {
static final Logger LOGGER = Logging.getLogger(ControlFlowCallback.class);
BlockingQueue<Request> queue;
int queueSize;
public SingleQueueFlowController(int queueSize) {
this.queueSize = queueSize;
queue = new ArrayBlockingQueue<Request>(queueSize, true);
}
public int getPriority() {
return queueSize;
}
public void requestComplete(Request request) {
if (matchesRequest(request)) {
queue.remove(request);
}
}
public boolean requestIncoming(Request request, long timeout) {
boolean retval = true;
if (matchesRequest(request)) {
try {
if(timeout > 0) {
retval = queue.offer(request, timeout, TimeUnit.MILLISECONDS);
} else {
queue.put(request);
}
} catch (InterruptedException e) {
LOGGER.log(Level.WARNING,
"Unexpected interruption while blocking on the request queue");
}
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(this + " queue size " + queue.size());
}
}
return retval;
}
abstract boolean matchesRequest(Request request);
}