package scrum.client.communication;
import ilarkesto.core.logging.Log;
import scrum.client.DataTransferObject;
import scrum.client.core.ApplicationStartedEvent;
import scrum.client.core.ApplicationStartedHandler;
import scrum.client.project.Requirement;
import scrum.client.workspace.BlockCollapsedEvent;
import scrum.client.workspace.BlockCollapsedHandler;
import scrum.client.workspace.BlockExpandedEvent;
import scrum.client.workspace.BlockExpandedHandler;
import com.google.gwt.user.client.Timer;
public class Pinger extends GPinger implements ServerDataReceivedHandler, BlockExpandedHandler, BlockCollapsedHandler,
ApplicationStartedHandler {
private static Log log = Log.get(Pinger.class);
public static final int MIN_DELAY = 1000;
public static final int MAX_DELAY = 5000;
private Timer timer;
private int maxDelay = MAX_DELAY;
private long lastDataReceiveTime = System.currentTimeMillis();
@Override
public void onApplicationStarted(ApplicationStartedEvent event) {
timer = new Timer() {
@Override
public void run() {
new PingServiceCall().execute();
reschedule();
}
};
reschedule();
}
public void shutdown() {
log.info("Shutting down");
if (timer == null) return;
timer.cancel();
timer = null;
}
@Override
public void onServerDataReceived(ServerDataReceivedEvent event) {
DataTransferObject data = event.getData();
if (data.containsEntities() || data.usersStatus != null) {
lastDataReceiveTime = System.currentTimeMillis();
reschedule();
}
}
@Override
public void onBlockCollapsed(BlockCollapsedEvent event) {
deactivatePowerPolling();
}
@Override
public void onBlockExpanded(BlockExpandedEvent event) {
Object object = event.getObject();
if (object instanceof Requirement) {
Requirement requirement = (Requirement) object;
if (requirement.isWorkEstimationVotingActive()) activatePowerPolling();
}
}
public void reschedule() {
if (timer == null) return;
long idle = System.currentTimeMillis() - lastDataReceiveTime;
idle = (int) (idle * 0.15);
if (idle < MIN_DELAY) idle = MIN_DELAY;
if (idle > maxDelay) idle = maxDelay;
timer.scheduleRepeating((int) idle);
}
private void activatePowerPolling() {
maxDelay = MIN_DELAY;
log.debug("PowerPolling activated");
}
private void deactivatePowerPolling() {
if (maxDelay == MAX_DELAY) return;
maxDelay = MAX_DELAY;
lastDataReceiveTime = System.currentTimeMillis();
log.debug("PowerPolling deactivated");
}
}