// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.html;
import fitnesse.responders.run.TestPage;
import fitnesse.wiki.*;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class SetupTeardownAndLibraryIncluder {
private TestPage testPage;
private boolean isSuite;
private StringBuffer newPageContent;
private PageCrawler pageCrawler;
public static void includeInto(PageData pageData) {
includeInto(pageData, false);
}
public static void includeInto(PageData pageData, boolean isSuite) {
TestPage testPage = new TestPage(pageData);
new SetupTeardownAndLibraryIncluder(testPage).includeInto(isSuite);
pageData.setContent(testPage.getDecoratedData().getContent());
}
public static void includeSetupsTeardownsAndLibrariesBelowTheSuite(TestPage testPage, WikiPage suitePage) {
new SetupTeardownAndLibraryIncluder(testPage).includeSetupsTeardownsAndLibrariesBelowTheSuite(suitePage);
}
private SetupTeardownAndLibraryIncluder(TestPage testPage) {
this.testPage = testPage;
pageCrawler = testPage.getSourcePage().getPageCrawler();
newPageContent = new StringBuffer();
}
private void includeInto(boolean isSuite) {
this.isSuite = isSuite;
if (testPage.isTestPage())
includeSetupTeardownAndLibraryPages();
}
private void includeSetupTeardownAndLibraryPages() {
includeScenarioLibraries();
includeSetupPages();
includePageContent();
includeTeardownPages();
updatePageContent();
}
private void includeSetupsTeardownsAndLibrariesBelowTheSuite(WikiPage suitePage) {
String pageName = testPage.getName();
includeScenarioLibraryBelow(suitePage);
if (!isSuiteSetUpOrTearDownPage(pageName))
includeSetupPages();
includePageContent();
if (!isSuiteSetUpOrTearDownPage(pageName))
includeTeardownPages();
updatePageContent();
}
private boolean isSuiteSetUpOrTearDownPage(String pageName) {
return PageData.SUITE_SETUP_NAME.equals(pageName) || PageData.SUITE_TEARDOWN_NAME.equals(pageName);
}
private void includeScenarioLibraryBelow(WikiPage suitePage) {
includeScenarioLibrariesIfAppropriate(new BelowSuiteLibraryFilter(suitePage));
}
private void includeScenarioLibraries() {
includeScenarioLibrariesIfAppropriate(AllLibrariesFilter.instance);
}
private void includeSetupPages() {
if (isSuite)
includeSuiteSetupPage();
includeSetupPage();
}
private void includeSuiteSetupPage() {
include(PageData.SUITE_SETUP_NAME, "-setup");
}
private void includeSetupPage() {
include("SetUp", "-setup");
}
private void includePageContent() {
newPageContent.append(testPage.parsedData().getContent());
}
private void includeTeardownPages() {
includeTeardownPage();
if (isSuite)
includeSuiteTeardownPage();
}
private void includeTeardownPage() {
include("TearDown", "-teardown");
}
private void includeSuiteTeardownPage() {
include(PageData.SUITE_TEARDOWN_NAME, "-teardown");
}
private void updatePageContent() {
testPage.decorate(newPageContent.toString());
}
private void include(String pageName, String arg) {
WikiPage inheritedPage = findInheritedPage(pageName);
if (inheritedPage != null) {
String pagePathName = getPathNameForPage(inheritedPage);
includePage(pagePathName, arg);
}
}
private void includeScenarioLibrariesIfAppropriate(LibraryFilter libraryFilter) {
if (testPage.isSlim())
includeScenarioLibrariesIfAny(libraryFilter);
}
private void includeScenarioLibrariesIfAny(LibraryFilter libraryFilter) {
List<WikiPage> uncles = PageCrawlerImpl.getAllUncles("ScenarioLibrary", testPage.getSourcePage());
List<WikiPage> filteredUncles = filter(uncles, libraryFilter);
if (filteredUncles.size() > 0)
includeScenarioLibraries(filteredUncles);
}
private List<WikiPage> filter(List<WikiPage> widgets, LibraryFilter filter) {
List<WikiPage> filteredList = new LinkedList<WikiPage>();
for (WikiPage widget : widgets) {
if (filter.canUse(widget))
filteredList.add(widget);
}
return filteredList;
}
private void includeScenarioLibraries(List<WikiPage> uncles) {
Collections.reverse(uncles);
newPageContent.append("!*> Scenario Libraries\n");
for (WikiPage uncle : uncles)
includeScenarioLibrary(uncle);
newPageContent.append("*!\n");
}
private void includeScenarioLibrary(WikiPage uncle) {
newPageContent.append("!include -c .");
newPageContent.append(PathParser.render(pageCrawler.getFullPath(uncle)));
newPageContent.append("\n");
}
private WikiPage findInheritedPage(String pageName) {
return PageCrawlerImpl.getClosestInheritedPage(pageName, testPage.getSourcePage());
}
private String getPathNameForPage(WikiPage page) {
WikiPagePath pagePath = pageCrawler.getFullPath(page);
return PathParser.render(pagePath);
}
private void includePage(String pagePathName, String arg) {
newPageContent
.append("\n!include ")
.append(arg)
.append(" .")
.append(pagePathName)
.append("\n");
}
private static interface LibraryFilter {
boolean canUse(WikiPage libraryPage);
}
private static class AllLibrariesFilter implements LibraryFilter {
public static AllLibrariesFilter instance = new AllLibrariesFilter();
@Override
public boolean canUse(WikiPage libraryPage) {
return true;
}
}
private class BelowSuiteLibraryFilter implements LibraryFilter {
private int minimumPathLength;
public BelowSuiteLibraryFilter(WikiPage suitePage) {
minimumPathLength = suitePage.getPageCrawler().getFullPath(suitePage).addNameToEnd("ScenarioLibrary").toString().length();
}
@Override
public boolean canUse(WikiPage libraryPage) {
return libraryPage.getPageCrawler().getFullPath(libraryPage).toString().length() > minimumPathLength;
}
}
}