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.search;
004:
005: import fitnesse.html.*;
006: import fitnesse.components.SearchObserver;
007: import fitnesse.wiki.*;
008: import fitnesse.responders.*;
009: import fitnesse.authentication.*;
010:
011: public abstract class ResultResponder extends ChunkingResponder
012: implements SearchObserver, SecureResponder {
013: private int hits = 0;
014:
015: protected PageCrawler getPageCrawler() {
016: return root.getPageCrawler();
017: }
018:
019: protected void doSending() throws Exception {
020: HtmlPage page = context.htmlPageFactory.newPage();
021: String renderedPath = getRenderedPath();
022: page.title.use(getTitle() + ": " + renderedPath);
023: page.header.use(HtmlUtil.makeBreadCrumbsWithPageType(
024: renderedPath, getTitle()));
025: page.main.use(HtmlPage.BreakPoint);
026: page.divide();
027:
028: response.add(page.preDivision);
029: response.add(buildClientSideSortScriptTag().html());
030: response.add(buildFeedbackDiv().html());
031: response.add(getTableOpen());
032: response.add(buildHeaderRow().html());
033: response.add(getTbodyOpen());
034: startSearching();
035: response.add(getTbodyClose());
036: response.add(getTableClose());
037: response.add(buildTableSorterScript().html());
038: response.add(buildFeedbackModificationScript().html());
039: response.add(page.postDivision);
040: response.closeAll();
041: }
042:
043: private String getTbodyClose() {
044: return "</tbody>";
045: }
046:
047: private String getTbodyOpen() {
048: return "<tbody>";
049: }
050:
051: private HtmlTag buildClientSideSortScriptTag() {
052: HtmlTag tag = new HtmlTag("script");
053: tag.addAttribute("src", "/files/javascript/clientSideSort.js");
054: tag.add(" ");
055: return tag;
056: }
057:
058: private String getTableClose() {
059: return ChunkedResultsListingUtil.getTableCloseHtml();
060: }
061:
062: private String getTableOpen() {
063: return ChunkedResultsListingUtil
064: .getTableOpenHtml("searchResultsTable");
065: }
066:
067: private HtmlTag buildFeedbackModificationScript() throws Exception {
068: HtmlTag script = new HtmlTag("script");
069: script.addAttribute("language", "javascript");
070: script
071: .add("document.getElementById(\"feedback\").innerHTML = '"
072: + getPageFooterInfo(hits) + "'");
073: return script;
074: }
075:
076: private HtmlTag buildTableSorterScript() throws Exception {
077: HtmlTag script = new HtmlTag("script");
078: script.addAttribute("language", "javascript");
079: script
080: .add("tableSorter = new TableSorter('searchResultsTable', new DateParser("
081: + getDateFormatJavascriptRegex()
082: + ",8,2,3,4,5,6));");
083: return script;
084: }
085:
086: public static String getDateFormatJavascriptRegex() {
087: return "/^(\\w+) (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) (\\d+) (\\d+).(\\d+).(\\d+) (\\w+) (\\d+)$/";
088: }
089:
090: private HtmlTag buildHeaderRow() {
091: HtmlTag thead = new HtmlTag("thead");
092: HtmlTag headerRow = new HtmlTag("tr");
093: headerRow.add(buildPageColumnHeader());
094: headerRow.add(buildLastModifiedColumnHeader());
095: thead.add(headerRow);
096: return thead;
097: }
098:
099: private HtmlTag buildLastModifiedColumnHeader() {
100: HtmlTag lastModifiedColumnHeader = new HtmlTag("td",
101: buildSortLink("LastModified", "1, 'date'"));
102: lastModifiedColumnHeader.addAttribute("class", "resultsHeader");
103: return lastModifiedColumnHeader;
104: }
105:
106: private HtmlTag buildPageColumnHeader() {
107: HtmlTag pageColumnHeader = new HtmlTag("td", buildSortLink(
108: "Page", "0"));
109: pageColumnHeader.addAttribute("class", "resultsHeader");
110: return pageColumnHeader;
111: }
112:
113: private HtmlTag buildSortLink(String text, String args) {
114: HtmlTag link = new HtmlTag("a");
115: link.addAttribute("href", "javascript:void(tableSorter.sort("
116: + args + "));");
117: link.add(text);
118: return link;
119: }
120:
121: private HtmlTag buildFeedbackDiv() {
122: HtmlTag feedback = new HtmlTag("div", "Searching...");
123: feedback.addAttribute("id", "feedback");
124: return feedback;
125: }
126:
127: public void hit(WikiPage page) throws Exception {
128: hits++;
129: String fullPathName = PathParser.render(getPageCrawler()
130: .getFullPath(page));
131:
132: HtmlTag row = new HtmlTag("tr");
133: row.addAttribute("class", "resultsRow" + getRow());
134:
135: HtmlTag link = new HtmlTag("a", fullPathName);
136: link.addAttribute("href", fullPathName);
137:
138: row.add(new HtmlTag("td", link));
139: row.add(new HtmlTag("td", ""
140: + page.getData().getProperties()
141: .getLastModificationTime()));
142: response.add(row.html());
143: }
144:
145: private int nextRow = 0;
146:
147: private int getRow() {
148: return (nextRow++ % 2) + 1;
149: }
150:
151: protected abstract String getTitle() throws Exception;
152:
153: protected abstract String getPageFooterInfo(int hits)
154: throws Exception;
155:
156: protected abstract void startSearching() throws Exception;
157:
158: public SecureOperation getSecureOperation() {
159: return new SecureReadOperation();
160: }
161: }
|