// 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; import static fitnesse.wiki.PageData.PAGE_TYPE_ATTRIBUTES; import fitnesse.FitNesseContext; import fitnesse.authentication.SecureOperation; import fitnesse.authentication.SecureReadOperation; import fitnesse.authentication.SecureResponder; import fitnesse.html.HtmlUtil; import fitnesse.html.SetupTeardownAndLibraryIncluder; import fitnesse.http.Request; import fitnesse.http.Response; import fitnesse.http.SimpleResponse; import fitnesse.responders.editing.EditResponder; 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.VirtualEnabledPageCrawler; import fitnesse.wiki.WikiImportProperty; import fitnesse.wiki.WikiPage; import fitnesse.wiki.WikiPageActions; import fitnesse.wiki.WikiPagePath; public class WikiPageResponder implements SecureResponder { private WikiPage page; private PageData pageData; private String pageTitle; private Request request; private PageCrawler crawler; public Response makeResponse(FitNesseContext context, Request request) { loadPage(request.getResource(), context); if (page == null) return notFoundResponse(context, request); else return makePageResponse(context); } protected void loadPage(String pageName, FitNesseContext context) { WikiPagePath path = PathParser.parse(pageName); crawler = context.root.getPageCrawler(); crawler.setDeadEndStrategy(new VirtualEnabledPageCrawler()); page = crawler.getPage(context.root, path); if (page != null) pageData = page.getData(); } private Response notFoundResponse(FitNesseContext context, Request request) { if (dontCreateNonExistentPage(request)) return new NotFoundResponder().makeResponse(context, request); return new EditResponder().makeResponseForNonExistentPage(context, request); } private boolean dontCreateNonExistentPage(Request request) { String dontCreate = (String) request.getInput("dontCreatePage"); return dontCreate != null && (dontCreate.length() == 0 || Boolean.parseBoolean(dontCreate)); } private SimpleResponse makePageResponse(FitNesseContext context) { pageTitle = PathParser.render(crawler.getFullPath(page)); String html = makeHtml(context); SimpleResponse response = new SimpleResponse(); response.setMaxAge(0); response.setContent(html); return response; } public String makeHtml(FitNesseContext context) { WikiPage page = pageData.getWikiPage(); HtmlPage html = context.pageFactory.newPage(); WikiPagePath fullPath = page.getPageCrawler().getFullPath(page); String fullPathName = PathParser.render(fullPath); html.setTitle(fullPathName); html.setPageTitle(new PageTitle(fullPath).notLinked()); html.setNavTemplate("wikiNav.vm"); html.put("actions", new WikiPageActions(page)); SetupTeardownAndLibraryIncluder.includeInto(pageData, true); html.setMainTemplate("wikiPage"); html.setFooterTemplate("wikiFooter"); html.put("content", new WikiPageRenderer()); html.put("footerContent", new WikiPageFooterRenderer()); handleSpecialProperties(html, page); return html.html(); } private void handleSpecialProperties(HtmlPage html, WikiPage page) { WikiImportProperty.handleImportProperties(html, page, pageData); } public SecureOperation getSecureOperation() { return new SecureReadOperation(); } public class WikiPageRenderer { public String render() { return HtmlUtil.makePageHtml(pageData); } } public class WikiPageFooterRenderer { public String render() { return HtmlUtil.makePageFooterHtml(pageData); } } }