package kg.apc.jmeter.modifiers;
import org.apache.jmeter.util.JMeterUtils;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
public class FifoMap extends ConcurrentHashMap<String, BlockingQueue<Object>> {
public static final String TIMEOUT_PROP = "kg.apc.jmeter.functions.FifoTimeout";
public static final String CAPACITY_PROP = "kg.apc.jmeter.functions.FifoCapacity";
private static FifoMap instance = new FifoMap();
private FifoMap() {
}
public static FifoMap getInstance() {
return instance;
}
private BlockingQueue<Object> getFifo(String fifoName) {
if (super.containsKey(fifoName)) {
return super.get(fifoName);
} else {
BlockingQueue<Object> fifo = new LinkedBlockingQueue<Object>(JMeterUtils.getPropDefault(FifoMap.CAPACITY_PROP, Integer.MAX_VALUE));
super.put(fifoName, fifo);
return fifo;
}
}
public Object get(String fifoName) {
BlockingQueue<Object> fifo = getFifo(fifoName);
Object value;
value = fifo.peek();
return value == null ? "" : value;
}
public Object pop(String fifoName, long timeout) throws InterruptedException {
BlockingQueue<Object> fifo = getFifo(fifoName);
return fifo.poll(timeout, TimeUnit.SECONDS);
}
public Object pop(String fifoName) throws InterruptedException {
return pop(fifoName, Long.MAX_VALUE);
}
public int length(String fifoName) {
BlockingQueue<Object> fifo = getFifo(fifoName);
return fifo.size();
}
public void put(String fifoName, Object v) throws InterruptedException {
getFifo(fifoName).offer(v, Long.MAX_VALUE, TimeUnit.SECONDS);
}
}