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