// 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.search; import java.io.IOException; import static fitnesse.wiki.PageData.PropertyEDIT; import static fitnesse.wiki.PageData.PropertyFILES; import static fitnesse.wiki.PageData.PropertyPROPERTIES; import static fitnesse.wiki.PageData.PropertyPRUNE; import static fitnesse.wiki.PageData.PropertyRECENT_CHANGES; import static fitnesse.wiki.PageData.PropertyREFACTOR; import static fitnesse.wiki.PageData.PropertySEARCH; import static fitnesse.wiki.PageData.PropertyVERSIONS; import static fitnesse.wiki.PageData.PropertyWHERE_USED; import static fitnesse.wiki.PageData.SECURITY_ATTRIBUTES; import fitnesse.authentication.SecureOperation; import fitnesse.authentication.SecureReadOperation; import fitnesse.authentication.SecureResponder; import fitnesse.components.TraversalListener; import fitnesse.components.Traverser; import fitnesse.responders.ChunkingResponder; import fitnesse.html.template.HtmlPage; import fitnesse.html.template.PageTitle; import fitnesse.wiki.PageCrawler; import fitnesse.wiki.PageType; import fitnesse.wiki.WikiPage; import fitnesse.wiki.search.PageFinder; public abstract class ResultResponder extends ChunkingResponder implements SecureResponder, Traverser<WikiPage> { static final String[] SEARCH_ACTION_ATTRIBUTES = { PropertyEDIT, PropertyVERSIONS, PropertyPROPERTIES, PropertyREFACTOR, PropertyWHERE_USED }; static final String[] SEARCH_NAVIGATION_ATTRIBUTES = { PropertyRECENT_CHANGES, PropertyFILES, PropertySEARCH }; static final String SEARCH_ATTRIBUTE_SKIP = PropertyPRUNE; static final String[] SPECIAL_ATTRIBUTES = { "SetUp", "TearDown" }; @Override protected PageCrawler getPageCrawler() { return root.getPageCrawler(); } protected WikiPage getSearchScope() { String searchScope = request.getInput("searchScope"); if (searchScope == null || searchScope.isEmpty()) return page; else if(searchScope.equalsIgnoreCase("root")) return root; else{ WikiPage scope = page.getPageCrawler().findAncestorWithName(searchScope); return scope; } } @Override protected void doSending() throws IOException { if (page == null) page = root; String queryString = request.getQueryString() == null ? "" : request.getQueryString(); PageTitle pageTitle = new PageTitle(page.getPageCrawler().getFullPath() ); HtmlPage htmlPage = context.pageFactory.newPage(); htmlPage.setTitle(getTitle()); htmlPage.setPageTitle(pageTitle); htmlPage.setMainTemplate(getTemplate()); htmlPage.put("queryString", queryString); htmlPage.put("page", page); htmlPage.put("viewLocation", request.getResource()); htmlPage.setNavTemplate("viewNav"); htmlPage.put("resultResponder", this); htmlPage.put("pageTypeAttributes", PageType.valuesAsString()); htmlPage.put("actionAttributes", SEARCH_ACTION_ATTRIBUTES); htmlPage.put("navigationAttributes", SEARCH_NAVIGATION_ATTRIBUTES); htmlPage.put("securityAttributes", SECURITY_ATTRIBUTES); htmlPage.put("specialAttributes", SPECIAL_ATTRIBUTES); htmlPage.put("request", request); htmlPage.render(response.getWriter()); response.close(); } @Override public final void traverse(TraversalListener<WikiPage> observer) { PageFinder pageFinder = getPageFinder(observer); if (pageFinder != null) { pageFinder.search(getSearchScope()); } } protected abstract String getTemplate(); protected abstract String getTitle() ; protected abstract PageFinder getPageFinder(TraversalListener<WikiPage> observer); @Override public SecureOperation getSecureOperation() { return new SecureReadOperation(); } }