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 }