package fitnesse.slim; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class VariableStore { private static final Pattern SYMBOL_PATTERN = Pattern.compile("\\$([a-zA-Z]\\w*)"); private Map<String, MethodExecutionResult> variables = new HashMap<String, MethodExecutionResult>(); private Matcher symbolMatcher; public void setSymbol(String name, MethodExecutionResult value) { variables.put(name, value); } public Object getStored(String nameWithDollar) { String name = nameWithDollar.substring(1); return variables.get(name).getObject(); } public 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<Object>(); 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) { int startingPosition = 0; while (true) { if ("".equals(arg) || null == arg) { break; } symbolMatcher = SYMBOL_PATTERN.matcher(arg); if (symbolMatcher.find(startingPosition)) { String symbolName = symbolMatcher.group(1); arg = replaceSymbolInArg(arg, symbolName); startingPosition = symbolMatcher.start(1); } else { break; } } return arg; } private String replaceSymbolInArg(String arg, String symbolName) { if (variables.containsKey(symbolName)) { String replacement = "null"; Object value = variables.get(symbolName); if (value != null) { replacement = value.toString(); } arg = arg.substring(0, symbolMatcher.start()) + replacement + arg.substring(symbolMatcher.end()); } return arg; } }