package uk.ac.imperial.lsds.seepmaster;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.imperial.lsds.seepmaster.query.InvalidLifecycleStatusException;
import uk.ac.imperial.lsds.seepmaster.query.MaterializedQueryManager;
public class LifecycleManager {
final private Logger LOG = LoggerFactory.getLogger(MaterializedQueryManager.class);
public enum AppStatus {
// id, [id] -> status, [valid status transitions]
MASTER_READY(0, new int[]{1, 0}),
QUERY_SUBMITTED(1, new int[]{2, 1, 0}),
QUERY_DEPLOYED(2, new int[]{4, 1}),
QUERY_RUNNING(4, new int[]{5, 6, 2}),
QUERY_FAILED(5, new int[]{6, 4, 2}),
QUERY_STOPPED(6, new int[]{2});
private int id;
private int[] validStateTransitions;
AppStatus(int id, int... validStateTransitions){
this.id = id;
this.validStateTransitions = validStateTransitions;
}
public int id(){
return id;
}
public boolean canTransitTo(AppStatus appStatus){
for(int i : validStateTransitions){
if(i == appStatus.id()){
return true;
}
}
return false;
}
}
private AppStatus status = AppStatus.MASTER_READY;
private static LifecycleManager instance;
private LifecycleManager(){ }
public static LifecycleManager getInstance(){
if(instance == null){
return new LifecycleManager();
}
else{
return instance;
}
}
public boolean canTransitTo(AppStatus newStatus) {
return status.canTransitTo(newStatus);
}
public void tryTransitTo(AppStatus newStatus) {
if(canTransitTo(newStatus)){
LOG.info(status.toString()+" => "+newStatus.toString());
this.status = newStatus;
}
else{
throw new InvalidLifecycleStatusException("Attempt to violate app lifecycle when transitioining to QUERY_SUBMITTED");
}
}
}