/*
* Copyright [1999-2016] EMBL-European Bioinformatics Institute
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ensembl.healthcheck;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Logger;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.ensembl.healthcheck.testcase.EnsTestCase;
import org.ensembl.healthcheck.util.CollectionUtils;
/**
* Reporter that captures messages in a hash
*
* @author dstaines
*
*/
public class StandaloneReporter implements Reporter {
private final Logger logger;
public StandaloneReporter() {
this.logger = Logger.getLogger(StandaloneReporter.class.getSimpleName());
}
public StandaloneReporter(Logger logger) {
this.logger = logger;
}
private final Map<String, List<String>> failures = CollectionUtils.createHashMap();
private final Map<String, Map<String, List<String>>> output = CollectionUtils.createHashMap();
private final Map<String, List<String>> successes = CollectionUtils.createHashMap();
/*
* (non-Javadoc)
*
* @see
* org.ensembl.healthcheck.Reporter#finishTestCase(org.ensembl.healthcheck.
* testcase.EnsTestCase, boolean,
* org.ensembl.healthcheck.DatabaseRegistryEntry)
*/
@Override
public void finishTestCase(EnsTestCase testCase, boolean result, DatabaseRegistryEntry dbre) {
if (result) {
List<String> dbSuccess = successes.get(dbre.getName());
if (dbSuccess == null) {
dbSuccess = CollectionUtils.createArrayList();
successes.put(dbre.getName(), dbSuccess);
}
dbSuccess.add(testCase.getTestName());
} else {
List<String> dbFailure = failures.get(dbre.getName());
if (dbFailure == null) {
dbFailure = CollectionUtils.createArrayList();
failures.put(dbre.getName(), dbFailure);
}
dbFailure.add(testCase.getTestName());
}
}
public Map<String, List<String>> getFailures() {
return failures;
}
public Map<String, Map<String, List<String>>> getOutput() {
return output;
}
public Map<String, List<String>> getSuccesses() {
return successes;
}
/*
* (non-Javadoc)
*
* @see org.ensembl.healthcheck.Reporter#message(org.ensembl.healthcheck.
* ReportLine)
*/
@Override
public void message(ReportLine reportLine) {
logger.fine(reportLine.toString());
if (reportLine.getLevel() != ReportLine.CORRECT) {
Map<String, List<String>> dbOutput = output.get(reportLine.getDatabaseName());
if (dbOutput == null) {
dbOutput = CollectionUtils.createHashMap();
output.put(reportLine.getDatabaseName(), dbOutput);
}
List<String> testList = dbOutput.get(reportLine.getTestCase().getTestName());
if (testList == null) {
testList = CollectionUtils.createArrayList();
dbOutput.put(reportLine.getTestCase().getTestName(), testList);
}
testList.add(reportLine.getLevelAsString() + ": " + reportLine.getMessage());
}
}
/*
* (non-Javadoc)
*
* @see
* org.ensembl.healthcheck.Reporter#startTestCase(org.ensembl.healthcheck.
* testcase.EnsTestCase, org.ensembl.healthcheck.DatabaseRegistryEntry)
*/
@Override
public void startTestCase(EnsTestCase testCase, DatabaseRegistryEntry dbre) {
Map<String, List<String>> dbOutput = output.get(dbre.getName());
if (dbOutput == null) {
dbOutput = CollectionUtils.createHashMap();
output.put(dbre.getName(), dbOutput);
}
dbOutput.put(testCase.getTestName(), new ArrayList<String>());
}
/**
* @param outputFile
*/
public void writeFailureFile(String outputFile) {
Writer writer = null;
try {
writer = new BufferedWriter(new FileWriter(outputFile));
writeFailures(writer);
} catch (IOException e1) {
throw new RuntimeException(e1);
} finally {
IOUtils.closeQuietly(writer);
}
}
public void writeFailures(Writer writer) throws IOException {
for (Entry<String, List<String>> e : this.getFailures().entrySet()) {
writer.write("Failures detected for " + e.getKey() + ":\n");
for (String testCase : e.getValue()) {
writer.write(testCase);
writer.write(StringUtils.join(this.getOutput().get(e.getKey()).get(testCase), "\n"));
writer.write("\n");
}
}
}
}