/* * * Copyright (c) void.fm * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * Neither the name void.fm nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ package etm.contrib.console.util; import etm.contrib.console.ConsoleRequest; import etm.contrib.console.ConsoleResponse; import etm.contrib.console.HttpConsoleServer; import etm.contrib.util.ExecutionAggregateComparator; import etm.core.aggregation.Aggregate; import etm.core.monitor.EtmException; import java.io.IOException; import java.net.URLEncoder; import java.util.Map; /** * Renderes a result for a measurement point. * * @author void.fm * @version $Revision$ */ public class DetailResultRenderer extends ConsoleRenderer { protected static final String ENCODING = HttpConsoleServer.DEFAULT_ENCODING; private String etmPointName; public DetailResultRenderer(ConsoleRequest aRequest, ConsoleResponse aResponse, ExecutionAggregateComparator aComparator, String aEtmPointName) { super(aRequest, aResponse, aComparator); etmPointName = aEtmPointName; } public void render(Map points) { Aggregate point = (Aggregate) points.get(etmPointName); try { writeDetailHtmlHead(etmPointName); response.write("<!-- Begin results -->"); response.write("<table>\n"); writeTableHeader(); if (point == null) { response.write(NO_RESULTS.toCharArray()); } else { SortedExecutionGraph graphSorted = new SortedExecutionGraph(point, comparator); response.write(" <tr>\n"); response.write(" <td>"); writeName(graphSorted, 0); response.write("</td>\n"); response.write(" <td>"); writeMeasurements(graphSorted, 0); response.write("</td>\n"); response.write(" <td>"); writeAverage(graphSorted, 0); response.write("</td>\n"); response.write(" <td>"); writeMin(graphSorted, 0); response.write("</td>\n"); response.write(" <td>"); writeMax(graphSorted, 0); response.write("</td>\n"); response.write(" <td>"); writeTotals(graphSorted, 0); response.write("</td>\n"); response.write(" </tr>\n"); } response.write(FOOTER); response.write("</table>\n"); response.write(" </body>\n</html>"); } catch (IOException e) { throw new EtmException("Unable to write to writer: " + e); } } protected void writeTableHeader() throws IOException { response.write(" <tr>\n"); response.write(" <th width=\"200\" "); if (ExecutionAggregateComparator.TYPE_NAME == comparator.getType()) { if (comparator.isDescending()) { response.write("class=\"descending\"><a href=\"?sort=name&order=asc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Measurement Point</a>"); } else { response.write("class=\"ascending\"><a href=\"?sort=name&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Measurement Point</a>"); } } else { response.write("><a href=\"?sort=name&order=asc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Measurement Point</a>"); } response.write("</th>\n"); response.write(" <th width=\"30\" "); if (ExecutionAggregateComparator.TYPE_EXCECUTIONS == comparator.getType()) { if (comparator.isDescending()) { response.write("class=\"descending\"><a href=\"?sort=executions&order=asc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">#</a>"); } else { response.write("class=\"ascending\"><a href=\"?sort=executions&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">#</a>"); } } else { response.write("><a href=\"?sort=executions&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">#</a> "); } response.write("</th>\n"); response.write(" <th width=\"80\" "); if (ExecutionAggregateComparator.TYPE_AVERAGE == comparator.getType()) { if (comparator.isDescending()) { response.write("class=\"descending\"><a href=\"?sort=average&order=asc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Average</a>"); } else { response.write("class=\"ascending\"><a href=\"?sort=average&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Average</a>"); } } else { response.write("><a href=\"?sort=average&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Average</a> "); } response.write("</th>\n"); response.write(" <th width=\"80\" "); if (ExecutionAggregateComparator.TYPE_MIN == comparator.getType()) { if (comparator.isDescending()) { response.write("class=\"descending\"><a href=\"?sort=min&order=asc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Min</a>"); } else { response.write("class=\"ascending\"><a href=\"?sort=min&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Min</a>"); } } else { response.write("><a href=\"?sort=min&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Min</a> "); } response.write("</th>\n"); response.write(" <th width=\"80\" "); if (ExecutionAggregateComparator.TYPE_MAX == comparator.getType()) { if (comparator.isDescending()) { response.write("class=\"descending\"><a href=\"?sort=max&order=asc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Max</a>"); } else { response.write("class=\"ascending\"><a href=\"?sort=max&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Max</a>"); } } else { response.write("><a href=\"?sort=max&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Max</a>"); } response.write("</th>\n"); response.write(" <th width=\"80\" "); if (ExecutionAggregateComparator.TYPE_TOTAL == comparator.getType()) { if (comparator.isDescending()) { response.write("class=\"descending\"><a href=\"?sort=total&order=asc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Total</a>"); } else { response.write("class=\"ascending\"><a href=\"?sort=total&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Total</a>"); } } else { response.write("><a href=\"?sort=total&order=desc&point=" + URLEncoder.encode(etmPointName, ENCODING) + "\">Total</a> "); } response.write("</th>\n"); response.write(" </tr>\n"); } }