package de.uni_luebeck.inb.krabbenhoeft.eQTL.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.CalculationInProgressException;
public abstract class AutoRetry<T> {
public abstract void invoke(AsyncCallback<T> callback);
public abstract void success(T result);
public void run() {
run(5000);
}
public void run(int timeoutProposal) {
final int timeout = Math.max(500, timeoutProposal);
new Timer() {
public void run() {
final Timer timer = this;
invoke(new AsyncCallback<T>() {
public void onFailure(Throwable caught) {
final int displayDuration = timeout - 500;
if (displayDuration > 333) {
final MyMessages myMessages = (MyMessages) GWT.create(MyMessages.class);
final String message;
if (caught instanceof CalculationInProgressException)
message = myMessages.calculationInProgress();
else
message = myMessages.autoRetryFailure(caught.getLocalizedMessage());
ClientMainWindow.notifyUser(message, displayDuration);
}
timer.schedule(timeout);
}
public void onSuccess(T result) {
success(result);
}
});
}
}.run();
}
}