merged 1.1 branch into head
[mir.git] / source / mircoders / producer / ChangeReportingProducerNode.java
diff --git a/source/mircoders/producer/ChangeReportingProducerNode.java b/source/mircoders/producer/ChangeReportingProducerNode.java
new file mode 100644 (file)
index 0000000..c271a13
--- /dev/null
@@ -0,0 +1,100 @@
+package mircoders.producer;\r
+\r
+import mir.changetracker.ChangeTracker;\r
+import mir.log.LoggerWrapper;\r
+import mir.producer.AbstractProducerNode;\r
+import mir.util.ParameterExpander;\r
+import mir.util.StringRoutines;\r
+import mircoders.global.MirGlobal;\r
+\r
+import java.io.File;\r
+import java.io.FileNotFoundException;\r
+import java.io.FileOutputStream;\r
+import java.io.OutputStream;\r
+import java.io.OutputStreamWriter;\r
+import java.io.PrintWriter;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+public class ChangeReportingProducerNode extends AbstractProducerNode {\r
+  private String format;\r
+  private String outputFile;\r
+  private String basePath;\r
+  private String exclusionList;\r
+\r
+  public ChangeReportingProducerNode(String anOutputFile, String aFormat, String aBasePath, String anExclusionList) {\r
+    format = aFormat;\r
+    outputFile = anOutputFile;\r
+    basePath = aBasePath;\r
+    exclusionList = anExclusionList;\r
+  }\r
+\r
+  public void produce(Map aValueMap, String aVerb, LoggerWrapper aLogger) {\r
+    try {\r
+      File file = new File(ParameterExpander.expandExpression(aValueMap, outputFile));\r
+      OutputStream stream = null;\r
+      try {\r
+        stream = new FileOutputStream(file, true);\r
+      }\r
+      catch (FileNotFoundException e) {\r
+        aLogger.error("Can't write open report file", e);\r
+\r
+        return;\r
+      }\r
+\r
+      try {\r
+        PrintWriter writer = new PrintWriter(new OutputStreamWriter(stream));\r
+        try {\r
+          String expandedBasePath = ParameterExpander.expandExpression(aValueMap, basePath);\r
+\r
+          List excludedPaths = null;\r
+          if (exclusionList != null) {\r
+            String expandedExclusionList = ParameterExpander.expandExpression(aValueMap, exclusionList);\r
+            excludedPaths = StringRoutines.separateString(expandedExclusionList, ",");\r
+          }\r
+\r
+          Collection changes = MirGlobal.getChangeEngine().getTracker().flushChanges(expandedBasePath, excludedPaths);\r
+\r
+          Iterator i = changes.iterator();\r
+          while (i.hasNext()) {\r
+            ChangeTracker.Change change = (ChangeTracker.Change) i.next();\r
+\r
+            Map changeMap = new HashMap();\r
+\r
+            // the absolute path of the change needs to be transformed into a path relative\r
+            //    to base\r
+            changeMap.put("path", change.getPath().substring(expandedBasePath.length()));\r
+            changeMap.put("type", change.getType().getName());\r
+            changeMap.put("date", change.getDate());\r
+\r
+            aValueMap.put("change", changeMap);\r
+            String line = ParameterExpander.expandExpression(aValueMap, format);\r
+            writer.println(line);\r
+          }\r
+        }\r
+        finally {\r
+          try {\r
+            writer.close();\r
+          }\r
+          catch (Throwable t) {\r
+            aLogger.info("Can't close report file");\r
+          }\r
+        }\r
+      }\r
+      finally {\r
+        try {\r
+          stream.close();\r
+        }\r
+        catch (Throwable t) {\r
+          aLogger.info("Can't close report file");\r
+        }\r
+      }\r
+    }\r
+    catch (Throwable t) {\r
+      aLogger.error("Error while writing change report file", t);\r
+    }\r
+  }\r
+}\r