001package org.javasimon.utils; 002 003import org.javasimon.Stopwatch; 004import org.javasimon.StopwatchSample; 005 006/** 007 * Generates HTML page that generates JavaScript interactive graph based on Google Charts. 008 * http://code.google.com/apis/chart/ 009 * 010 * @author <a href="mailto:virgo47@gmail.com">Richard "Virgo" Richter</a> 011 */ 012public final class GoogleInteractiveChartGenerator { 013 private static final int ONE_BAR_WIDTH = 100; 014 015 private GoogleInteractiveChartGenerator() { 016 throw new AssertionError(); 017 } 018 019 /** 020 * Generates Google bar chart HTML5 source code for the provided samples. 021 * 022 * @param samples stopwatch samples 023 * @param title chart title 024 * @param divisor value divisor. For example: if values are in ns and ms are required, 025 * divisor should be set to 1000000. 026 * @param unit unit shown after values under every bar - TODO currently not used 027 * @return HTML5 source code displaying the chart 028 */ 029 public static String barChart(StopwatchSample[] samples, String title, double divisor, String unit) { 030 final StringBuilder result = new StringBuilder("<html>\n" + 031 " <head>\n" + 032 " <script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>\n" + 033 " <script type=\"text/javascript\">\n" + 034 " google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});\n" + 035 " google.setOnLoadCallback(drawChart);\n" + 036 " function drawChart() {\n" + 037 " var data = new google.visualization.DataTable();\n"); 038 result.append(" data.addColumn('string', 'stopwatch');\n" + 039 " data.addColumn('number', 'avg');\n" + 040 " data.addColumn('number', 'max');\n" + 041 " data.addColumn('number', 'min');\n" + 042 " data.addRows(").append(samples.length).append(");\n"); 043 044 int rowIndex = 0; 045 for (StopwatchSample sample : samples) { 046 Stopwatch stopwatch = (Stopwatch) sample; 047 048 result.append(" data.setValue(").append(rowIndex).append(", 0, '") 049 .append(stopwatch.getName()).append("');\n") 050 .append(" data.setValue(").append(rowIndex).append(", 1, ") 051 .append(stopwatch.getMean() / divisor).append(");\n") 052 .append(" data.setValue(").append(rowIndex).append(", 2, ") 053 .append(stopwatch.getMax() / divisor).append(");\n") 054 .append(" data.setValue(").append(rowIndex).append(", 3, ") 055 .append(stopwatch.getMin() / divisor).append(");\n"); 056 rowIndex++; 057 } 058 059 result.append(" var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));\n" + 060 " chart.draw(data, {width: "). 061 append(ONE_BAR_WIDTH * (1 + samples.length)). 062 append(", height: 600, title: '"). 063 append(title). 064 append("',\n hAxis: {title: 'stopwatch', titleTextStyle: {color: 'red'}}\n" + 065 " });\n }\n" + 066 " </script>\n" + " </head>\n\n <body>\n <div id=\"chart_div\"></div>\n </body>\n</html>"); 067 return result.toString(); 068 } 069}