Package fitnesse.wiki.search

Source Code of fitnesse.wiki.search.WhereUsedPageFinder

package fitnesse.wiki.search;

import fitnesse.components.TraversalListener;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiWordReference;
import fitnesse.wikitext.parser.*;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

public class WhereUsedPageFinder implements TraversalListener<WikiPage>, PageFinder, SymbolTreeWalker {
  private static final Logger LOG = Logger.getLogger(WhereUsedPageFinder.class.getName());

  private WikiPage subjectPage;
  private TraversalListener<? super WikiPage> observer;
  private WikiPage currentPage;

  private List<WikiPage> hits = new ArrayList<WikiPage>();

  public WhereUsedPageFinder(WikiPage subjectPage, TraversalListener<? super WikiPage> observer) {
    this.subjectPage = subjectPage;
    this.observer = observer;
  }

  public void process(WikiPage currentPage) {
    this.currentPage = currentPage;
    String content = currentPage.getData().getContent();
    Symbol syntaxTree = Parser.make(
              new ParsingPage(new WikiSourcePage(currentPage), null),
              content,
              SymbolProvider.refactoringProvider)
              .parse();
      syntaxTree.walkPreOrder(this);
  }

  public void search(WikiPage page) {
    hits.clear();
    page.getPageCrawler().traverse(this);
  }

    public boolean visit(Symbol node) {
      if (hits.contains(currentPage)) return true;
      if (node.isType(WikiWord.symbolType)) {
        WikiPage referencedPage = new WikiWordReference(currentPage, node.getContent()).getReferencedPage();
        if (referencedPage != null && referencedPage.equals(subjectPage)) {
          hits.add(currentPage);
          observer.process(currentPage);
        }
      }
      if (node.isType(Alias.symbolType)) {
        String linkText = node.childAt(1).childAt(0).getContent();
        if (linkText.contains("?")) {
          linkText = linkText.substring(0, linkText.indexOf('?'));
        }
        WikiPage referencedPage = new WikiWordReference(currentPage, linkText).getReferencedPage();
        if (referencedPage != null && referencedPage.equals(subjectPage)) {
          hits.add(currentPage);
          observer.process(currentPage);
        }
      }
      return true;
    }

    public boolean visitChildren(Symbol node) {
      return true;
    }
}
TOP

Related Classes of fitnesse.wiki.search.WhereUsedPageFinder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.