package org.freecode.irc.votebot;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.*;
public class ExpiryQueue<T> implements Runnable {
private final long expiry;
private final ConcurrentHashMap<T, Long> entryTimes;
private final LinkedList<T> queue;
private Future<?> future;
private static ScheduledExecutorService service;
public ExpiryQueue(final long defaultExpiry) {
this.expiry = defaultExpiry;
entryTimes = new ConcurrentHashMap<>();
queue = new LinkedList<>();
future = service.scheduleAtFixedRate(this, 10, 200, TimeUnit.MILLISECONDS);
}
static {
service = Executors.newScheduledThreadPool(5);
}
public boolean insert(T t) {
if (queue.contains(t)) {
throw new IllegalArgumentException("Queue already contains this element");
}
if (entryTimes.containsKey(t)) {
entryTimes.replace(t, System.currentTimeMillis());
} else
entryTimes.put(t, System.currentTimeMillis());
return queue.add(t);
}
public void run() {
for (Map.Entry<T, Long> entry : entryTimes.entrySet()) {
long start = entry.getValue();
if (System.currentTimeMillis() - start >= expiry) {
entryTimes.remove(entry.getKey(), entry.getValue());
queue.remove(entry.getKey());
onRemoval(entry.getKey());
}
}
}
public void onRemoval(T t) {
}
public boolean remove(T t) {
if (entryTimes.containsKey(t)) {
entryTimes.remove(t);
}
return queue.remove(t);
}
public boolean contains(T t) {
return queue.contains(t);
}
}