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 }