package fitnesse.responders.testHistory;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import fitnesse.FitNesseContext;
import fitnesse.authentication.SecureOperation;
import fitnesse.authentication.SecureResponder;
import fitnesse.authentication.SecureReadOperation;
import fitnesse.html.template.HtmlPage;
import fitnesse.html.template.PageTitle;
import fitnesse.http.Request;
import fitnesse.http.Response;
import fitnesse.http.SimpleResponse;
import fitnesse.reporting.history.ExecutionReport;
import fitnesse.reporting.history.PageHistory;
import fitnesse.reporting.history.TestExecutionReport;
import fitnesse.reporting.history.TestHistory;
import fitnesse.reporting.history.TestResultRecord;
import fitnesse.responders.ErrorResponder;
import fitnesse.wiki.PathParser;
import util.FileUtil;
public class ExecutionLogResponder implements SecureResponder {
private SimpleDateFormat dateFormat = new SimpleDateFormat(PageHistory.TEST_RESULT_FILE_DATE_PATTERN);
private File resultsDirectory;
private FitNesseContext context;
@Override
public Response makeResponse(FitNesseContext context, Request request) throws Exception {
this.context = context;
PageHistory pageHistory = getPageHistory(request);
String date = request.getInput("resultDate");
Date resultDate;
if (date == null || "latest".equals(date)) {
resultDate = pageHistory.getLatestDate();
} else {
try {
resultDate = dateFormat.parse(date);
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date format provided: should be " + PageHistory.TEST_RESULT_FILE_DATE_PATTERN + ".", e);
}
}
TestResultRecord testResultRecord = pageHistory.get(resultDate);
try {
return makeExecutionLogResponse(request, resultDate, testResultRecord);
} catch (Exception e) {
return makeCorruptFileResponse(request);
}
}
private Response makeCorruptFileResponse(Request request) throws Exception {
return new ErrorResponder("Corrupt Test Result File").makeResponse(context, request);
}
private Response makeExecutionLogResponse(Request request, Date resultDate, TestResultRecord testResultRecord) throws Exception {
String content = FileUtil.getFileContent(testResultRecord.getFile());
ExecutionReport report = ExecutionReport.makeReport(content);
HtmlPage page = context.pageFactory.newPage();
String tags = "";
if (report instanceof TestExecutionReport && !((TestExecutionReport) report).getResults().isEmpty()) {
tags = ((TestExecutionReport) report).getResults().get(0).getTags();
}
PageTitle pageTitle = new PageTitle("Execution Log", PathParser.parse(request.getResource()), tags);
page.setPageTitle(pageTitle);
page.setTitle("Execution Log");
page.setNavTemplate("viewNav");
page.put("currentDate", resultDate);
page.put("resultDate", dateFormat.format(resultDate));
page.put("version", report.getVersion());
page.put("viewLocation", request.getResource());
page.put("runTime", report.getTotalRunTimeInMillis() / 1000);
page.put("logs", report.getExecutionLogs());
page.setMainTemplate("executionLog");
SimpleResponse response = new SimpleResponse();
response.setContent(page.html());
return response;
}
private PageHistory getPageHistory(Request request) {
if (resultsDirectory == null)
resultsDirectory = context.getTestHistoryDirectory();
String pageName = request.getResource();
TestHistory history = new TestHistory(resultsDirectory, pageName);
return history.getPageHistory(pageName);
}
public void setResultsDirectory(File resultsDirectory) {
this.resultsDirectory = resultsDirectory;
}
@Override
public SecureOperation getSecureOperation() {
return new SecureReadOperation();
}
}