package at.ac.univie.mminf.qskos4j.cmd;
import at.ac.univie.mminf.qskos4j.issues.Issue;
import at.ac.univie.mminf.qskos4j.result.Result;
import org.openrdf.OpenRDFException;
import org.openrdf.model.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
class ReportCollector {
private final Logger logger = LoggerFactory.getLogger(ReportCollector.class);
private Collection<Issue> issues;
private String reportFileName;
private Collection<String> vocabFileNames;
private boolean includeSummary;
public ReportCollector(Collection<Issue> issues,
String reportFileName,
Collection<String> vocabFileNames,
boolean includeSummary) {
this.issues = issues;
this.reportFileName = reportFileName;
this.includeSummary = includeSummary;
this.vocabFileNames = vocabFileNames;
}
void outputIssuesReport(boolean shouldWriteGraphs)
throws IOException, OpenRDFException
{
File reportFile = createReportFile();
BufferedWriter reportWriter = new BufferedWriter(new FileWriter(reportFile));
processIssues();
String reportSummary = "";
if (includeSummary) {
reportSummary = createReportSummary();
logger.info("\n" +reportSummary);
}
writeReportHeader(reportWriter, reportFile, reportSummary);
writeReportBody(reportWriter, reportFile, shouldWriteGraphs);
reportWriter.close();
}
private void writeReportHeader(BufferedWriter reportWriter,
File vocabFile,
String reportSummary) throws IOException
{
String issuedDate = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z").format(new Date());
reportWriter.write("This is the quality report of the file(s) ");
Iterator<String> vocabIt = vocabFileNames.iterator();
while (vocabIt.hasNext()) {
String vocabFileName = vocabIt.next();
reportWriter.write(vocabFileName);
if (vocabIt.hasNext()) reportWriter.write(", ");
}
reportWriter.write(", generated by qSKOS on " +issuedDate);
reportWriter.newLine();
reportWriter.newLine();
reportWriter.write(reportSummary);
}
private void processIssues() throws OpenRDFException {
int issueNumber = 0;
Iterator<Issue> issueIt = issues.iterator();
while (issueIt.hasNext()) {
Issue issue = issueIt.next();
issueNumber++;
logger.info("Processing issue " + issueNumber + " of " + issues.size() + " (" + issue.getName() + ")");
issue.getResult();
}
logger.info("Report complete!");
}
private String createReportSummary() throws IOException, OpenRDFException {
StringBuffer summary = new StringBuffer();
summary.append("* Summary of Quality Issue Occurrences:\n");
for (Issue issue : issues) {
summary.append(issue.getName() + ": " + prepareOccurrenceText(issue) + "\n");
}
summary.append("\n");
return summary.toString();
}
private String prepareOccurrenceText(Issue issue) throws OpenRDFException {
String occurrenceText = "";
if (issue.getResult().isProblematic()) {
occurrenceText = "FAIL";
try {
String occurrenceCount = Long.toString(issue.getResult().occurrenceCount());
occurrenceText += " (" +occurrenceCount+ ")";
}
catch (UnsupportedOperationException e) {
// ignore this
}
}
else {
occurrenceText = "OK (no potential problems found)";
}
return occurrenceText;
}
private void writeReportBody(BufferedWriter reportWriter,
File reportFile,
boolean shouldWriteGraphs)
throws IOException, OpenRDFException
{
reportWriter.write("* Detailed coverage of each Quality Issue:\n\n");
Iterator<Issue> issueIt = issues.iterator();
while (issueIt.hasNext()) {
Issue issue = issueIt.next();
writeTextReport(issue, reportWriter);
if (issueIt.hasNext()) {
reportWriter.newLine();
}
if (shouldWriteGraphs) {
writeGraphFiles(issue, getDotFilesPath(reportFile));
}
}
}
private File createReportFile() throws IOException {
File file = new File(reportFileName);
file.createNewFile();
return file;
}
private void writeTextReport(Issue issue, BufferedWriter writer)
throws IOException, OpenRDFException
{
writer.write(createIssueHeader(issue));
writer.newLine();
issue.getResult().generateReport(writer, Result.ReportFormat.TXT, Result.ReportStyle.SHORT);
writer.newLine();
issue.getResult().generateReport(writer, Result.ReportFormat.TXT, Result.ReportStyle.EXTENSIVE);
writer.newLine();
writer.flush();
}
private String createIssueHeader(Issue issue) {
String header = "--- " +issue.getName();
URI weblink = issue.getWeblink();
header += "\nDescription: " +issue.getDescription();
if (weblink != null) {
header += "\nDetailed information: " +weblink.stringValue();
}
return header;
}
private String getDotFilesPath(File reportFile) {
String absolutePath = reportFile.getAbsolutePath();
return absolutePath.substring(0, absolutePath.lastIndexOf(File.separator));
}
private void writeGraphFiles(Issue issue, String dotFilesPath) throws IOException, OpenRDFException {
BufferedWriter graphFileWriter = new BufferedWriter(new FileWriter(dotFilesPath + issue.getId() + ".dot"));
issue.getResult().generateReport(graphFileWriter, Result.ReportFormat.DOT);
graphFileWriter.close();
}
}