package fitnesse.responders.run;
import fitnesse.wiki.PageCrawlerImpl;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
import java.util.*;
public class PageListSetUpTearDownSurrounder {
private WikiPage root;
private List<TestPage> pageList;
public PageListSetUpTearDownSurrounder(WikiPage root) {
this.root = root;
}
public void surroundGroupsOfTestPagesWithRespectiveSetUpAndTearDowns(List<TestPage> pageList) {
this.pageList = pageList;
Map<String, LinkedList<TestPage>> pageSetUpTearDownGroups = new HashMap<String, LinkedList<TestPage>>();
createPageSetUpTearDownGroups(pageSetUpTearDownGroups);
pageList.clear();
reinsertPagesViaSetUpTearDownGroups(pageSetUpTearDownGroups);
}
private void createPageSetUpTearDownGroups(Map<String, LinkedList<TestPage>> pageSetUpTearDownGroups) {
for (TestPage page : pageList) {
makeSetUpTearDownPageGroupForPage(page, pageSetUpTearDownGroups);
}
}
private void makeSetUpTearDownPageGroupForPage(TestPage page, Map<String, LinkedList<TestPage>> pageSetUpTearDownGroups) {
String group = getSetUpTearDownGroup(page.getSourcePage());
LinkedList<TestPage> pageGroup;
if (pageSetUpTearDownGroups.get(group) != null) {
pageGroup = pageSetUpTearDownGroups.get(group);
pageGroup.add(page);
} else {
pageGroup = new LinkedList<TestPage>();
pageGroup.add(page);
pageSetUpTearDownGroups.put(group, pageGroup);
}
}
private String getSetUpTearDownGroup(WikiPage page) {
String setUpPath = getPathForSetUpTearDown(page, SuiteContentsFinder.SUITE_SETUP_NAME);
String tearDownPath = getPathForSetUpTearDown(page, SuiteContentsFinder.SUITE_TEARDOWN_NAME);
return setUpPath + "," + tearDownPath;
}
private String getPathForSetUpTearDown(WikiPage page, String setUpTearDownName) {
String path = null;
WikiPage suiteSetUpTearDown = PageCrawlerImpl.getClosestInheritedPage(setUpTearDownName, page);
if (suiteSetUpTearDown != null)
path = suiteSetUpTearDown.getPageCrawler().getFullPath(suiteSetUpTearDown).toString();
return path;
}
private void reinsertPagesViaSetUpTearDownGroups(Map<String, LinkedList<TestPage>> pageSetUpTearDownGroups) {
Set<String> groupKeys = pageSetUpTearDownGroups.keySet();
for (String groupKey : groupKeys) {
LinkedList<TestPage> pageGroup = pageSetUpTearDownGroups.get(groupKey);
insertSetUpTearDownPageGroup(groupKey, pageGroup);
}
}
private void insertSetUpTearDownPageGroup(String setUpAndTearDownGroupKey, LinkedList<TestPage> pageGroup) {
insertSetUpForThisGroup(setUpAndTearDownGroupKey);
insertPagesOfThisGroup(pageGroup);
insertTearDownForThisGroup(setUpAndTearDownGroupKey);
}
private void insertSetUpForThisGroup(String setUpAndTearDown) {
String setUpPath = setUpAndTearDown.split(",")[0];
WikiPage setUpPage = root.getPageCrawler().getPage(root, PathParser.parse(setUpPath));
if (setUpPage != null)
pageList.add(new TestPage(setUpPage));
}
private void insertPagesOfThisGroup(LinkedList<TestPage> pageGroup) {
for (TestPage page : pageGroup)
pageList.add(page);
}
private void insertTearDownForThisGroup(String setUpAndTearDownGroupKey) {
String tearDownPath = setUpAndTearDownGroupKey.split(",")[1];
WikiPage tearDownPage = root.getPageCrawler().getPage(root, PathParser.parse(tearDownPath));
if (tearDownPage != null)
pageList.add(new TestPage(tearDownPage));
}
}