package fitnesse.wikitext.parser;
import util.Maybe;
public class VariableFinder implements VariableSource {
private ParsingPage page;
public VariableFinder(ParsingPage page) {
this.page = page;
}
public Maybe<String> findVariable(String name) {
Maybe<String> result = page.getSpecialVariableValue(name);
if (!result.isNothing()) return result;
result = findVariableInPages(name);
if (!result.isNothing()) return result;
String value = System.getenv(name);
if (value != null) return new Maybe<String>(value);
value = System.getProperty(name);
if (value != null) return new Maybe<String>(value);
return Maybe.noString;
}
private Maybe<String> findVariableInPages(String name) {
Maybe<String> localVariable = page.findVariable(name);
if (!localVariable.isNothing()) return new Maybe<String>(localVariable.getValue());
return lookInParentPages(name);
}
private Maybe<String> lookInParentPages(String name) {
for (SourcePage sourcePage: page.getPage().getAncestors()) {
if (!page.inCache(sourcePage)) {
Parser.make(page.copyForPage(sourcePage), sourcePage.getContent()).parse();
// todo: make this a method on ParsingPage
page.putVariable(sourcePage, "", Maybe.noString);
}
Maybe<String> result = page.findVariable(sourcePage, name);
if (!result.isNothing()) return result;
//page.putVariable(sourcePage, name, result);
}
return Maybe.noString;
}
}