package hu.sztaki.ilab.longneck.process;
import java.util.HashMap;
import java.util.Map;
/**
* Variable space in blocks.
*
* It may have a parent space, which is inherited to the current space. Local variable
* assignments take precedence over inherited variables, but on block exit, all local variables
* are discarded.
*
* @author Molnar Peter <molnarp@sztaki.mta.hu>
*/
public class VariableSpace {
/** The local variable store. */
private Map<String,String> variables;
/** The parent space, may be null. */
private VariableSpace parent = null;
public VariableSpace() {
variables = new HashMap<String,String>();
}
public VariableSpace(VariableSpace parent) {
this.parent = parent;
variables = new HashMap<String,String>();
}
public VariableSpace(VariableSpace other, VariableSpace parent) {
this.parent = parent;
variables = new HashMap<String,String>();
variables.putAll(other.variables);
}
/**
* Returns the specified variable.
*
* The variable is returned from the current space, if available, or
* the parent space. When the variable is not found, null is returned.
*
* @param name The name of the variable without $ sign.
* @return String The variable's value.
*/
public String getVariable(String name) {
if (variables.containsKey(name)) {
return variables.get(name);
}
if (parent != null) {
return parent.getVariable(name);
}
return null;
}
/**
* Sets a variable.
*
* The variable is only set in the current space.
*
* @param name The name of the variable without the $ sign.
* @param value The value.
*/
public void setVariable(String name, String value) {
variables.put(name, value);
}
public VariableSpace getParent() {
return parent;
}
/**
* Sets the parent space.
*
* @param parent The parent space.
*/
public void setParent(VariableSpace parent) {
this.parent = parent;
}
/**
* Checks, if the specified variable is defined.
*
* @param name The name of the variable without $ prefix.
* @return True, if the variable exists (but may be null).
*/
public boolean hasVariable(String name) {
return variables.containsKey(name)
? true
: (parent == null ? false : parent.hasVariable(name));
}
}