further fixes to the change reporting framework
[mir.git] / source / mircoders / producer / ChangeReportingProducerNode.java
1 package mircoders.producer;\r
2 \r
3 import mir.changetracker.ChangeTracker;\r
4 import mir.log.LoggerWrapper;\r
5 import mir.producer.AbstractProducerNode;\r
6 import mir.util.ParameterExpander;\r
7 import mir.util.StringRoutines;\r
8 import mircoders.global.MirGlobal;\r
9 \r
10 import java.io.File;\r
11 import java.io.FileNotFoundException;\r
12 import java.io.FileOutputStream;\r
13 import java.io.OutputStream;\r
14 import java.io.OutputStreamWriter;\r
15 import java.io.PrintWriter;\r
16 import java.util.Collection;\r
17 import java.util.HashMap;\r
18 import java.util.Iterator;\r
19 import java.util.List;\r
20 import java.util.Map;\r
21 \r
22 public class ChangeReportingProducerNode extends AbstractProducerNode {\r
23   private String format;\r
24   private String outputFile;\r
25   private String basePath;\r
26   private String exclusionList;\r
27 \r
28   public ChangeReportingProducerNode(String anOutputFile, String aFormat, String aBasePath, String anExclusionList) {\r
29     format = aFormat;\r
30     outputFile = anOutputFile;\r
31     basePath = aBasePath;\r
32     exclusionList = anExclusionList;\r
33   }\r
34 \r
35   public void produce(Map aValueMap, String aVerb, LoggerWrapper aLogger) {\r
36     try {\r
37       File file = new File(ParameterExpander.expandExpression(aValueMap, outputFile));\r
38       OutputStream stream = null;\r
39       try {\r
40         stream = new FileOutputStream(file, true);\r
41       }\r
42       catch (FileNotFoundException e) {\r
43         aLogger.error("Can't write open report file", e);\r
44 \r
45         return;\r
46       }\r
47 \r
48       try {\r
49         PrintWriter writer = new PrintWriter(new OutputStreamWriter(stream));\r
50         try {\r
51           String expandedBasePath = ParameterExpander.expandExpression(aValueMap, basePath);\r
52 \r
53           List excludedPaths = null;\r
54           if (exclusionList != null) {\r
55             String expandedExclusionList = ParameterExpander.expandExpression(aValueMap, exclusionList);\r
56             excludedPaths = StringRoutines.separateString(expandedExclusionList, ",");\r
57           }\r
58 \r
59           Collection changes = MirGlobal.getChangeEngine().getTracker().flushChanges(expandedBasePath, excludedPaths);\r
60 \r
61           Iterator i = changes.iterator();\r
62           while (i.hasNext()) {\r
63             ChangeTracker.Change change = (ChangeTracker.Change) i.next();\r
64 \r
65             Map changeMap = new HashMap();\r
66 \r
67             // the absolute path of the change needs to be transformed into a path relative\r
68             //    to base\r
69             changeMap.put("path", change.getPath().substring(expandedBasePath.length()));\r
70             changeMap.put("type", change.getType().getName());\r
71             changeMap.put("date", change.getDate());\r
72 \r
73             aValueMap.put("change", changeMap);\r
74             String line = ParameterExpander.expandExpression(aValueMap, format);\r
75             writer.println(line);\r
76           }\r
77         }\r
78         finally {\r
79           try {\r
80             writer.close();\r
81           }\r
82           catch (Throwable t) {\r
83             aLogger.info("Can't close report file");\r
84           }\r
85         }\r
86       }\r
87       finally {\r
88         try {\r
89           stream.close();\r
90         }\r
91         catch (Throwable t) {\r
92           aLogger.info("Can't close report file");\r
93         }\r
94       }\r
95     }\r
96     catch (Throwable t) {\r
97       aLogger.error("Error while writing change report file", t);\r
98     }\r
99   }\r
100 }\r