// 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.AlwaysSecureOperation; import fitnesse.authentication.SecureOperation; import fitnesse.authentication.SecureResponder; import fitnesse.components.RecentChanges; import fitnesse.http.Request; import fitnesse.http.Response; import fitnesse.http.SimpleResponse; import fitnesse.responders.ErrorResponder; import fitnesse.responders.NotFoundResponder; import fitnesse.wiki.*; import java.io.IOException; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class SavePropertiesResponder implements SecureResponder { public Response makeResponse(FitNesseContext context, Request request) { SimpleResponse response = new SimpleResponse(); String resource = request.getResource(); WikiPagePath path = PathParser.parse(resource); WikiPage page = context.root.getPageCrawler().getPage(context.root, path); if (page == null) return new NotFoundResponder().makeResponse(context, request); PageData data = page.getData(); saveAttributes(request, data); VersionInfo commitRecord = page.commit(data); response.addHeader("Previous-Version", commitRecord.getName()); RecentChanges.updateRecentChanges(data); response.redirect(resource); return response; } private void saveAttributes(Request request, PageData data) { setPageTypeAttribute(request, data); List<String> attrs = new LinkedList<String>(); attrs.addAll(Arrays.asList(PageData.NON_SECURITY_ATTRIBUTES)); attrs.addAll(Arrays.asList(PageData.SECURITY_ATTRIBUTES)); attrs.add(PageData.PropertyPRUNE); for (Iterator<String> i = attrs.iterator(); i.hasNext();) { String attribute = i.next(); if (isChecked(request, attribute)) data.setAttribute(attribute); else data.removeAttribute(attribute); } String value = (String) request.getInput(WikiPageProperties.VIRTUAL_WIKI_ATTRIBUTE); value = value == null ? "" : value; if (!value.equals(data.getAttribute(WikiPageProperties.VIRTUAL_WIKI_ATTRIBUTE))) { WikiPage page = data.getWikiPage(); if (page.hasExtension(VirtualCouplingExtension.NAME)) { VirtualCouplingExtension extension = (VirtualCouplingExtension) page.getExtension(VirtualCouplingExtension.NAME); extension.resetVirtualCoupling(); } } if ("".equals(value) || value == null) data.removeAttribute(WikiPageProperties.VIRTUAL_WIKI_ATTRIBUTE); else data.setAttribute(WikiPageProperties.VIRTUAL_WIKI_ATTRIBUTE, value); String suites = (String) request.getInput("Suites"); data.setAttribute(PageData.PropertySUITES, suites); String helpText = (String) request.getInput("HelpText"); data.setAttribute(PageData.PropertyHELP, helpText); } private void setPageTypeAttribute(Request request, PageData data) { String pageType = getPageType(request); if (pageType == null) return; List<String> types = new LinkedList<String>(); types.addAll(Arrays.asList(PageData.PAGE_TYPE_ATTRIBUTES)); data.setAttribute(pageType); for (Iterator<String> i = types.iterator(); i.hasNext();) { String type = i.next(); if (!pageType.equals(type)) data.removeAttribute(type); } } private String getPageType(Request request) { return (String) request.getInput(PageData.PAGE_TYPE_ATTRIBUTE); } private boolean isChecked(Request request, String name) { return (request.getInput(name) != null); } public SecureOperation getSecureOperation() { return new AlwaysSecureOperation(); } }