package org.visage.runtime.sequences;
import java.io.*;
import java.util.*;
import org.apache.tools.ant.util.FileUtils;
/**
*
* @author Michael Heinrichs
*/
public class Logger {
private LinkedHashSet<String>tests = new LinkedHashSet<String>();
private List<TestSeriesResult>oldResults = new ArrayList<TestSeriesResult>();
private TestSeriesResult newResults;
private File logFile;
public static boolean logTestResult(String logFileName, TestSeriesResult newResults) {
return new Logger(logFileName, newResults).run();
}
private Logger(String logFileName, TestSeriesResult newResults) {
this.logFile = new File(logFileName);
this.newResults = newResults;
}
private boolean run() {
if (logFile.exists()) {
if (! readLogFile()) {
return false;
}
try {
FileUtils.getFileUtils().copyFile(logFile.getAbsolutePath(), logFile.getAbsolutePath()+".bak");
} catch (IOException ex) {
System.err.println("Error creating backup of log-file.");
System.err.println("Cowardly refusing to overwrite old file.");
return false;
}
}
tests.addAll(newResults.data.keySet());
return writeLogFile();
}
private boolean writeLogFile() {
final int length = tests.size();
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(logFile));
// print first line
writer.write("Timestamp,Description,");
for (String testname : tests) {
writer.write(testname);
writer.write(TestResult.EMPTY.toString());
}
writer.newLine();
// print second line
writer.write(",,");
for (int i=0; i<length; i++) {
writer.write(TestResult.FORMAT);
}
writer.newLine();
// print old data
for (TestSeriesResult cur : oldResults) {
writer.write(cur.toString(tests.iterator()));
writer.newLine();
}
// print new data
writer.write(newResults.toString(tests.iterator()));
writer.newLine();
writer.close();
} catch (IOException ex) {
System.err.println("IOException while writing log-file: " + ex.getLocalizedMessage());
return false;
}
return true;
}
private boolean readLogFile() {
try {
BufferedReader reader = new BufferedReader (new FileReader(logFile));
String line;
if ((line = reader.readLine()) == null) {
System.err.println("Error reading old log-file");
return false;
}
String[] parts = line.split(",");
for (int i=2; i<parts.length; i++)
tests.add(parts[i]);
if ((line = reader.readLine()) == null) {
System.err.println("Error reading old log-file");
return false;
}
parts = line.split(",");
StringBuilder sb = new StringBuilder(parts[2]);
sb.append(",");
for (int i=3; i<parts.length && !parts[2].equalsIgnoreCase(parts[i]); i++) {
sb.append(parts[i]);
sb.append(",");
}
String format = sb.toString();
while ((line = reader.readLine()) != null) {
oldResults.add(TestSeriesResult.parse(line, tests.iterator(), format));
}
} catch (IOException ex) {
System.err.println("IOException while reading log-file: " + ex.getLocalizedMessage());
return false;
} catch (IllegalArgumentException ex) {
System.err.println("Parsing error while reading log-file");
return false;
}
return true;
}
}