--- /dev/null
+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