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}