package fitnesse.components;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiWordReference;
import fitnesse.wikitext.parser.*;
import java.util.ArrayList;
import java.util.List;
public class WhereUsedPageFinder implements TraversalListener<WikiPage>, PageFinder, SymbolTreeWalker {
private WikiPage subjectPage;
private TraversalListener observer;
private WikiPage currentPage;
private List<WikiPage> hits = new ArrayList<WikiPage>();
public WhereUsedPageFinder(WikiPage subjectPage, TraversalListener observer) {
this.subjectPage = subjectPage;
this.observer = observer;
}
public void hit(WikiPage referencingPage) {
}
public void process(WikiPage currentPage) {
this.currentPage = currentPage;
String content = currentPage.getData().getContent();
Symbol syntaxTree = Parser.make(
new ParsingPage(new WikiSourcePage(currentPage)),
content,
SymbolProvider.refactoringProvider)
.parse();
syntaxTree.walkPreOrder(this);
}
public List<WikiPage> search(WikiPage page) {
hits.clear();
subjectPage.getPageCrawler().traverse(page, this);
return hits;
}
public boolean visit(Symbol node) {
if (!node.isType(WikiWord.symbolType)) return true;
if (hits.contains(currentPage)) return true;
try {
WikiPage referencedPage = new WikiWordReference(currentPage, node.getContent()).getReferencedPage();
if (referencedPage != null && referencedPage.equals(subjectPage)) {
hits.add(currentPage);
observer.process(currentPage);
}
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return true;
}
public boolean visitChildren(Symbol node) {
return true;
}
}