package fitnesse.slim;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class VariableStore {
private Map<String, MethodExecutionResult> variables = new HashMap<>();
public void setSymbol(String name, MethodExecutionResult value) {
variables.put(name, value);
}
public MethodExecutionResult getSymbol(String name) {
return variables.get(name);
}
public Object getStored(String nameWithDollar) {
if (nameWithDollar == null || !nameWithDollar.startsWith("$"))
return null;
String name = nameWithDollar.substring(1);
if (!variables.containsKey(name)) {
return null;
}
return variables.get(name).getObject();
}
private boolean containsValueFor(String nameWithDollar) {
return nameWithDollar != null && nameWithDollar.startsWith("$")
&& variables.containsKey(nameWithDollar.substring(1));
}
public Object[] replaceSymbols(Object[] args) {
Object[] result = new Object[args.length];
for (int i = 0; i < args.length; i++)
result[i] = replaceSymbol(args[i]);
return result;
}
private List<Object> replaceSymbolsInList(List<Object> objects) {
List<Object> result = new ArrayList<>();
for (Object object : objects)
result.add(replaceSymbol(object));
return result;
}
@SuppressWarnings("unchecked")
private Object replaceSymbol(Object object) {
if (object instanceof List) {
return replaceSymbolsInList((List<Object>) object);
}
if (containsValueFor((String) object)) {
return getStored((String) object);
}
return replaceSymbolsInString((String) object);
}
public String replaceSymbolsInString(String arg) {
// Symbol assignments are not done by the fixture code so remove them and
// return an empty string
if (SlimSymbol.isSymbolAssignment(arg) != null)
return "";
return new SlimSymbol() {
@Override
protected String getSymbolValue(String symbolName) {
return getStoreSymbolValue(symbolName);
}
}.replace(arg);
}
private String getStoreSymbolValue(String symbolName) {
if (variables.containsKey(symbolName)) {
String replacement = "null";
Object value = variables.get(symbolName);
if (value != null) {
replacement = value.toString();
}
return replacement;
}
return null;
}
}