View Javadoc

1   /*
2   
3       dsh-timer  Timer with nanosecond resolution and summary statistics
4       on recorded elapsed times.
5       Copyright (c) 2004-2013 held jointly by the individual authors.
6   
7       This library is free software; you can redistribute it and/or modify it
8       under the terms of the GNU Lesser General Public License as published
9       by the Free Software Foundation; either version 3 of the License, or (at
10      your option) any later version.
11  
12      This library is distributed in the hope that it will be useful, but WITHOUT
13      ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
14      FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15      License for more details.
16  
17      You should have received a copy of the GNU Lesser General Public License
18      along with this library;  if not, write to the Free Software Foundation,
19      Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA.
20  
21      > http://www.fsf.org/licensing/licenses/lgpl.html
22      > http://www.opensource.org/licenses/lgpl-license.php
23  
24  */
25  package org.dishevelled.timer.report;
26  
27  import java.io.IOException;
28  
29  import java.text.NumberFormat;
30  
31  import java.util.Map;
32  
33  import org.dishevelled.timer.Timer;
34  
35  /**
36   * Timer report in comma-separated value (CSV) format.
37   */
38  public final class CsvTimerReport
39      extends AbstractTimerReport
40  {
41      private final NumberFormat numberFormat;
42  
43      public CsvTimerReport(final NumberFormat numberFormat)
44      {
45          if (numberFormat == null)
46          {
47              throw new IllegalArgumentException("numberFormat must not be null");
48          }
49          this.numberFormat = numberFormat;
50      }
51  
52      /** {@inheritDoc} */
53      public <T extends Appendable> T append(final Map<? extends Runnable, Timer> timers, final T appendable)
54          throws IOException
55      {
56          if (timers == null)
57          {
58              throw new IllegalArgumentException("timers must not be null");
59          }
60          if (appendable == null)
61          {
62              throw new IllegalArgumentException("appendable must not be null");
63          }
64          append(appendable, "Runnable");
65          append(appendable, "Size");
66          append(appendable, "Min (ns)");
67          append(appendable, "Mean (ns)");
68          append(appendable, "Max (ns)");
69          append(appendable, "Standard Deviation (ns)");
70          appendLast(appendable, "Sum (ns)");
71  
72          for (Map.Entry<? extends Runnable, Timer> entry : timers.entrySet())
73          {
74              append(appendable, String.valueOf(entry.getKey()));
75              append(appendable, numberFormat.format(entry.getValue().size()));
76              append(appendable, numberFormat.format(entry.getValue().min()));
77              append(appendable, numberFormat.format(entry.getValue().mean()));
78              append(appendable, numberFormat.format(entry.getValue().max()));
79              append(appendable, numberFormat.format(entry.getValue().standardDeviation()));
80              appendLast(appendable, numberFormat.format(entry.getValue().sum()));
81          }
82          return appendable;
83      }
84  
85      private static <T extends Appendable> void append(final T appendable, final String value) throws IOException
86      {
87          appendable.append("\"");
88          appendable.append(value);
89          appendable.append("\",");
90      }
91  
92      private static <T extends Appendable> void appendLast(final T appendable, final String value) throws IOException
93      {
94          appendable.append("\"");
95          appendable.append(value);
96          appendable.append("\"\n");
97      }
98  }