package com.dgex.offspring.dataprovider.internal;
import java.util.ArrayList;
import java.util.List;
import com.dgex.offspring.dataprovider.service.IDataProvider;
import com.dgex.offspring.dataprovider.service.IDataProviderListener;
public abstract class DataProvider implements IDataProvider {
protected final List<Object> sinks = new ArrayList<Object>();
protected final List<IDataProviderListener> listeners = new ArrayList<IDataProviderListener>();
/* Default interval is 5 seconds */
private final long defaultInterval = 10000;
private long lastRunCurrentTime = 0l;
@Override
public void addSink(Object sink) {
if (!doValidateSink(sink))
throw new RuntimeException("Illegal Sink Type");
if (!sinks.contains(sink))
sinks.add(sink);
}
@Override
public void removeSink(Object sink) {
sinks.remove(sink);
}
@Override
public void run() {
lastRunCurrentTime = System.currentTimeMillis();
doRun();
notifyListeners();
}
@Override
public long getIntervalMilliseconds() {
return defaultInterval;
}
@Override
public long getTimePassedSinceLastRun() {
return System.currentTimeMillis() - lastRunCurrentTime;
}
@Override
public long getTimeOverdue() {
return getTimePassedSinceLastRun() - getIntervalMilliseconds();
}
@Override
public void addDataProviderListener(IDataProviderListener listener) {
listeners.add(listener);
}
@Override
public void removeDataProviderListener(IDataProviderListener listener) {
listeners.remove(listener);
}
@Override
public void bump() {
lastRunCurrentTime = System.currentTimeMillis() - defaultInterval;
}
protected void notifyListeners() {
for (IDataProviderListener listener : listeners) {
listener.update();
}
}
protected abstract void doRun();
protected abstract boolean doValidateSink(Object sink);
}