/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* 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;
import com.google.common.base.Predicate;
/**
* Base class for flow controllers using a single queue
*
* @author Andrea Aime - OpenGeo
*
*/
public class SingleQueueFlowController implements FlowController {
static final Logger LOGGER = Logging.getLogger(ControlFlowCallback.class);
Predicate<Request> matcher;
BlockingQueue<Request> queue;
int queueSize;
public SingleQueueFlowController(int queueSize, Predicate<Request> matcher) {
this.queueSize = queueSize;
this.matcher = matcher;
queue = new ArrayBlockingQueue<Request>(queueSize, true);
}
public int getPriority() {
return queueSize;
}
public void requestComplete(Request request) {
if (matcher.apply(request)) {
queue.remove(request);
}
}
public boolean requestIncoming(Request request, long timeout) {
boolean retval = true;
if (matcher.apply(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;
}
public Predicate<Request> getMatcher() {
return matcher;
}
/**
* Returns the current queue size
* @return
*/
public int getRequestsInQueue() {
return queue.size();
}
}