package Galaxy.Visitor.util;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import Core.Option;
import Galaxy.Tree.Workflow.ToolState;
import Galaxy.Tree.Workflow.ToolState.Primitive;
import Galaxy.Tree.Workflow.ToolState.PrimitiveOrMap;
public class ToolStateContext {
private Stack<Map<String,PrimitiveOrMap>> stateStack;
public ToolStateContext(){
stateStack = new Stack<Map<String,PrimitiveOrMap>>();
}
public void setContext(ToolState toolstate){
stateStack.clear();
stateStack.push(toolstate.getToolState().getSecond());
}
public void stepInto(String key){
Map<String,PrimitiveOrMap> current = stateStack.peek();
if(current.containsKey(key) && current.get(key).isSecond()){
stateStack.push(current.get(key).getSecond());
}
}
public void stepOut(){
stateStack.pop();
}
public ToolStateContext copy(){
ToolStateContext c = new ToolStateContext();
for(Map<String,PrimitiveOrMap> mp : stateStack){
c.stateStack.push(mp);
}
return c;
}
public Option<Primitive,ToolStateContext> get(String key){
Map<String,PrimitiveOrMap> current= stateStack.peek();
if(current.containsKey(key)){
Option<Primitive,ToolStateContext> o;
PrimitiveOrMap pm = current.get(key);
o=new Option<Primitive,ToolStateContext>();
if(pm == null)
return null;
else if(pm.isFirst())
o.setFirst(pm.getFirst());
else{
ToolStateContext t = this.copy();
t.stepInto(key);
o.setSecond(t);
}
return o;
}
else
return null;
}
public String toString(){
return stateStack.peek().toString();
}
}