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.run;
004:
005: import fitnesse.*;
006: import fitnesse.html.HtmlUtil;
007: import fitnesse.components.*;
008: import fitnesse.wiki.*;
009: import fitnesse.http.*;
010: import java.net.Socket;
011: import java.util.*;
012: import fit.Counts;
013:
014: public class FitClientResponder implements Responder,
015: ResponsePuppeteer, FitClientListener {
016: private FitNesseContext context;
017: private PageCrawler crawler;
018: private String resource;
019: private WikiPage page;
020: private boolean shouldIncludePaths;
021: private String suiteFilter;
022:
023: public Response makeResponse(FitNesseContext context,
024: Request request) throws Exception {
025: this .context = context;
026: crawler = context.root.getPageCrawler();
027: crawler.setDeadEndStrategy(new VirtualEnabledPageCrawler());
028: resource = request.getResource();
029: shouldIncludePaths = request.hasInput("includePaths");
030: suiteFilter = (String) request.getInput("suiteFilter");
031: return new PuppetResponse(this );
032: }
033:
034: public void readyToSend(ResponseSender sender) throws Exception {
035: Socket socket = sender.getSocket();
036: WikiPagePath pagePath = PathParser.parse(resource);
037: if (!crawler.pageExists(context.root, pagePath))
038: FitProtocol.writeData(notFoundMessage(), socket
039: .getOutputStream());
040: else {
041: page = crawler.getPage(context.root, pagePath);
042: PageData data = page.getData();
043:
044: if (data.hasAttribute("Suite"))
045: handleSuitePage(socket, page, context.root);
046: else if (data.hasAttribute("Test"))
047: handleTestPage(socket, data);
048: else
049: FitProtocol.writeData(notATestMessage(), socket
050: .getOutputStream());
051: }
052: sender.close();
053: }
054:
055: private void handleTestPage(Socket socket, PageData data)
056: throws Exception {
057: FitClient client = startClient(socket);
058:
059: if (shouldIncludePaths) {
060: String classpath = new ClassPathBuilder()
061: .getClasspath(page);
062: client.send(classpath);
063: }
064:
065: sendPage(data, client, true);
066: closeClient(client);
067: }
068:
069: private void handleSuitePage(Socket socket, WikiPage page,
070: WikiPage root) throws Exception {
071: FitClient client = startClient(socket);
072: List testPages = SuiteResponder.makePageList(page, root,
073: suiteFilter);
074:
075: if (shouldIncludePaths) {
076: String classpath = SuiteResponder.buildClassPath(testPages,
077: page);
078: client.send(classpath);
079: }
080:
081: for (Iterator iterator = testPages.iterator(); iterator
082: .hasNext();) {
083: WikiPage testPage = (WikiPage) iterator.next();
084: PageData testPageData = testPage.getData();
085: sendPage(testPageData, client, false);
086: }
087: closeClient(client);
088: }
089:
090: private void sendPage(PageData data, FitClient client,
091: boolean includeSuiteSetup) throws Exception {
092: String pageName = crawler.getRelativeName(page, data
093: .getWikiPage());
094: String testableHtml = HtmlUtil.testableHtml(data,
095: includeSuiteSetup);
096: String sendableHtml = pageName + "\n" + testableHtml;
097: client.send(sendableHtml);
098: }
099:
100: private void closeClient(FitClient client) throws Exception {
101: client.done();
102: client.join();
103: }
104:
105: private FitClient startClient(Socket socket) throws Exception {
106: FitClient client = new FitClient(this );
107: client.acceptSocket(socket);
108: return client;
109: }
110:
111: private String notATestMessage() {
112: return resource + " is neither a Test page nor a Suite page.";
113: }
114:
115: private String notFoundMessage() {
116: return "The page " + resource + " was not found.";
117: }
118:
119: public void acceptOutput(String output) throws Exception {
120: }
121:
122: public void acceptResults(Counts counts) throws Exception {
123: }
124:
125: public void exceptionOccurred(Exception e) {
126: }
127: }
|