001: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
002: // Released under the terms of the GNU General Public License version 2 or later.
003: package fitnesse.responders.editing;
004:
005: import fitnesse.*;
006: import fitnesse.html.*;
007: import fitnesse.responders.SecureResponder;
008: import fitnesse.authentication.*;
009: import fitnesse.components.*;
010: import fitnesse.http.*;
011: import fitnesse.wiki.*;
012:
013: public class SaveResponder implements SecureResponder {
014: public static ContentFilter contentFilter;
015:
016: private String user;
017: private long ticketId;
018: private String savedContent;
019: private PageData data;
020:
021: public Response makeResponse(FitNesseContext context,
022: Request request) throws Exception {
023: String resource = request.getResource();
024: WikiPage page = getPage(resource, context);
025: data = page.getData();
026: user = request.getAuthorizationUsername();
027:
028: if (editsNeedMerge(request))
029: return new MergeResponder(request).makeResponse(context,
030: request);
031: else {
032: savedContent = (String) request
033: .getInput(EditResponder.CONTENT_INPUT_NAME);
034: if (contentFilter != null
035: && !contentFilter.isContentAcceptable(savedContent,
036: resource))
037: return makeBannedContentResponse(context, resource);
038: else
039: return saveEdits(request, page);
040: }
041: }
042:
043: private Response makeBannedContentResponse(FitNesseContext context,
044: String resource) throws Exception {
045: SimpleResponse response = new SimpleResponse();
046: HtmlPage html = context.htmlPageFactory.newPage();
047: html.title.use("Edit " + resource);
048: html.header.use(HtmlUtil.makeBreadCrumbsWithPageType(resource,
049: "Banned Content"));
050: html.main
051: .use(new HtmlTag(
052: "h3",
053: "The content you're trying to save has been "
054: + "banned from this site. Your changes will not be saved!"));
055: response.setContent(html.html());
056: return response;
057: }
058:
059: private Response saveEdits(Request request, WikiPage page)
060: throws Exception {
061: Response response = new SimpleResponse();
062: setData();
063: VersionInfo commitRecord = page.commit(data);
064: response.addHeader("Previous-Version", commitRecord.getName());
065: RecentChanges.updateRecentChanges(data);
066:
067: if (request.hasInput("redirect"))
068: response.redirect(request.getInput("redirect").toString());
069: else
070: response.redirect(request.getResource());
071:
072: return response;
073: }
074:
075: private boolean editsNeedMerge(Request request) throws Exception {
076: String saveIdString = (String) request
077: .getInput(EditResponder.SAVE_ID);
078: long saveId = Long.parseLong(saveIdString);
079:
080: String ticketIdString = (String) request
081: .getInput(EditResponder.TICKET_ID);
082: ticketId = Long.parseLong(ticketIdString);
083:
084: return SaveRecorder.changesShouldBeMerged(saveId, ticketId,
085: data);
086: }
087:
088: private WikiPage getPage(String resource, FitNesseContext context)
089: throws Exception {
090: WikiPagePath path = PathParser.parse(resource);
091: PageCrawler pageCrawler = context.root.getPageCrawler();
092: WikiPage page = pageCrawler.getPage(context.root, path);
093: if (page == null)
094: page = pageCrawler.addPage(context.root, PathParser
095: .parse(resource));
096: return page;
097: }
098:
099: private void setData() throws Exception {
100: data.setContent(savedContent);
101: data.setAttribute(EditResponder.TICKET_ID, ticketId + "");
102: SaveRecorder.pageSaved(data);
103: if (user != null)
104: data.setAttribute(WikiPage.LAST_MODIFYING_USER, user);
105: else
106: data.removeAttribute(WikiPage.LAST_MODIFYING_USER);
107: }
108:
109: public SecureOperation getSecureOperation() {
110: return new SecureWriteOperation();
111: }
112: }
|