package fitnesse.revisioncontrol.responders;
import fitnesse.FitNesseContext;
import fitnesse.html.HtmlPage;
import fitnesse.html.HtmlTableListingBuilder;
import fitnesse.html.HtmlTag;
import fitnesse.html.HtmlUtil;
import fitnesse.http.Request;
import fitnesse.http.Response;
import fitnesse.http.SimpleResponse;
import fitnesse.revisioncontrol.OperationStatus;
import fitnesse.revisioncontrol.Results;
import static fitnesse.revisioncontrol.RevisionControlOperation.REVERT;
import fitnesse.revisioncontrol.wiki.RevisionControlledFileSystemPage;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiPagePath;
import java.util.List;
public class RevertResponder extends RevisionControlResponder {
public static final String PARAM_CONFIRMED = "confirmed";
public RevertResponder() {
super(REVERT);
}
@Override
public Response makeResponse(FitNesseContext context, Request request) throws Exception {
String confirmedString = (String) request.getInput(PARAM_CONFIRMED);
if ("yes".equals(confirmedString)) {
return super.makeResponse(context, request);
}
else {
return makeConfirmationResponse(context, request);
}
}
@Override
protected void performOperation(RevisionControlledFileSystemPage page, HtmlTag tag) {
Results results = page.execute(REVERT);
makeResultsHtml(results, tag);
}
private void makeResultsHtml(Results results, HtmlTag tag) {
if (results.getStatus() == OperationStatus.NOTHING_TO_DO) {
tag.add("Nothing to revert");
} else {
HtmlTableListingBuilder table = new RevisionControlDetailsTableBuilder(results, rootPagePath);
tag.add(table.getTable());
}
}
private Response makeConfirmationResponse(FitNesseContext context, Request request) throws Exception {
SimpleResponse response = new SimpleResponse();
response.setMaxAge(0);
String pageName = request.getResource();
HtmlPage html = context.htmlPageFactory.newPage();
html.title.use(getPageTitle() + ": " + pageName);
html.header.use(HtmlUtil.makeBreadCrumbsWithPageType(pageName, getPageTitle()));
html.main.use(makeConfirmationContent(context.root, pageName));
response.setContent(html.html());
return response;
}
private String getPageTitle() {
return REVERT.getName();
}
private String makeConfirmationContent(WikiPage root, String qualifiedPageName) throws Exception {
WikiPagePath path = PathParser.parse(qualifiedPageName);
WikiPage pageToRevert = root.getPageCrawler().getPage(root, path);
List children = pageToRevert.getChildren();
boolean addSubPageWarning = true;
if (children == null || children.size() == 0) {
addSubPageWarning = false;
}
HtmlTag divTag = HtmlUtil.makeDivTag("centered");
divTag.add(makeHeadingTag(addSubPageWarning, qualifiedPageName));
divTag.add(HtmlUtil.BR);
divTag.add(HtmlUtil.makeLink(qualifiedPageName + "?responder=revert&confirmed=yes", "Yes"));
divTag.add(" ");
divTag.add(HtmlUtil.makeLink(qualifiedPageName, "No"));
return divTag.html();
}
private HtmlTag makeHeadingTag(boolean addSubPageWarning, String qualifiedPageName) {
HtmlTag h3Tag = new HtmlTag("H3");
if (addSubPageWarning)
{
h3Tag.add("Warning, this page contains one or more subpages.");
h3Tag.add(HtmlUtil.BR);
}
h3Tag.add("Are you sure you want to discard local changes to " + qualifiedPageName + "?");
return h3Tag;
}
}