1   package com.atlassian.performance;
2   
3   import java.io.File;
4   import java.io.FileWriter;
5   import java.io.IOException;
6   import java.io.Writer;
7   import java.util.*;
8   
9   public class PerformanceReporter
10  {
11      private List<TimeRecorder> recorders = new ArrayList<TimeRecorder>();
12  
13      private static final String SEPARATOR = ", ";
14      private static final String ENDLINE = "\n";
15  
16      public PerformanceReporter()
17      {
18  
19      }
20  
21      public void addRecorder(TimeRecorder recorder)
22      {
23          recorders.add(recorder);
24      }
25  
26      public void generateReport(Writer writer, boolean includeAutoGenEvents)  throws IOException
27      {
28          String[] columns = getColumnList(includeAutoGenEvents);
29  
30          writeColumns(writer, columns);
31  
32          for(TimeRecorder recorder : recorders)
33          {
34              writeRecord(writer, recorder.getTestName(), columns, recorder, includeAutoGenEvents);
35          }
36      }
37  
38      private void writeColumns(Writer writer, String[] columns) throws IOException
39      {
40          writer.write("Test");
41          for(String col : columns)
42          {
43              writer.write(SEPARATOR + col);
44          }
45          writer.write(ENDLINE);
46      }
47      
48      private void writeRecord(Writer writer, String testName, String[] columns, TimeRecorder recorder, boolean includeAutoGenEvents)
49              throws IOException
50      {
51          for(EventTime event : recorder.getEventTimes())
52          {
53              if (includeAutoGenEvents || (!event.isAutoGenerated()))
54              {
55                  writer.write(testName);
56  
57                  int pos = Arrays.binarySearch(columns, event.getEvent());
58  
59                  repeatWrite(writer, SEPARATOR, pos + 1);
60                  writer.write(Long.toString(event.getTime()));
61                  repeatWrite(writer, SEPARATOR, columns.length - pos -1);
62                  writer.write(ENDLINE);
63              }
64          }
65      }
66  
67      private void repeatWrite(Writer writer, String str, int times) throws IOException
68      {
69          for(int i = 0; i < times; i++)
70          {
71               writer.write(str);
72          }
73  
74      }
75  
76      public void writeReport(File dest, boolean includeAutoGenEvents) throws IOException
77      {
78          FileWriter fwriter = new FileWriter(dest);
79          generateReport(fwriter, includeAutoGenEvents);
80      }
81  
82      public String[] getColumnList(boolean includeAutoGenEvents)
83      {
84          Set<String> columns = new TreeSet<String>();
85          for(TimeRecorder recorder : recorders)
86          {
87              for(EventTime event : recorder.getEventTimes())
88              {
89                  if (includeAutoGenEvents || (!event.isAutoGenerated()))
90                  {
91                      columns.add(event.getEvent());
92                  }
93              }
94          }
95          String[] colArray = {};
96          colArray= (String[])columns.toArray(colArray);
97          Arrays.sort(colArray);
98          return colArray;
99      }
100 
101 }