From 2b41dde1e3a116b5991232a9101aef09a3700370 Mon Sep 17 00:00:00 2001
From: hansen <dominik_hansen@web.de>
Date: Mon, 11 Jan 2016 15:11:20 +0100
Subject: [PATCH] generating a log file on demand

---
 src/main/java/de/tlc4b/Log.java            | 61 ++++++++++++++++++++++
 src/main/java/de/tlc4b/TLC4B.java          | 39 +++++++++++++-
 src/main/java/de/tlc4b/TLCRunner.java      |  5 ++
 src/main/java/de/tlc4b/util/StopWatch.java |  2 +-
 4 files changed, 104 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/de/tlc4b/Log.java

diff --git a/src/main/java/de/tlc4b/Log.java b/src/main/java/de/tlc4b/Log.java
new file mode 100644
index 0000000..431fd66
--- /dev/null
+++ b/src/main/java/de/tlc4b/Log.java
@@ -0,0 +1,61 @@
+package de.tlc4b;
+
+import static de.tlc4b.util.StopWatch.Watches.PARSING_TIME;
+
+import java.util.ArrayList;
+
+import de.tlc4b.tlc.TLCResults;
+import de.tlc4b.util.StopWatch;
+import de.tlc4b.util.StopWatch.Watches;
+
+public class Log {
+
+	private ArrayList<String> fieldNames = new ArrayList<>();
+	private ArrayList<String> fieldValues = new ArrayList<>();
+
+	public Log(TLC4B tlc4b, TLCResults tlcResults) {
+
+		fieldNames.add("Machine File");
+		String machineFile = tlc4b.getMainFile().getAbsolutePath();
+		fieldValues.add(machineFile);
+
+		fieldNames.add("TLC Model Checking Time (s)");
+		int tlcModelCheckingTime = tlcResults.getModelCheckingTime();
+		fieldValues.add(String.valueOf(tlcModelCheckingTime));
+
+		fieldNames.add("Parsing Time Of B machine (ms)");
+		long parseTime = StopWatch.getRunTime(PARSING_TIME);
+		fieldValues.add(String.valueOf(parseTime));
+
+		fieldNames.add("Translation Time (ms)");
+		long translationTime = StopWatch.getRunTime(Watches.TRANSLATION_TIME);
+		fieldValues.add(String.valueOf(translationTime));
+
+		fieldNames.add("Model Checking Time (ms)");
+		long modelCheckingTime = StopWatch
+				.getRunTime(Watches.MODEL_CHECKING_TIME);
+		fieldValues.add(String.valueOf(modelCheckingTime));
+
+	}
+
+	public String getCSVValueLine() {
+		return getCSVLine(fieldValues);
+	}
+
+	public String getCSVFieldNamesLine() {
+		return getCSVLine(fieldNames);
+	}
+
+	private String getCSVLine(ArrayList<String> list) {
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < list.size(); i++) {
+			sb.append(list.get(i));
+			if (i < list.size() - 1) {
+				sb.append(";");
+			}
+		}
+		sb.append("\n");
+		return sb.toString();
+	}
+
+}
diff --git a/src/main/java/de/tlc4b/TLC4B.java b/src/main/java/de/tlc4b/TLC4B.java
index 667c8a5..ed6d4f7 100644
--- a/src/main/java/de/tlc4b/TLC4B.java
+++ b/src/main/java/de/tlc4b/TLC4B.java
@@ -5,6 +5,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
@@ -30,6 +31,7 @@ public class TLC4B {
 	private File mainfile;
 	private String machineFileNameWithoutFileExtension;
 	// e.g. Test of file foo/bar/Test.mch
+	private String logFileString;
 
 	private File buildDir;
 
@@ -67,10 +69,11 @@ public class TLC4B {
 
 				TLCRunner.runTLC(tlc4b.machineFileNameWithoutFileExtension,
 						tlc4b.buildDir);
-
 				TLCResults results = new TLCResults(tlc4b.tlcOutputInfo);
 				results.evalResults();
 				tlc4b.printResults(results, TLC4BGlobals.isCreateTraceFile());
+				Log log = new Log(tlc4b, results);
+				tlc4b.createLogFile(log);
 				System.exit(0);
 
 			} catch (NoClassDefFoundError e) {
@@ -219,7 +222,6 @@ public class TLC4B {
 			TLCResults results = new TLCResults(tlc4b.tlcOutputInfo);
 			results.evalResults();
 			tlc4b.printResults(results, false);
-
 			System.exit(0);
 		}
 	}
@@ -259,6 +261,14 @@ public class TLC4B {
 				TLC4BGlobals.setDeleteOnExit(true);
 			} else if (args[index].toLowerCase().equals("-parinveval")) {
 				TLC4BGlobals.setPartialInvariantEvaluation(true);
+			} else if (args[index].toLowerCase().equals("-log")) {
+				index = index + 1;
+				if (index == args.length) {
+					throw new TLC4BIOException(
+							"Error: File requiered after option '-log'.");
+				}
+				logFileString = args[index];
+
 			} else if (args[index].toLowerCase().equals("-maxint")) {
 				index = index + 1;
 				if (index == args.length) {
@@ -382,6 +392,26 @@ public class TLC4B {
 		}
 	}
 
+	private void createLogFile(Log log) {
+		if (logFileString != null) {
+			File logFile = new File(logFileString);
+			FileWriter fw;
+			boolean fileExists = logFile.exists();
+			try {
+				fw = new FileWriter(logFile, true); // the true will append the
+													// new data
+				if (!fileExists) {
+					fw.write(log.getCSVFieldNamesLine());
+				}
+				fw.write(log.getCSVValueLine());
+				fw.close();
+				println("Log file: " + logFile.getAbsolutePath());
+			} catch (IOException e) {
+				new TLC4BIOException(e.getLocalizedMessage());
+			}
+		}
+	}
+
 	private void createFiles() {
 		boolean dirCreated = buildDir.mkdir();
 		if (dirCreated && TLC4BGlobals.isDeleteOnExit()) {
@@ -403,6 +433,7 @@ public class TLC4B {
 			println("Configuration file '" + configFile.getAbsolutePath()
 					+ "' created.");
 		}
+
 		createStandardModules();
 	}
 
@@ -501,4 +532,8 @@ public class TLC4B {
 		return machineFileNameWithoutFileExtension;
 	}
 
+	public File getMainFile(){
+		return this.mainfile;
+	}
+	
 }
diff --git a/src/main/java/de/tlc4b/TLCRunner.java b/src/main/java/de/tlc4b/TLCRunner.java
index 3087b77..d90fbef 100644
--- a/src/main/java/de/tlc4b/TLCRunner.java
+++ b/src/main/java/de/tlc4b/TLCRunner.java
@@ -1,5 +1,7 @@
 package de.tlc4b;
 
+import static de.tlc4b.util.StopWatch.Watches.MODEL_CHECKING_TIME;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -13,6 +15,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import de.tlc4b.util.StopWatch;
 import util.SimpleFilenameToStream;
 import util.ToolIO;
 import tlc2.TLC;
@@ -90,6 +93,7 @@ public class TLCRunner {
 	}
 
 	public static void runTLC(String machineName, File path) {
+		StopWatch.start(MODEL_CHECKING_TIME);
 		MP.println("--------------------------------");
 		MP.TLCOutputStream.changeOutputStream();
 		ToolIO.setMode(ToolIO.SYSTEM);
@@ -134,6 +138,7 @@ public class TLCRunner {
 		// return messages;
 		MP.TLCOutputStream.resetOutputStream();
 		MP.println("--------------------------------");
+		StopWatch.stop(MODEL_CHECKING_TIME);
 	}
 
 	private static void closeThreads() {
diff --git a/src/main/java/de/tlc4b/util/StopWatch.java b/src/main/java/de/tlc4b/util/StopWatch.java
index d93065f..b978519 100644
--- a/src/main/java/de/tlc4b/util/StopWatch.java
+++ b/src/main/java/de/tlc4b/util/StopWatch.java
@@ -9,7 +9,7 @@ public class StopWatch {
 	private static final Hashtable<Watches, Long> runTime = new Hashtable<Watches, Long>();
 	
 	public enum Watches{
-		PARSING_TIME, TRANSLATION_TIME, TLC_TIME, OVERALL_TIME
+		PARSING_TIME, TRANSLATION_TIME, TLC_TIME, OVERALL_TIME, MODEL_CHECKING_TIME
 	}
 	
 	public static void start(Watches watch){
-- 
GitLab