/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.lee.echo360.tray;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lee.echo360.control.ControllerAction;
import org.lee.echo360.control.ControllerListener;
import org.lee.echo360.model.ActionResult;
/**
*
* @author lee
*/
public class DownloadExecutor implements Runnable, ControllerListener {
private final ApplicationController ctl;
private ControllerAction currentState;
private static final Runnable BLANK_RUNNABLE = new Runnable() {
@Override
public void run() {
// No Op
}
};
public DownloadExecutor(ApplicationController ctl) {
this.ctl = ctl;
this.ctl.addControllerListener(this);
}
@Override
public void run() {
perform(ControllerAction.LOGIN);
}
@Override
public void start(ControllerAction action) {
this.currentState = action;
}
@Override
public void finished(ControllerAction action, ActionResult r) {
switch (r) {
case FAILED:
case FATAL:
case NOT_CONNECTED:
organiseRetryLater(action);
break;
case INVALID_CREDENTIALS:
case NOT_LOGGED_IN:
break;
case SUCCEDED:
ApplicationController.s.submit(performNextInRunnable(action));
}
}
@Override
public void error(Throwable e) {
organiseRetryLater(this.currentState);
}
private void organiseRetryLater(final ControllerAction action) {
ApplicationController.s.schedule(performNextInRunnable(action), 10, TimeUnit.MINUTES);
}
private void perform(ControllerAction controllerAction) {
if (controllerAction == null) {
return;
}
switch (controllerAction) {
case LOGIN:
ctl.getLoginController().doLogin();
break;
case COURSES:
ctl.getSubjectController().getSubjects();
break;
case LECTURES:
ctl.getLectureController().getAllLectures();
break;
}
}
public Runnable performNextInRunnable(final ControllerAction prevAction) {
if (prevAction == ControllerAction.LECTURES) {
// TODO start Download soon.
return new Runnable() {
@Override
public void run() {
ctl.getDownloadController().downloadAllSelected(ctl.getPropertiesController().getBlackboard().getSubjects());
}
};
} else if (prevAction != null) {
return new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(DownloadExecutor.class.getName()).log(Level.SEVERE, null, ex);
}
perform(prevAction.next());
}
};
} else {
return BLANK_RUNNABLE;
}
}
}