package de.skuzzle.polly.core.internal.irc;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import de.skuzzle.polly.sdk.eventlistener.MessageEvent;
import de.skuzzle.polly.sdk.exceptions.DisposingException;
public class DefaultMessageScheduler extends Thread implements MessageScheduler {
private IrcManagerImpl ircManager;
private AtomicBoolean shutdownFlag;
private Map<Object, AtomicLong> counter;
private PriorityBlockingQueue<CompareKey> messageQueue;
private int delay;
private class CompareKey implements Comparable<CompareKey> {
private long value;
private MessageEvent message;
public CompareKey(Object key, MessageEvent message) {
AtomicLong al = counter.get(key);
this.value = al == null ? 0 : al.get();
this.message = message;
}
public MessageEvent getMessage() {
return this.message;
}
@Override
public int compareTo(CompareKey o) {
return o.value <= this.value ? 1 : -1;
}
}
public DefaultMessageScheduler(IrcManagerImpl ircManager, int delay) {
this.ircManager = ircManager;
this.delay = delay;
this.counter = new ConcurrentHashMap<Object, AtomicLong>();
this.messageQueue = new PriorityBlockingQueue<CompareKey>();
this.shutdownFlag = new AtomicBoolean();
}
@Override
public void addMessage(String channel, String message, Object source) {
MessageEvent e = new MessageEvent(null, null, null, channel, message);
AtomicLong c = this.counter.get(source);
if (c == null) {
c = new AtomicLong();
this.counter.put(source, c);
}
c.incrementAndGet();
this.messageQueue.add(new CompareKey(source, e));
}
@Override
public void run() {
System.err.println("started");
while (!this.shutdownFlag.get()) {
System.out.println("before poll");
try {
CompareKey key = this.messageQueue.take();
System.out.println("polled");
this.ircManager.sendMessage(key.getMessage().getChannel(),
key.getMessage().getMessage());
Thread.sleep(this.delay);
} catch (InterruptedException e1) {
return;
}
}
}
@Override
public boolean isDisposed() {
return this.shutdownFlag.get();
}
@Override
public void dispose() throws DisposingException {
this.shutdownFlag.set(true);
this.interrupt();
}
@Override
public void setMessageDelay(int delay) {
}
}