// 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.responders.editing;
import java.io.IOException;
import fitnesse.FitNesseContext;
import fitnesse.authentication.SecureOperation;
import fitnesse.authentication.SecureResponder;
import fitnesse.authentication.SecureWriteOperation;
import fitnesse.components.RecentChanges;
import fitnesse.components.SaveRecorder;
import fitnesse.html.HtmlTag;
import fitnesse.html.HtmlUtil;
import fitnesse.http.Request;
import fitnesse.http.Response;
import fitnesse.http.SimpleResponse;
import fitnesse.responders.ErrorResponder;
import fitnesse.responders.templateUtilities.HtmlPage;
import fitnesse.responders.templateUtilities.PageTitle;
import fitnesse.wiki.PageCrawler;
import fitnesse.wiki.PageData;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.VersionInfo;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiPagePath;
public class SaveResponder implements SecureResponder {
public static ContentFilter contentFilter;
private String user;
private long ticketId;
private String savedContent;
private String helpText;
private String suites;
private PageData data;
private long editTimeStamp;
public Response makeResponse(FitNesseContext context, Request request) {
editTimeStamp = getEditTime(request);
ticketId = getTicketId(request);
String resource = request.getResource();
WikiPage page = getPage(resource, context);
data = page.getData();
user = request.getAuthorizationUsername();
if (editsNeedMerge())
return new MergeResponder(request).makeResponse(context, request);
else {
savedContent = (String) request.getInput(EditResponder.CONTENT_INPUT_NAME);
helpText = (String) request.getInput(EditResponder.HELP_TEXT);
suites = (String) request.getInput(EditResponder.SUITES);
if (contentFilter != null && !contentFilter.isContentAcceptable(savedContent, resource))
return makeBannedContentResponse(context, resource);
else
return saveEdits(context, request, page);
}
}
private Response makeBannedContentResponse(FitNesseContext context, String resource) {
SimpleResponse response = new SimpleResponse();
HtmlPage html = context.pageFactory.newPage();
html.setTitle("Edit " + resource);
html.setPageTitle(new PageTitle("Banned Content", PathParser.parse(resource)));
html.setMainTemplate("bannedPage.vm");
response.setContent(html.html());
return response;
}
private Response saveEdits(FitNesseContext context, Request request, WikiPage page) {
Response response = new SimpleResponse();
setData();
VersionInfo commitRecord = page.commit(data);
response.addHeader("Previous-Version", commitRecord.getName());
RecentChanges.updateRecentChanges(data);
if (request.hasInput("redirect"))
response.redirect(request.getInput("redirect").toString());
else
response.redirect(request.getResource());
return response;
}
private boolean editsNeedMerge() {
return SaveRecorder.changesShouldBeMerged(editTimeStamp, ticketId, data);
}
private long getTicketId(Request request) {
if (!request.hasInput(EditResponder.TICKET_ID))
return 0;
String ticketIdString = (String) request.getInput(EditResponder.TICKET_ID);
return Long.parseLong(ticketIdString);
}
private long getEditTime(Request request) {
if (!request.hasInput(EditResponder.TIME_STAMP))
return 0;
String editTimeStampString = (String) request.getInput(EditResponder.TIME_STAMP);
long editTimeStamp = Long.parseLong(editTimeStampString);
return editTimeStamp;
}
private WikiPage getPage(String resource, FitNesseContext context) {
WikiPagePath path = PathParser.parse(resource);
PageCrawler pageCrawler = context.root.getPageCrawler();
WikiPage page = pageCrawler.getPage(context.root, path);
if (page == null)
page = pageCrawler.addPage(context.root, PathParser.parse(resource));
return page;
}
private void setData() {
data.setContent(savedContent);
setAttribute(PageData.PropertyHELP, helpText);
setAttribute(PageData.PropertySUITES, suites);
SaveRecorder.pageSaved(data, ticketId);
setAttribute(PageData.LAST_MODIFYING_USER, user);
}
private void setAttribute(String property, String content) {
if (content == null || "".equals(content)) {
data.removeAttribute(property);
} else {
data.setAttribute(property, content);
}
}
public SecureOperation getSecureOperation() {
return new SecureWriteOperation();
}
}