// 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.run; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedList; import java.util.List; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import util.Clock; import fitnesse.components.CommandRunner; import fitnesse.html.HtmlTag; import fitnesse.html.HtmlText; import fitnesse.html.HtmlUtil; import fitnesse.html.RawHtml; import fitnesse.html.TagGroup; import fitnesse.responders.ErrorResponder; import fitnesse.responders.PageFactory; import fitnesse.wiki.PageCrawler; import fitnesse.wiki.PageData; import fitnesse.wiki.PathParser; import fitnesse.wiki.VirtualEnabledPageCrawler; import fitnesse.wiki.WikiPage; import fitnesse.wiki.WikiPagePath; public class ExecutionLog { public static final String ErrorLogName = "ErrorLogs"; private PageCrawler crawler; private static SimpleDateFormat makeDateFormat() { //SimpleDateFormat is not thread safe, so we need to create each instance independently. return new SimpleDateFormat("h:mm:ss a (z) 'on' EEEE, MMMM d, yyyy"); } private final String errorLogPageName; private final WikiPagePath errorLogPagePath; private final WikiPage root; private final WikiPage testPage; private final CommandRunner runner; private final PageFactory pageFactory; private final List<String> reasons = new LinkedList<String>(); private final List<Throwable> exceptions = new LinkedList<Throwable>(); public ExecutionLog(WikiPage testPage, CommandRunner client, PageFactory pageFactory) { this.testPage = testPage; runner = client; this.pageFactory = pageFactory; crawler = testPage.getPageCrawler(); crawler.setDeadEndStrategy(new VirtualEnabledPageCrawler()); root = crawler.getRoot(testPage); errorLogPagePath = crawler.getFullPath(testPage).addNameToFront(ErrorLogName); errorLogPageName = PathParser.render(errorLogPagePath); } void addException(Throwable e) { exceptions.add(e); } void addReason(String reason) { if (!reasons.contains(reason)) reasons.add(reason); } public void publish() { String content = buildLogContent(); WikiPage errorLogPage = crawler.addPage(root, errorLogPagePath); PageData data = errorLogPage.getData(); data.setContent(content); errorLogPage.commit(data); } String buildLogContent() { VelocityContext context = new VelocityContext(); context.put("currentDate", makeDateFormat().format(Clock.currentDate())); context.put("testPage", "." + PathParser.render(crawler.getFullPath(testPage))); context.put("runner", runner); exceptions.addAll(runner.getExceptions()); context.put("exceptions", exceptions); return pageFactory.render(context, "executionLog.vm"); } int exceptionCount() { return exceptions.size(); } String getErrorLogPageName() { return errorLogPageName; } boolean hasCapturedOutput() { return runner.wroteToErrorStream() || runner.wroteToOutputStream(); } public int getExitCode() { return runner.getExitCode(); } public CommandRunner getCommandRunner() { return runner; } }