package fitnesse.responders.editing;
import fitnesse.FitNesseContext;
import fitnesse.authentication.SecureOperation;
import fitnesse.authentication.SecureResponder;
import fitnesse.authentication.SecureWriteOperation;
import fitnesse.http.Request;
import fitnesse.http.Response;
import fitnesse.http.SimpleResponse;
import fitnesse.responders.ErrorResponder;
import fitnesse.responders.NotFoundResponder;
import fitnesse.wiki.*;
import fitnesse.wikitext.parser.WikiWordPath;
public class AddChildPageResponder implements SecureResponder {
private WikiPage currentPage;
private PageCrawler crawler;
private String childName;
private WikiPagePath currentPagePath;
private WikiPagePath childPath;
private String childContent;
private String pageType;
private String helpText;
private String suites;
public SecureOperation getSecureOperation() {
return new SecureWriteOperation();
}
public Response makeResponse(FitNesseContext context, Request request) {
parseRequest(context, request);
if (currentPage == null)
return notFoundResponse(context, request);
else if (nameIsInvalid(childName))
return errorResponse(context, request);
return createChildPageAndMakeResponse(request);
}
private void parseRequest(FitNesseContext context, Request request) {
childName = (String) request.getInput(EditResponder.PAGE_NAME);
childName = childName == null ? "null" : childName;
childPath = PathParser.parse(childName);
currentPagePath = PathParser.parse(request.getResource());
crawler = context.root.getPageCrawler();
currentPage = crawler.getPage(context.root, currentPagePath);
childContent = (String) request.getInput(EditResponder.CONTENT_INPUT_NAME);
pageType = (String) request.getInput(EditResponder.PAGE_TYPE);
helpText = (String) request.getInput(EditResponder.HELP_TEXT);
suites = (String) request.getInput(EditResponder.SUITES);
if (childContent == null)
childContent = "!contents\n";
if (pageType == null)
pageType = "Default";
}
private Response createChildPageAndMakeResponse(Request request) {
createChildPage(request);
SimpleResponse response = new SimpleResponse();
WikiPagePath fullPathOfCurrentPage = crawler.getFullPath(currentPage);
response.redirect(fullPathOfCurrentPage.toString());
return response;
}
private boolean nameIsInvalid(String name) {
if (name.equals(""))
return true;
if (!WikiWordPath.isSingleWikiWord(name))
return true;
return false;
}
private void createChildPage(Request request) {
WikiPage childPage = crawler.addPage(currentPage, childPath, childContent);
setAttributes(childPage);
}
private void setAttributes(WikiPage childPage) {
PageData childPageData = childPage.getData();
if (pageType.equals("Static")) {
childPageData.getProperties().remove("Test");
childPageData.getProperties().remove("Suite");
} else if ("Test".equals(pageType) || "Suite".equals(pageType))
childPageData.setAttribute(pageType);
childPageData.setAttribute(PageData.PropertyHELP, helpText);
childPageData.setAttribute(PageData.PropertySUITES, suites);
childPage.commit(childPageData);
}
private Response errorResponse(FitNesseContext context, Request request) {
return new ErrorResponder("Invalid Child Name").makeResponse(context, request);
}
private Response notFoundResponse(FitNesseContext context, Request request) {
return new NotFoundResponder().makeResponse(context, request);
}
}