package io.cattle.platform.engine.process.impl;
import io.cattle.platform.engine.process.StateTransition;
import io.cattle.platform.engine.process.StateTransition.Style;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ResourceStatesDefinition {
public static final String DEFAULT_STATE_FIELD = "state";
private static final Logger log = LoggerFactory.getLogger(ResourceStatesDefinition.class);
String stateField = DEFAULT_STATE_FIELD;
Set<String> startStates = new HashSet<String>();
Map<String, String> transitioningStatesMap = new HashMap<String, String>();
Map<String, String> doneStatesMap = new HashMap<String, String>();
public List<StateTransition> getStateTransitions() {
List<StateTransition> result = new ArrayList<StateTransition>();
for (Map.Entry<String, String> entry : transitioningStatesMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (key == null) {
for (String start : startStates) {
result.add(new StateTransition(start, value, stateField, Style.TRANSITIONING));
}
} else {
result.add(new StateTransition(key, value, stateField, Style.TRANSITIONING));
}
}
for (Map.Entry<String, String> entry : doneStatesMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (key == null) {
for (String start : transitioningStatesMap.values()) {
result.add(new StateTransition(start, value, stateField, Style.DONE));
}
} else {
result.add(new StateTransition(key, value, stateField, Style.DONE));
}
}
return result;
}
public String getTransitioningState(String currentState) {
String newState = transitioningStatesMap.get(currentState);
if (newState == null && transitioningStatesMap.size() == 1) {
return transitioningStatesMap.get(null);
}
if (newState == null)
throw new IllegalStateException("Failed to find state to transition from [" + currentState + "] to \"transitioning\"");
return newState;
}
public String getDoneState(String currentState) {
String newState = doneStatesMap.get(currentState);
if (newState == null && doneStatesMap.size() == 1) {
return doneStatesMap.get(null);
}
if (newState == null) {
log.error("Failed to find state to transition from [{}] to \"done\"", currentState);
return null;
}
return newState;
}
public boolean isDone(String currentState) {
return doneStatesMap.containsValue(currentState);
}
public boolean isTransitioning(String currentState) {
return transitioningStatesMap.containsValue(currentState) || doneStatesMap.containsKey(currentState);
}
public boolean isStart(String currentState) {
return startStates.contains(currentState);
}
public boolean isStartAndDone(String currentState) {
return isStart(currentState) && isDone(currentState);
}
public boolean isValidState(String currentState) {
return isStart(currentState) || isTransitioning(currentState) || isDone(currentState);
}
public Set<String> getStartStates() {
return startStates;
}
public void setStartStates(Set<String> startStates) {
this.startStates = startStates;
}
public Map<String, String> getTransitioningStatesMap() {
return transitioningStatesMap;
}
public void setTransitioningStatesMap(Map<String, String> transitioningStatesMap) {
this.transitioningStatesMap = transitioningStatesMap;
}
public Map<String, String> getDoneStatesMap() {
return doneStatesMap;
}
public void setDoneStatesMap(Map<String, String> doneStatesMap) {
this.doneStatesMap = doneStatesMap;
}
public String getStateField() {
return stateField;
}
public void setStateField(String stateField) {
this.stateField = stateField;
}
}