package freenet.clients.http;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import freenet.clients.http.updateableelements.BaseUpdateableElement;
import freenet.clients.http.updateableelements.PushDataManager;
import freenet.support.Ticker;
/** This manager object will push elements at a fixed interval */
public class IntervalPusherManager {
/** The interval when the elements will be pushed */
private static final int REFRESH_PERIOD = 10000;
/** The PushDataManager object */
private final PushDataManager pushDataManager;
/** The Ticker to schedule the interval */
private final Ticker ticker;
/** The job, that will refresh the elements */
private Runnable refresherJob =
new Runnable() {
@Override
public void run() {
// Updating
for (BaseUpdateableElement element : elements) {
pushDataManager.updateElement(element.getUpdaterId(null));
}
// If there are more elements, it reschedules
if (elements.size() > 0) {
ticker.queueTimedJob(this, "Stats refresher", REFRESH_PERIOD, false, true);
}
}
};
/** The elements that are pushed at a fixed interval */
private List<BaseUpdateableElement> elements = new CopyOnWriteArrayList<BaseUpdateableElement>();
/**
* Constructor
*
* @param ticker
* - The Ticker
* @param pushDataManager
* - The PushDataManager
*/
public IntervalPusherManager(Ticker ticker, PushDataManager pushDataManager) {
this.ticker = ticker;
this.pushDataManager = pushDataManager;
}
/**
* Registers an element to be pushed at a fixed interval
*
* @param element
* - The element
*/
public void registerUpdateableElement(BaseUpdateableElement element) {
boolean needsStart = false;
if (elements.size() == 0) {
needsStart = true;
}
elements.add(element);
// If this is the first element, then it starts the ticker
if (needsStart) {
ticker.queueTimedJob(refresherJob, "Stats refresher", REFRESH_PERIOD, false, true);
}
}
/**
* Removes the element from interval pushing
*
* @param element
* - The element to be removed
*/
public void deregisterUpdateableElement(BaseUpdateableElement element) {
elements.remove(element);
}
}