/*

	State.java
	by Richard Unger, March 1998
	
	This object maintains a dynamic list of flags or states. Any object can use
	the state object to add a state, or query whether a state exists and if it does,
	get its value.
	
*/


import java.util.Hashtable;
import java.util.StringTokenizer;


public class State implements CommandExecutor{
	
	Hashtable states;			// this table holds the states, for O(1) access by name
	CommandParser commander;	// the command parser object

// constructor
	public State(CommandParser commands){
		states = new Hashtable();
		commander = commands;
		commander.AddCommand("set <str> <bool>",this);
		commander.AddCommand("check <str>",this);
		}
		
// utility methods
	public void AddState(String name){
		if (!ExistsState(name))
			InsertState(name,true);
		}

	public void AddState(String name,boolean val){
		if (!ExistsState(name))
			InsertState(name,val);
		}
		
	private void InsertState(String name,boolean val){
		states.put(name,new Boolean(val));
		}
		
	public boolean ExistsState(String name){
		return states.containsKey(name);
		}
		
	public boolean GetStateValue(String name){
		if (ExistsState(name))
			return ((Boolean)states.get(name)).booleanValue();
		else
			return false;
		}
		
	public void SetStateValue(String name,boolean val){
		if (ExistsState(name))
			states.put(name,new Boolean(val));
		}


// dealing with commands

	public String performCommand(String command){
		StringTokenizer toke = new StringTokenizer(command," ,");
		String t1,t2;

		toke.nextToken();					// skip first word...			
		if (command.startsWith("set")){
			t1 = toke.nextToken(); t2 = toke.nextToken();
			InsertState(t1,t2.equals("true"));
			return null;
			}
		if (command.startsWith("check")){
			t1 = toke.nextToken();
			if (ExistsState(t1))
				return (GetStateValue(t1))?"true":"false";
			else
				return "No such state.";
			}
		return null;
		}

}


/*

Commands supported by the state object:

set <str> <bool>		- insert a state with name <str> and value <bool>
check <str>				- return value of state with name <str>

*/