// 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 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.wiki.*;
import static fitnesse.responders.editing.SaveRecorder.changesShouldBeMerged;
public class SaveResponder implements SecureResponder {
@Override
public Response makeResponse(FitNesseContext context, Request request) throws Exception {
long editTimeStamp = getEditTime(request);
long ticketId = getTicketId(request);
String resource = request.getResource();
WikiPage page = getPage(resource, context);
if (changesShouldBeMerged(editTimeStamp, ticketId, page))
return new MergeResponder(request).makeResponse(context, request);
else {
return saveEdits(context, request, page, ticketId);
}
}
private Response saveEdits(FitNesseContext context, Request request, WikiPage page, long ticketId) {
String savedContent = request.getInput(EditResponder.CONTENT_INPUT_NAME);
String helpText = request.getInput(EditResponder.HELP_TEXT);
String suites = request.getInput(EditResponder.SUITES);
String user = request.getAuthorizationUsername();
PageData data = page.getData();
Response response = new SimpleResponse();
setData(data, savedContent, helpText, suites, user);
SaveRecorder.pageSaved(page, ticketId);
VersionInfo commitRecord = page.commit(data);
if (commitRecord != null) {
response.addHeader("Current-Version", commitRecord.getName());
}
context.recentChanges.updateRecentChanges(page);
if (request.hasInput("redirect"))
response.redirect("", request.getInput("redirect"));
else
response.redirect(context.contextRoot, request.getResource());
return response;
}
private long getTicketId(Request request) {
if (!request.hasInput(EditResponder.TICKET_ID))
return 0;
String ticketIdString = request.getInput(EditResponder.TICKET_ID);
return Long.parseLong(ticketIdString);
}
private long getEditTime(Request request) {
if (!request.hasInput(EditResponder.TIME_STAMP))
return 0;
String editTimeStampString = request.getInput(EditResponder.TIME_STAMP);
return Long.parseLong(editTimeStampString);
}
private WikiPage getPage(String resource, FitNesseContext context) {
WikiPagePath path = PathParser.parse(resource);
PageCrawler pageCrawler = context.getRootPage().getPageCrawler();
WikiPage page = pageCrawler.getPage(path);
if (page == null)
page = WikiPageUtil.addPage(context.getRootPage(), PathParser.parse(resource));
return page;
}
private void setData(final PageData data, final String savedContent, final String helpText, final String suites, String user) {
data.setContent(savedContent);
data.setOrRemoveAttribute(PageData.PropertyHELP, helpText);
data.setOrRemoveAttribute(PageData.PropertySUITES, suites);
data.setOrRemoveAttribute(PageData.LAST_MODIFYING_USER, user);
}
@Override
public SecureOperation getSecureOperation() {
return new SecureWriteOperation();
}
}