| /* |
| * Copyright (c) 2004, 2005, Oracle and/or its affiliates. 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 of Oracle 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. |
| */ |
| |
| /** |
| * XMLHTMLReporter.java |
| * |
| * Generates HTML reports from XML results |
| * |
| * @author Rakesh Menon |
| */ |
| |
| package j2dbench.report; |
| |
| import java.io.*; |
| import java.util.*; |
| import java.text.DecimalFormat; |
| import java.text.SimpleDateFormat; |
| |
| public class XMLHTMLReporter { |
| |
| /** |
| * Flag to indicate - Generate new report or append to existing report |
| */ |
| private static final int HTMLGEN_FILE_NEW = 1; |
| private static final int HTMLGEN_FILE_UPDATE = 2; |
| |
| /** |
| * Path to results directory where all results are stored |
| */ |
| public static String resultsDir = "."; |
| |
| /** |
| * Holds the groups and corresponding group-display-names |
| */ |
| public static List groups = new ArrayList(); |
| public static Map groupNames = new HashMap(); |
| |
| /** |
| * Level at which tests are grouped to be displayed in summary |
| */ |
| public static int LEVEL = 2; |
| |
| /** |
| * Color -> Better, Same, Worse |
| */ |
| private static final String[] color = {"#99FF99", "#CCFFFF", "#FFCC00"}; |
| |
| /** |
| * String for holding base-build and target-build version |
| */ |
| private static String baseBuild = ""; |
| private static String targetBuild = ""; |
| |
| private static final DecimalFormat decimalFormat = |
| new DecimalFormat("0.##"); |
| private static final SimpleDateFormat dateFormat = |
| new SimpleDateFormat("EEE, MMM d, yyyy G 'at' HH:mm:ss z"); |
| |
| public static void setGroupLevel(int level) { |
| XMLHTMLReporter.LEVEL = level; |
| } |
| |
| /** |
| * Add Test Group to the list |
| */ |
| private static void addGroup(String testName) { |
| |
| String testNameSplit[] = testName.replace('.', '_').split("_"); |
| String group = testNameSplit[0]; |
| for(int i=1; i<LEVEL; i++) { |
| group = group + "." + testNameSplit[i]; |
| } |
| |
| if( ! groups.contains(group)) { |
| groups.add(group); |
| groupNames.put(group, getDisplayGroupName(group)); |
| } |
| } |
| |
| /** |
| * Generate a Display Name for this group |
| */ |
| private static String getDisplayGroupName(String group) { |
| |
| String groupSplit[] = group.replace('.', '_').split("_"); |
| |
| StringBuffer groupName = new StringBuffer(); |
| String tempName = null; |
| |
| for(int i=0; i<groupSplit.length; i++) { |
| tempName = groupSplit[i].substring(0, 1).toUpperCase() + |
| groupSplit[i].substring(1); |
| if(i == 0) { |
| groupName.append(tempName); |
| } else { |
| groupName.append(" " + tempName); |
| } |
| } |
| |
| return groupName.toString(); |
| } |
| |
| /** |
| * Get the group to which this testcase belongs |
| */ |
| private static String getGroup(String testName) { |
| |
| String testNameSplit[] = testName.replace('.', '_').split("_"); |
| String group = testNameSplit[0]; |
| for(int i=1; i<LEVEL; i++) { |
| group = group + "." + testNameSplit[i]; |
| } |
| |
| return group; |
| } |
| |
| /** |
| * Opens a File and returns a PrintWriter instance based on new/update |
| * option specified in argument. |
| */ |
| private static PrintWriter openFile(String name, int nSwitch) { |
| |
| FileOutputStream file = null; |
| OutputStreamWriter writer = null; |
| |
| try { |
| switch (nSwitch) { |
| case 1: // HTMLGEN_FILE_NEW |
| file = new FileOutputStream(name, false); |
| break; |
| case 2: // HTMLGEN_FILE_UPDATE |
| file = new FileOutputStream(name, true); |
| break; |
| } |
| writer = new OutputStreamWriter(file); |
| } catch (IOException ee) { |
| System.out.println("Error opening file: " + ee); |
| System.exit(1); |
| } |
| |
| return new PrintWriter(new BufferedWriter(writer)); |
| } |
| |
| /** |
| * Generate an HTML report based on the XML results file passed - |
| * J2DBench_Results.html |
| */ |
| public static void generateReport(String resultsDir, String xmlFileName) { |
| |
| try { |
| |
| String strhtml = null; |
| String strstr = null; |
| String[] tempstr2 = new String[2]; |
| String[] tempstr = new String[2]; |
| |
| J2DAnalyzer.readResults(xmlFileName); |
| J2DAnalyzer.SingleResultSetHolder srsh = |
| (J2DAnalyzer.SingleResultSetHolder) |
| J2DAnalyzer.results.elementAt(0); |
| Enumeration enum_ = srsh.getKeyEnumeration(); |
| Vector keyvector = new Vector(); |
| while (enum_.hasMoreElements()) { |
| keyvector.add(enum_.nextElement()); |
| } |
| String keys[] = new String[keyvector.size()]; |
| keyvector.copyInto(keys); |
| J2DAnalyzer.sort(keys); |
| |
| File reportFile = new File(resultsDir, "J2DBench_Results.html"); |
| PrintWriter writer = |
| openFile(reportFile.getAbsolutePath(), HTMLGEN_FILE_NEW); |
| |
| writer.println("<html><body bgcolor=\"#ffffff\"><hr size=\"1\">"); |
| writer.println("<center><h2>J2DBench2 - Report</h2>"); |
| writer.println("</center><hr size=\"1\"><br>"); |
| writer.println("<table cols=\"2\" cellspacing=\"2\" " + |
| "cellpadding=\"5\" " + |
| "border=\"0\" width=\"80%\">"); |
| writer.println("<tr><td bgcolor=\"#CCCCFF\" colspan=\"2\">" + |
| "<b>Build Details</b></td></tr>"); |
| writer.println("<tr>"); |
| writer.println("<td bgcolor=\"#f0f0f0\">Description</td>"); |
| writer.println("<td>" + srsh.getDescription() + "</td>"); |
| writer.println("</tr>"); |
| writer.println("<tr><td bgcolor=\"#f0f0f0\">From Date</td>"); |
| writer.println("<td>" + |
| dateFormat.format(new Date(srsh.getStartTime())) + |
| "</td></tr>"); |
| writer.println("<tr><td bgcolor=\"#f0f0f0\">To Date</td>"); |
| writer.println("<td>" + |
| dateFormat.format(new Date(srsh.getEndTime())) + |
| "</td></tr>"); |
| writer.flush(); |
| |
| //System Properties |
| writer.println("<tr><td bgcolor=\"#CCCCFF\"><b>System Property</b>"+ |
| "</td><td bgcolor=\"#CCCCFF\">" + |
| "<b>Value</b></td></tr>"); |
| String key = null; |
| String value = null; |
| Map sysProps = srsh.getProperties(); |
| Iterator iter = sysProps.keySet().iterator(); |
| while(iter.hasNext()) { |
| key = iter.next().toString(); |
| value = sysProps.get(key).toString(); |
| writer.println("<tr><td bgcolor=\"#f0f0f0\">" + |
| key + "</td><td>" + value + " </td></tr>"); |
| } |
| writer.flush(); |
| |
| writer.println("</table>"); |
| writer.println("<br>"); |
| writer.println("<hr size=\"1\">"); |
| writer.println("<br>"); |
| |
| writer.println("<table cellspacing=\"0\" " + |
| "cellpadding=\"3\" border=\"1\" width=\"80%\">"); |
| writer.println("<tr>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Num Reps</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Num Units</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Name</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Options</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Score</b></td>"); |
| writer.println("</tr>"); |
| writer.flush(); |
| |
| for (int k = 0; k < keys.length; k++) { |
| |
| J2DAnalyzer.ResultHolder testResult = |
| srsh.getResultByKey(keys[k]); |
| |
| writer.println("<tr>"); |
| writer.println("<td>" + testResult.getReps() + "</td>"); |
| writer.println("<td>" + testResult.getUnits() + "</td>"); |
| writer.println("<td>" + testResult.getName() + "</td>"); |
| writer.println("<td valign=\"center\"><ul>"); |
| Map map = testResult.getOptions(); |
| iter = map.keySet().iterator(); |
| while(iter.hasNext()) { |
| key = iter.next().toString(); |
| value = map.get(key).toString(); |
| writer.println("<li>" + key + " = " + value + "</li>"); |
| } |
| writer.println("</ul></td>"); |
| writer.println("<td valign=\"center\">" + |
| decimalFormat.format(testResult.getScore()) + |
| "</td>"); |
| writer.println("</tr>"); |
| } |
| writer.flush(); |
| |
| writer.println("</table>"); |
| |
| writer.println("<br><hr WIDTH=\"100%\" size=\"1\">"); |
| writer.println("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>"); |
| |
| writer.flush(); |
| writer.close(); |
| } |
| catch(Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| /** |
| * Generate the reports from the base & target result XML |
| */ |
| public static void generateComparisonReport(String resultsDir, |
| String baseXMLFileName, |
| String targetXMLFileName) { |
| |
| XMLHTMLReporter.resultsDir = resultsDir; |
| |
| //Get Base XML File ResultSetHolder |
| J2DAnalyzer.readResults(baseXMLFileName); |
| J2DAnalyzer.SingleResultSetHolder baseSRSH = |
| (J2DAnalyzer.SingleResultSetHolder) J2DAnalyzer.results.elementAt(0); |
| Enumeration baseEnum_ = baseSRSH.getKeyEnumeration(); |
| Vector baseKeyvector = new Vector(); |
| while (baseEnum_.hasMoreElements()) { |
| baseKeyvector.add(baseEnum_.nextElement()); |
| } |
| String baseKeys[] = new String[baseKeyvector.size()]; |
| baseKeyvector.copyInto(baseKeys); |
| J2DAnalyzer.sort(baseKeys); |
| |
| //Get Target XML File ResultSetHolder |
| J2DAnalyzer.readResults(targetXMLFileName); |
| J2DAnalyzer.SingleResultSetHolder targetSRSH = |
| (J2DAnalyzer.SingleResultSetHolder) |
| J2DAnalyzer.results.elementAt(1); |
| Enumeration targetEnum_ = baseSRSH.getKeyEnumeration(); |
| Vector targetKeyvector = new Vector(); |
| while (targetEnum_.hasMoreElements()) { |
| targetKeyvector.add(targetEnum_.nextElement()); |
| } |
| String targetKeys[] = new String[targetKeyvector.size()]; |
| targetKeyvector.copyInto(targetKeys); |
| J2DAnalyzer.sort(targetKeys); |
| |
| baseBuild = (String)baseSRSH.getProperties().get("java.vm.version"); |
| targetBuild = (String)targetSRSH.getProperties().get("java.vm.version"); |
| generateSysPropsReport(targetSRSH); |
| |
| File reportFile = new File(resultsDir, "J2DBench_Complete_Report.html"); |
| PrintWriter writer = openFile(reportFile.getAbsolutePath(), |
| HTMLGEN_FILE_NEW); |
| |
| String header = getHeader(baseSRSH, targetSRSH, |
| "J2DBench - Complete Report", |
| "System_Properties.html"); |
| writer.println(header); |
| writer.flush(); |
| |
| StringBuffer startTags = new StringBuffer(); |
| startTags.append("<tr>"); |
| startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Num Reps</b></td>"); |
| startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Num Units</b></td>"); |
| startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Name</b></td>"); |
| startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Options</b></td>"); |
| startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>" + baseBuild + " Score</b></td>"); |
| startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\"><b>" + |
| targetBuild + " Score</b></td>"); |
| startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>% Speedup</b></td>"); |
| startTags.append("</tr>"); |
| |
| StringBuffer worseResultTags = new StringBuffer(startTags.toString()); |
| StringBuffer sameResultTags = new StringBuffer(startTags.toString()); |
| StringBuffer betterResultTags = new StringBuffer(startTags.toString()); |
| |
| Map consolBaseRes = new HashMap(); |
| Map consolTargetResult = new HashMap(); |
| |
| Map testCaseBaseResult = new HashMap(); |
| Map testCaseResultCount = new HashMap(); |
| Map testCaseTargetResult = new HashMap(); |
| |
| for (int k = 0; k < targetKeys.length; k++) { |
| |
| J2DAnalyzer.ResultHolder baseTCR = |
| baseSRSH.getResultByKey(targetKeys[k]); |
| J2DAnalyzer.ResultHolder targetTCR = |
| targetSRSH.getResultByKey(targetKeys[k]); |
| |
| Object curTestCountObj = testCaseResultCount.get(baseTCR.getName()); |
| int curTestCount = 0; |
| if(curTestCountObj != null) { |
| curTestCount = ((Integer) curTestCountObj).intValue(); |
| } |
| curTestCount++; |
| testCaseBaseResult.put(baseTCR.getName() + "_" + |
| (curTestCount - 1), baseTCR); |
| testCaseTargetResult.put(targetTCR.getName() + "_" + |
| (curTestCount - 1), targetTCR); |
| testCaseResultCount.put(baseTCR.getName(), |
| new Integer(curTestCount)); |
| |
| /****************************************************************** |
| * Add the Test to Group List |
| ******************************************************************/ |
| addGroup(baseTCR.getName()); |
| |
| double baseScore = baseTCR.getScore(); |
| double targetScore = targetTCR.getScore(); |
| |
| int selColorIndex = selectColor(baseScore, targetScore); |
| |
| StringBuffer tagBuffer = new StringBuffer(); |
| |
| tagBuffer.append("<tr bgcolor=\""+ color[selColorIndex] + "\">"); |
| tagBuffer.append("<td align=\"center\">" + baseTCR.getScore() + |
| "</td>"); |
| tagBuffer.append("<td align=\"center\">" + baseTCR.getUnits() + |
| "</td>"); |
| tagBuffer.append("<td align=\"center\">" + baseTCR.getName() + |
| "</td>"); |
| tagBuffer.append("<td valign=\"center\"><ul>"); |
| Map map = baseTCR.getOptions(); |
| Iterator iter = map.keySet().iterator(); |
| while(iter.hasNext()) { |
| Object key = iter.next().toString(); |
| Object value = map.get(key).toString(); |
| tagBuffer.append("<li>" + key + " = " + value + "</li>"); |
| } |
| tagBuffer.append("</ul></td>"); |
| tagBuffer.append("<td valign=\"center\" align=\"center\">" + |
| decimalFormat.format(baseTCR.getScore()) + |
| "</td>"); |
| tagBuffer.append("<td valign=\"center\" align=\"center\">" + |
| decimalFormat.format(targetTCR.getScore()) + |
| "</td>"); |
| tagBuffer.append("<td valign=\"center\" align=\"center\">" + |
| decimalFormat.format( |
| calculateSpeedupPercentage( |
| baseTCR.getScore(), |
| targetTCR.getScore())) + "</td>"); |
| tagBuffer.append("</tr>"); |
| |
| switch(selColorIndex) { |
| case 0: |
| betterResultTags.append(tagBuffer.toString()); |
| break; |
| case 1: |
| sameResultTags.append(tagBuffer.toString()); |
| break; |
| case 2: |
| worseResultTags.append(tagBuffer.toString()); |
| break; |
| } |
| |
| Object curTotalScoreObj = consolBaseRes.get(baseTCR.getName()); |
| double curTotalScore = 0; |
| if(curTotalScoreObj != null) { |
| curTotalScore = ((Double) curTotalScoreObj).doubleValue(); |
| } |
| curTotalScore = curTotalScore + baseTCR.getScore(); |
| consolBaseRes.put(baseTCR.getName(), new Double(curTotalScore)); |
| |
| curTotalScoreObj = consolTargetResult.get(targetTCR.getName()); |
| curTotalScore = 0; |
| if(curTotalScoreObj != null) { |
| curTotalScore = ((Double) curTotalScoreObj).doubleValue(); |
| } |
| curTotalScore = curTotalScore + targetTCR.getScore(); |
| consolTargetResult.put(targetTCR.getName(), |
| new Double(curTotalScore)); |
| } |
| |
| writer.println("<br><hr WIDTH=\"100%\" size=\"1\">"); |
| writer.println("<A NAME=\"results\"></A><H3>Results:</H3>"); |
| |
| writer.println("<table cellspacing=\"0\" " + |
| "cellpadding=\"3\" border=\"1\" width=\"80%\">"); |
| |
| writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" + |
| "<font size=\"+1\">Tests which run BETTER on target" + |
| "</font></td></tr>"); |
| writer.println(betterResultTags.toString()); |
| writer.flush(); |
| |
| writer.println("<tr><td colspan=\"7\"> <br> </td></tr>"); |
| writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" + |
| "<font size=\"+1\">Tests which run " + |
| "SAME on target</font></td></tr>"); |
| writer.println(sameResultTags.toString()); |
| writer.flush(); |
| |
| writer.println("<tr><td colspan=\"7\"> <br> </td></tr>"); |
| writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" + |
| "<font size=\"+1\">Tests which run WORSE on target" + |
| "</font></td></tr>"); |
| writer.println(worseResultTags.toString()); |
| writer.flush(); |
| |
| writer.println("</table>"); |
| |
| writer.println(getFooter()); |
| writer.flush(); |
| |
| writer.close(); |
| |
| generateTestCaseSummaryReport(baseSRSH, targetSRSH, |
| consolBaseRes, consolTargetResult, |
| testCaseBaseResult, |
| testCaseResultCount, |
| testCaseTargetResult); |
| |
| generateGroupSummaryReport(baseSRSH, targetSRSH, |
| consolBaseRes, consolTargetResult, |
| testCaseBaseResult, |
| testCaseResultCount, testCaseTargetResult); |
| } |
| |
| /** |
| * Generate Group-Summary report - Summary_Report.html |
| */ |
| private static void generateGroupSummaryReport( |
| J2DAnalyzer.SingleResultSetHolder baseSRSH, |
| J2DAnalyzer.SingleResultSetHolder targetSRSH, |
| Map consolBaseResult, |
| Map consolTargetResult, |
| Map testCaseBaseResult, |
| Map testCaseResultCount, |
| Map testCaseTargetResult) { |
| |
| File groupSummaryReportFile = |
| new File(resultsDir, "Summary_Report.html"); |
| PrintWriter writer = |
| openFile(groupSummaryReportFile.getAbsolutePath(), |
| HTMLGEN_FILE_NEW); |
| |
| String header = getHeader(baseSRSH, targetSRSH, |
| "J2DBench - Summary Report", |
| "System_Properties.html"); |
| writer.println(header); |
| writer.flush(); |
| |
| writer.println("<br><hr size=\"1\">"); |
| |
| Map baseValuesMap = new HashMap(); |
| Map targetValuesMap = new HashMap(); |
| |
| String tempGroup = null; |
| for(int i=0; i<groups.size(); i++) { |
| tempGroup = groups.get(i).toString(); |
| baseValuesMap.put(tempGroup, new Double(0)); |
| targetValuesMap.put(tempGroup, new Double(0)); |
| } |
| |
| |
| Object key = null; |
| double baseValue = 0, targetValue = 0; |
| Iterator resultsIter = consolBaseResult.keySet().iterator(); |
| |
| while(resultsIter.hasNext()) { |
| |
| key = resultsIter.next(); |
| |
| baseValue = ((Double) consolBaseResult.get(key)).doubleValue(); |
| targetValue = ((Double) consolTargetResult.get(key)).doubleValue(); |
| |
| tempGroup = getGroup(key.toString()); |
| |
| Object curTotalScoreObj = null; |
| double curTotalScore = 0; |
| |
| curTotalScoreObj = baseValuesMap.get(tempGroup); |
| if(curTotalScoreObj != null) { |
| curTotalScore = ((Double) curTotalScoreObj).doubleValue(); |
| } |
| curTotalScore = curTotalScore + baseValue; |
| baseValuesMap.put(tempGroup, new Double(curTotalScore)); |
| |
| curTotalScore = 0; |
| curTotalScoreObj = targetValuesMap.get(tempGroup); |
| if(curTotalScoreObj != null) { |
| curTotalScore = ((Double) curTotalScoreObj).doubleValue(); |
| } |
| curTotalScore = curTotalScore + targetValue; |
| targetValuesMap.put(tempGroup, new Double(curTotalScore)); |
| } |
| |
| writer.println("<A NAME=\"results_summary\"></A>" + |
| "<H3>Results Summary:</H3>"); |
| writer.println("<table cols=\"4\" cellspacing=\"0\" " + |
| "cellpadding=\"3\" border=\"1\" width=\"80%\">"); |
| writer.println("<TR BGCOLOR=\"#CCCCFF\">"); |
| writer.println("<TD><B>Testcase</B></TD>"); |
| writer.println("<TD align=\"center\"><B>Score for " + baseBuild + |
| "</B></TD>"); |
| writer.println("<TD align=\"center\"><B>Score for " + targetBuild + |
| "</B></TD>"); |
| writer.println("<TD align=\"center\"><B>% Speedup</TD>"); |
| writer.println("</TR>"); |
| |
| StringBuffer betterResultTags = new StringBuffer(); |
| StringBuffer sameResultTags = new StringBuffer(); |
| StringBuffer worseResultTags = new StringBuffer(); |
| |
| resultsIter = baseValuesMap.keySet().iterator(); |
| |
| double speedup = 0; |
| |
| while(resultsIter.hasNext()) { |
| |
| key = resultsIter.next(); |
| |
| baseValue = ((Double) baseValuesMap.get(key)).doubleValue(); |
| targetValue = ((Double) targetValuesMap.get(key)).doubleValue(); |
| speedup = calculateSpeedupPercentage(baseValue, targetValue); |
| |
| int selColorIndex = selectColor(baseValue, targetValue); |
| |
| String tcFileName = key.toString().replace('.', '_'); |
| tcFileName = tcFileName.toLowerCase() + ".html"; |
| |
| switch(selColorIndex) { |
| case 0: |
| betterResultTags.append("<tr bgcolor=\""+ |
| color[selColorIndex] + "\">"); |
| betterResultTags.append("<td><a href=" + |
| "\"Testcase_Summary_Report.html#status_" + key + |
| "\">" + groupNames.get(key) + |
| "</a></td>"); |
| betterResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(baseValue) + |
| "</td>"); |
| betterResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(targetValue) + |
| "</td>"); |
| betterResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(speedup) + |
| "</td>"); |
| betterResultTags.append("</tr>"); |
| break; |
| case 1: |
| sameResultTags.append("<tr bgcolor=\""+ |
| color[selColorIndex] + "\">"); |
| sameResultTags.append("<td>" + |
| "<a href=\"Testcase_Summary_Report.html#status_" + key + |
| "\">" + groupNames.get(key) + |
| "</a></td>"); |
| sameResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(baseValue) + |
| "</td>"); |
| sameResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(targetValue) + |
| "</td>"); |
| sameResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(speedup) + |
| "</td>"); |
| sameResultTags.append("</tr>"); |
| break; |
| case 2: |
| worseResultTags.append("<tr bgcolor=\""+ |
| color[selColorIndex] + "\">"); |
| worseResultTags.append("<td>" + |
| "<a href=\"Testcase_Summary_Report.html#status_" + key + |
| "\">" + groupNames.get(key) + |
| "</a></td>"); |
| worseResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(baseValue) + |
| "</td>"); |
| worseResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(targetValue) + |
| "</td>"); |
| worseResultTags.append("<td align=\"center\">" + |
| decimalFormat.format(speedup) + |
| "</td>"); |
| worseResultTags.append("</tr>"); |
| break; |
| } |
| } |
| |
| writer.println(betterResultTags.toString()); |
| writer.flush(); |
| |
| writer.println(sameResultTags.toString()); |
| writer.flush(); |
| |
| writer.println(worseResultTags.toString()); |
| writer.flush(); |
| |
| writer.println("</table>"); |
| |
| writer.println(getFooter()); |
| writer.flush(); |
| writer.close(); |
| } |
| |
| /** |
| * Generate Testcase Summary Report - Testcase_Summary_Report.html |
| */ |
| private static void generateTestCaseSummaryReport( |
| J2DAnalyzer.SingleResultSetHolder baseSRSH, |
| J2DAnalyzer.SingleResultSetHolder targetSRSH, |
| Map consolBaseResult, |
| Map consolTargetResult, |
| Map testCaseBaseResult, |
| Map testCaseResultCount, |
| Map testCaseTargetResult) { |
| |
| File tcSummaryReportFile = |
| new File(resultsDir, "Testcase_Summary_Report.html"); |
| PrintWriter writer = |
| openFile(tcSummaryReportFile.getAbsolutePath(), HTMLGEN_FILE_NEW); |
| |
| String header = getHeader(baseSRSH, targetSRSH, |
| "J2DBench - Testcase Summary Report", |
| "System_Properties.html"); |
| writer.println(header); |
| writer.flush(); |
| |
| StringBuffer testResultsStartBuffer = new StringBuffer(); |
| testResultsStartBuffer.append("<TR BGCOLOR=\"#CCCCFF\">"); |
| testResultsStartBuffer.append("<TD><B>Testcase</B></TD>"); |
| testResultsStartBuffer.append("<TD align=\"center\"><B>Score for " + |
| baseBuild + "</B></TD>"); |
| testResultsStartBuffer.append("<TD align=\"center\"><B>Score for " + |
| targetBuild + "</B></TD>"); |
| testResultsStartBuffer.append("<TD align=\"center\"><B>% Speedup</TD>"); |
| testResultsStartBuffer.append("</TR>"); |
| |
| StringBuffer testResultsScoreBuffer = new StringBuffer(); |
| testResultsScoreBuffer.append("<table cols=\"4\" cellspacing=\"0\" " + |
| "cellpadding=\"3\" border=\"1\" " + |
| "width=\"80%\">"); |
| |
| StringBuffer betterResultTags = new StringBuffer(); |
| StringBuffer sameResultTags = new StringBuffer(); |
| StringBuffer worseResultTags = new StringBuffer(); |
| |
| Double baseValue = null, targetValue = null; |
| |
| String curGroupName = null; |
| String curTestName = null; |
| |
| Object[] groupNameArray = groups.toArray(); |
| Arrays.sort(groupNameArray); |
| |
| Object[] testCaseList = consolBaseResult.keySet().toArray(); |
| Arrays.sort(testCaseList); |
| |
| writer.println("<br><hr size=\"1\"><br>"); |
| writer.println("<A NAME=\"status\"></A><H3>Status:</H3>"); |
| |
| writer.println("<table cellspacing=\"0\" " + |
| "cellpadding=\"3\" border=\"1\" width=\"80%\">"); |
| |
| for(int j=0; j<groupNameArray.length; j++) { |
| |
| if(j != 0) { |
| testResultsScoreBuffer.append("<tr><td colspan=\"4\"> " + |
| "<br> </td></tr>"); |
| writer.println("<tr><td colspan=\"5\"> <br> " + |
| "</td></tr>"); |
| } |
| |
| curGroupName = groupNameArray[j].toString(); |
| |
| writer.println("<tr><td colspan=\"5\" valign=\"center\" " + |
| "bgcolor=\"#f0f0f0\">" + |
| "<A NAME=\"status_" + curGroupName + "\"></A>" + |
| "<font size=\"+1\">Status - " + |
| groupNames.get(curGroupName) + "</font></td></tr>"); |
| writer.println("<tr>"); |
| writer.println("<td bgcolor=\"#CCCCFF\"><b>Tests " + |
| "Performance</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>BETTER (Num / %)</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>SAME (Num / %)</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>WORSE (Num / %)</b></td>"); |
| writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Total</b></td>"); |
| writer.println("</tr>"); |
| writer.flush(); |
| |
| testResultsScoreBuffer.append("<tr><td colspan=\"4\" " + |
| "valign=\"center\" " + |
| "bgcolor=\"#f0f0f0\">" + |
| "<A NAME=\"test_result_" + |
| curGroupName + |
| "\"></A><font size=\"+1\">" + |
| "Test Results - " + |
| groupNames.get(curGroupName) + |
| "</font></td></tr>"); |
| testResultsScoreBuffer.append(testResultsStartBuffer); |
| |
| String tableTags[] = null; |
| |
| for(int i=0; i<testCaseList.length; i++) { |
| |
| curTestName = testCaseList[i].toString(); |
| |
| if(curTestName.startsWith(curGroupName)) { |
| |
| tableTags = generateTestCaseReport( |
| curGroupName, curTestName, baseSRSH, targetSRSH, |
| testCaseResultCount, testCaseBaseResult, |
| testCaseTargetResult); |
| |
| writer.println(tableTags[0]); |
| writer.flush(); |
| |
| testResultsScoreBuffer.append(tableTags[1]); |
| } |
| } |
| } |
| |
| testResultsScoreBuffer.append("</table>"); |
| writer.println("</table>"); |
| |
| writer.println("<br><hr size=\"1\"><br>"); |
| writer.println("<A NAME=\"test_results\"></A><H3>Test Results:</H3>"); |
| writer.println(testResultsScoreBuffer.toString()); |
| writer.flush(); |
| |
| writer.println(getFooter()); |
| writer.flush(); |
| |
| writer.close(); |
| } |
| |
| /** |
| *|----------|------------------------|--------------------------|-----------| |
| *| Testcase | Score for <base build> | Score for <target build> | % Speedup | |
| *|----------|------------------------|--------------------------|-----------| |
| * |
| */ |
| private static String getTestResultsTableForSummary(String testName, |
| double baseScore, |
| double targetScore) |
| { |
| |
| double totalScore = baseScore + targetScore; |
| |
| String fileName = testName.replace('.', '_'); |
| fileName = fileName.toLowerCase() + ".html"; |
| |
| int selColorIndex = selectColor(baseScore, targetScore); |
| |
| StringBuffer buffer = new StringBuffer(); |
| |
| buffer.append("<TR BGCOLOR=\"" + color[selColorIndex] + "\">"); |
| buffer.append("<TD><P><A HREF=\"testcases/" + fileName + |
| "\">" + testName + "</A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P><A HREF=\"testcases/" + |
| fileName + |
| "\"><B>" + decimalFormat.format(baseScore) + |
| "</B></A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P><A HREF=\"testcases/" + |
| fileName + "\"><B>" + decimalFormat.format(targetScore) + |
| "</B></A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P><A HREF=\"testcases/" + |
| fileName + "\"><B>" + |
| decimalFormat.format(calculateSpeedupPercentage( |
| baseScore, |
| targetScore)) + |
| "</B></A></P></TD>"); |
| buffer.append("</TR>"); |
| |
| return buffer.toString(); |
| } |
| |
| /** |
| *|-------------------|-------------------|-----------------|-------------------|--------| |
| *| Tests Performance | BETTER (Num / %) | SAME (Num / %) | WORSE ( Num / %) | Total | |
| *|-------------------|-------------------|-----------------|-------------------|--------| |
| * |
| */ |
| private static String getStatusTableForSummary( |
| String curGroupName, String testName, int nBetter, |
| int nSame, int nWorse) |
| { |
| |
| String fileName = testName.replace('.', '_'); |
| fileName = fileName.toLowerCase() + ".html"; |
| |
| int totalTests = nBetter + nSame + nWorse; |
| |
| StringBuffer buffer = new StringBuffer(); |
| |
| buffer.append("<TR>"); |
| buffer.append("<TD><P><A HREF=\"#test_result_" + curGroupName + |
| "\">" + testName + "</A></P></TD>"); |
| buffer.append("<TD BGCOLOR=\"#99FF99\" align=\"center\"><P>" + |
| "<A HREF=\"#test_result_" + curGroupName + |
| "\"><B>" + nBetter + "</A></B> (" + |
| (nBetter * 100)/totalTests + "%)</P></TD>"); |
| buffer.append("<TD BGCOLOR=\"#CCFFFF\" align=\"center\"><P>" + |
| "<A HREF=\"#test_result_" + curGroupName + |
| "\"><B>" + nSame + "</A></B> (" + |
| (nSame * 100)/totalTests + "%)</P></TD>"); |
| buffer.append("<TD BGCOLOR=\"#FFCC00\" align=\"center\"><P>" + |
| "<A HREF=\"#test_result_" + curGroupName + |
| "\"><B>" + nWorse + "</A></B> (" + |
| (nWorse * 100)/totalTests + "%)</P></TD>"); |
| buffer.append("<TD BGCOLOR=\"#FFFFFF\" align=\"center\"><P>" + |
| "<A HREF=\"#test_result_" + curGroupName + |
| "\"><B>" + totalTests + "</B></A></P></TD>"); |
| buffer.append("</TR>"); |
| |
| return buffer.toString(); |
| } |
| |
| /** |
| * |-------------------|-----------------|------------------------------| |
| * | Tests performance | Number of tests | % from total number of tests | |
| * |-------------------|-----------------|------------------------------| |
| * |
| */ |
| private static String getPerformanceTableForTestcase( |
| String testName, int nBetter, int nSame, int nWorse) { |
| |
| StringBuffer buffer = new StringBuffer(); |
| |
| int totalTests = nBetter + nSame + nWorse; |
| |
| buffer.append("<hr size=\"1\">"); |
| buffer.append("<H3>Status:</H3>"); |
| |
| buffer.append("<table cols=\"4\" cellspacing=\"0\" " + |
| "cellpadding=\"3\" border=\"1\" width=\"80%\">"); |
| buffer.append("<TR BGCOLOR=\"#CCCCFF\">"); |
| buffer.append("<TD align=\"center\"><B>Tests performance</B></TD>"); |
| buffer.append("<TD align=\"center\"><B>Number of tests</B></TD>"); |
| buffer.append("<TD align=\"center\"><B>% from total number of " + |
| "tests</B></TD>"); |
| buffer.append("</TR>"); |
| |
| buffer.append("<TR BGCOLOR=\"#99FF99\">"); |
| buffer.append("<TD><P><A HREF=\"#better\">" + |
| "Target is at least 10 percent BETTER</A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P><A HREF=\"#better\"><B>" + |
| nBetter + "</B></A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P>" + (nBetter * 100/totalTests) + |
| "</P></TD>"); |
| buffer.append("</TR>"); |
| |
| buffer.append("<TR BGCOLOR=\"#CCFFFF\">"); |
| buffer.append("<TD><P><A HREF=\"#same\">" + |
| "The same within 10 percent</A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P><A HREF=\"#same\"><B>" + |
| nSame + "</B></A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P>" + (nSame * 100/totalTests) + |
| "</P></TD>"); |
| buffer.append("</TR>"); |
| |
| buffer.append("<TR BGCOLOR=\"#FFCC00\">"); |
| buffer.append("<TD><P><A HREF=\"#worse\">" + |
| "Target is at least 10 percent WORSE</A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P><A HREF=\"#worse\"><B>" + |
| nWorse + "</B></A></P></TD>"); |
| buffer.append("<TD align=\"center\"><P>" + (nWorse * 100/totalTests) + |
| "</P></TD>"); |
| buffer.append("</TR>"); |
| |
| buffer.append("</TABLE>"); |
| |
| return buffer.toString(); |
| } |
| |
| /** |
| * |-----------|---------|--------------------|----------------------|------------| |
| * | Num Units | Options | <base build> Score | <target build> Score | % Speedup | |
| * |-----------|---------|--------------------|----------------------|------------| |
| * |
| * String[0] = getStatusTableForSummary() |
| * String[1] = getTestResultsTableForSummary() |
| * |
| * Generate Testcase Report - testcases/<testcase name>.html |
| */ |
| private static String[] generateTestCaseReport( |
| String curGroupName, |
| Object key, |
| J2DAnalyzer.SingleResultSetHolder baseSRSH, |
| J2DAnalyzer.SingleResultSetHolder targetSRSH, |
| Map testCaseResultCount, |
| Map testCaseBaseResult, |
| Map testCaseTargetResult) { |
| |
| int numBetterTestCases = 0; |
| int numWorseTestCases = 0; |
| int numSameTestCases = 0; |
| |
| StringBuffer tcStartTags = new StringBuffer(); |
| tcStartTags.append("<tr>"); |
| tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Num Units</b></td>"); |
| tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>Options</b></td>"); |
| tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\"><b>" + |
| baseBuild + " Score</b></td>"); |
| tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\"><b>" + |
| targetBuild + " Score</b></td>"); |
| tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" + |
| "<b>% Speedup</b></td>"); |
| tcStartTags.append("</tr>"); |
| |
| StringBuffer worseTestcaseResultTags = |
| new StringBuffer(tcStartTags.toString()); |
| StringBuffer sameTestcaseResultTags = |
| new StringBuffer(tcStartTags.toString()); |
| StringBuffer betterTestcaseResultTags = |
| new StringBuffer(tcStartTags.toString()); |
| |
| Object curTestCountObj = testCaseResultCount.get(key.toString()); |
| int curTestCount = 0; |
| if(curTestCountObj != null) { |
| curTestCount = ((Integer) curTestCountObj).intValue(); |
| } |
| |
| String fileName = key.toString().replace('.', '_'); |
| fileName = fileName.toLowerCase() + ".html"; |
| File testcaseReportFile = |
| new File(resultsDir + File.separator + "testcases", fileName); |
| PrintWriter writer = openFile( |
| testcaseReportFile.getAbsolutePath(), HTMLGEN_FILE_NEW); |
| |
| String header = getHeader(baseSRSH, targetSRSH, |
| "J2DBench - " + key.toString(), |
| "../System_Properties.html"); |
| writer.println(header); |
| writer.flush(); |
| |
| double totalBaseScore = 0; |
| double totalTargetScore = 0; |
| |
| for(int i=0; i<curTestCount; i++) { |
| |
| J2DAnalyzer.ResultHolder baseTCR = |
| (J2DAnalyzer.ResultHolder)testCaseBaseResult.get( |
| key.toString() + "_" + i); |
| J2DAnalyzer.ResultHolder targetTCR = |
| (J2DAnalyzer.ResultHolder) testCaseTargetResult.get( |
| key.toString() + "_" + i); |
| |
| double baseScore = baseTCR.getScore(); |
| double targetScore = targetTCR.getScore(); |
| |
| StringBuffer tcTagBuffer = new StringBuffer(); |
| |
| int selColorIndex = selectColor(baseScore, targetScore); |
| tcTagBuffer.append("<tr bgcolor=\""+ color[selColorIndex] + "\">"); |
| tcTagBuffer.append("<td align=\"center\">" + baseTCR.getUnits() + |
| "</td>"); |
| tcTagBuffer.append("<td valign=\"center\">"); |
| |
| Map map = baseTCR.getOptions(); |
| Iterator iter = map.keySet().iterator(); |
| Object subKey=null, subValue=null; |
| tcTagBuffer.append("<ul>"); |
| while(iter.hasNext()) { |
| subKey = iter.next().toString(); |
| subValue = map.get(subKey).toString(); |
| tcTagBuffer.append("<li>" + subKey + " = " + |
| subValue + "</li>"); |
| } |
| tcTagBuffer.append("</ul></td>"); |
| tcTagBuffer.append("<td valign=\"center\" align=\"center\">" + |
| decimalFormat.format(baseTCR.getScore()) + |
| "</td>"); |
| tcTagBuffer.append("<td valign=\"center\" align=\"center\">" + |
| decimalFormat.format(targetTCR.getScore()) + |
| "</td>"); |
| tcTagBuffer.append("<td valign=\"center\" align=\"center\">" + |
| decimalFormat.format( |
| calculateSpeedupPercentage( |
| baseTCR.getScore(), |
| targetTCR.getScore())) + |
| "</td>"); |
| tcTagBuffer.append("</tr>"); |
| |
| totalBaseScore = totalBaseScore + baseTCR.getScore(); |
| totalTargetScore = totalTargetScore + targetTCR.getScore(); |
| |
| switch(selColorIndex) { |
| case 0: |
| betterTestcaseResultTags.append(tcTagBuffer.toString()); |
| numBetterTestCases++; |
| break; |
| case 1: |
| sameTestcaseResultTags.append(tcTagBuffer.toString()); |
| numSameTestCases++; |
| break; |
| case 2: |
| worseTestcaseResultTags.append(tcTagBuffer.toString()); |
| numWorseTestCases++; |
| break; |
| } |
| } |
| |
| String performanceTable = |
| getPerformanceTableForTestcase(key.toString(), |
| numBetterTestCases, numSameTestCases, |
| numWorseTestCases); |
| |
| writer.println(performanceTable); |
| writer.flush(); |
| |
| writer.println("<hr size=\"1\">"); |
| writer.println("<A NAME=\"details\"></A><H3>Details:</H3>"); |
| |
| writer.println("<table cellspacing=\"0\" " + |
| "cellpadding=\"3\" border=\"1\" width=\"80%\">"); |
| |
| writer.println("<tr><td colspan=\"5\" " + |
| "valign=\"center\" bgcolor=\"#f0f0f0\">" + |
| "<a name=\"better\"></a><font size=\"+1\">" + |
| key.toString() + |
| " Tests which run BETTER on target</font></td></tr>"); |
| writer.println(betterTestcaseResultTags.toString()); |
| writer.flush(); |
| |
| writer.println("<tr><td colspan=\"5\"> <br> </td></tr>"); |
| |
| writer.println("<tr><td colspan=\"5\" " + |
| "valign=\"center\" bgcolor=\"#f0f0f0\">" + |
| "<a name=\"same\"></a><font size=\"+1\">" + |
| key.toString() + |
| " Tests which run SAME on target</font></td></tr>"); |
| writer.println(sameTestcaseResultTags.toString()); |
| writer.flush(); |
| |
| writer.println("<tr><td colspan=\"5\"> <br> </td></tr>"); |
| |
| writer.println("<tr><td colspan=\"5\" " + |
| "valign=\"center\" bgcolor=\"#f0f0f0\">" + |
| "<a name=\"worse\"></a><font size=\"+1\">" + |
| key.toString() + |
| " Tests which run WORSE on target</font></td></tr>"); |
| writer.println(worseTestcaseResultTags.toString()); |
| writer.flush(); |
| |
| writer.println("</table>"); |
| |
| writer.println(getFooter()); |
| writer.flush(); |
| |
| writer.close(); |
| |
| String statusTable = |
| getStatusTableForSummary(curGroupName, key.toString(), |
| numBetterTestCases, |
| numSameTestCases, numWorseTestCases); |
| |
| String testResultsTable = |
| getTestResultsTableForSummary(key.toString(), |
| totalBaseScore, totalTargetScore); |
| |
| return new String[] {statusTable, testResultsTable}; |
| } |
| |
| /** |
| * Returns footer tag for HTML files |
| */ |
| private static String getFooter() { |
| |
| StringBuffer buffer = new StringBuffer(); |
| |
| buffer.append("<br><hr WIDTH=\"100%\" size=\"1\">"); |
| buffer.append("<A NAME=\"legend\"></A><H3>Legend:</H3>"); |
| buffer.append("<table cellspacing=\"0\" cellpadding=\"3\" " + |
| "border=\"1\" width=\"80%\">"); |
| buffer.append("<TR BGCOLOR=\"" + color[0] + |
| "\"><TD>The result for " + targetBuild + |
| " is at least 10 percent BETTER than for " + baseBuild + |
| "</TD></TR>"); |
| buffer.append("<TR BGCOLOR=\"" + color[1] + |
| "\"><TD>The results for " + targetBuild + " and " + |
| baseBuild + " are within 10 percent</TD></TR>"); |
| buffer.append("<TR BGCOLOR=\"" + color[2] + |
| "\"><TD>The result for " + targetBuild + |
| " is at least 10 percent WORSE than " + baseBuild + |
| "</TD></TR>"); |
| buffer.append("<TR><TD>The 'Score' is a number of " + |
| "successful rendering " + |
| "operations per second</TD></TR>"); |
| buffer.append("</table>"); |
| |
| buffer.append("<br><hr WIDTH=\"100%\" size=\"1\">"); |
| buffer.append("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>"); |
| |
| return buffer.toString(); |
| } |
| |
| /** |
| * Returns header tag for HTML files |
| */ |
| private static String |
| getHeader(J2DAnalyzer.SingleResultSetHolder baseSRSH, |
| J2DAnalyzer.SingleResultSetHolder targetSRSH, |
| String title, |
| String sysPropLoc) |
| { |
| |
| StringBuffer buffer = new StringBuffer(); |
| |
| String headerTitle = getHeaderTitle(title); |
| buffer.append(headerTitle); |
| |
| //System Properties |
| buffer.append("<tr><td bgcolor=\"#CCCCFF\">" + |
| "<b><A HREF=\"" + sysPropLoc + "\">System Property</A>" + |
| "</b></td>" + |
| "<td bgcolor=\"#CCCCFF\"><b><A HREF=\"" + |
| sysPropLoc + "\">Value<A></b></td></tr>"); |
| Map sysProps = targetSRSH.getProperties(); |
| buffer.append("<tr><td bgcolor=\"#f0f0f0\">os.name</td><td>" + |
| sysProps.get("os.name") + "</td></tr>"); |
| buffer.append("<tr><td bgcolor=\"#f0f0f0\">os.version</td><td>" + |
| sysProps.get("os.version") + "</td></tr>"); |
| buffer.append("<tr><td bgcolor=\"#f0f0f0\">os.arch</td><td>" + |
| sysProps.get("os.arch") + "</td></tr>"); |
| buffer.append("<tr><td bgcolor=\"#f0f0f0\">sun.desktop</td><td>" + |
| sysProps.get("sun.desktop") + "</td></tr>"); |
| |
| buffer.append("</table>"); |
| |
| return buffer.toString(); |
| } |
| |
| /** |
| * Returns start tag and title tag for HTML files |
| */ |
| private static String getHeaderTitle(String title) { |
| |
| StringBuffer buffer = new StringBuffer(); |
| |
| buffer.append("<html><head><title>" + title + "</title></head>"); |
| buffer.append("<body bgcolor=\"#ffffff\"><hr size=\"1\">"); |
| buffer.append("<center><h2>" + title + "</h2>"); |
| buffer.append("</center><hr size=\"1\"><br>"); |
| buffer.append("<table cols=\"2\" cellspacing=\"2\" cellpadding=\"5\" " + |
| "border=\"0\" width=\"80%\">"); |
| buffer.append("<tr><td bgcolor=\"#CCCCFF\" colspan=\"2\">" + |
| "<b>Test Details</b></td></tr>"); |
| buffer.append("<tr><td bgcolor=\"#f0f0f0\">Base Build</td>"); |
| buffer.append("<td>" + baseBuild + "</td></tr>"); |
| buffer.append("<tr><td bgcolor=\"#f0f0f0\">Target Build</td>"); |
| buffer.append("<td>" + targetBuild + "</td></tr>"); |
| |
| return buffer.toString(); |
| } |
| |
| /** |
| * Generats System-Properties HTML file - System_Property.html |
| */ |
| private static void |
| generateSysPropsReport(J2DAnalyzer.SingleResultSetHolder srsh) |
| { |
| |
| File sysPropsFile = |
| new File(resultsDir, "System_Properties.html"); |
| PrintWriter writer = |
| openFile(sysPropsFile.getAbsolutePath(), HTMLGEN_FILE_NEW); |
| |
| String headerTitle = getHeaderTitle("System Properties"); |
| writer.println(headerTitle); |
| writer.flush(); |
| |
| writer.println("<tr><td bgcolor=\"#CCCCFF\"><b>" + |
| "System Property</b></td><td bgcolor=\"#CCCCFF\">" + |
| "<b>Value</b></td></tr>"); |
| |
| String key = null; |
| String value = null; |
| Map sysProps = srsh.getProperties(); |
| Iterator iter = sysProps.keySet().iterator(); |
| while(iter.hasNext()) { |
| key = iter.next().toString(); |
| value = sysProps.get(key).toString(); |
| writer.println("<tr><td bgcolor=\"#f0f0f0\">" + |
| key + "</td><td>" + value + "</td></tr>"); |
| } |
| writer.println("</table>"); |
| writer.flush(); |
| |
| writer.println("<br><hr WIDTH=\"100%\" size=\"1\">"); |
| writer.println("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>"); |
| |
| writer.flush(); |
| } |
| |
| /** |
| * Returns the index of color from color array based on the results |
| * Can change this implementation so as to select based on some analysis. |
| */ |
| private static int selectColor(double baseScore, double targetScore) { |
| |
| double res = calculateSpeedupPercentage(baseScore, targetScore); |
| |
| if (res < -10) { |
| return 2; |
| } else if (res > 10) { |
| return 0; |
| } else { |
| return 1; |
| } |
| } |
| |
| /** |
| * Calculate Speedup Percentage -> |
| * ((target_score - base_score) * 100) / baseScore |
| * Can change this implementation so as to provide some analysis. |
| */ |
| private static double calculateSpeedupPercentage(double baseScore, |
| double targetScore) |
| { |
| return ((targetScore - baseScore) * 100)/baseScore; |
| } |
| |
| private static void printUsage() { |
| String usage = |
| "\njava XMLHTMLReporter [options] " + |
| " \n\n" + |
| "where options include: " + |
| " \n" + |
| " -r | -results <result directory> " + |
| "directory to which reports are stored \n" + |
| " -basexml | -b <xml file path> " + |
| "path to base-build result \n" + |
| " -targetxml | -t <xml file path> " + |
| "path to target-build result \n" + |
| " -resultxml | -xml <xml file path> " + |
| "path to result XML \n" + |
| " -group | -g <level> " + |
| "group-level for tests \n" + |
| " " + |
| " [ 1 , 2 , 3 or 4 ] \n" + |
| " -analyzermode | -am " + |
| "mode to be used for finding score \n" + |
| " " + |
| " [ BEST , WORST , AVERAGE , MIDAVG ] "; |
| System.out.println(usage); |
| System.exit(0); |
| } |
| |
| /** |
| * main |
| */ |
| public static void main(String args[]) { |
| |
| String resDir = "."; |
| String baseXML = null; |
| String targetXML = null; |
| String resultXML = null; |
| int group = 2; |
| |
| /* ---- Analysis Mode ---- |
| BEST = 1; |
| WORST = 2; |
| AVERAGE = 3; |
| MIDAVG = 4; |
| ------------------------ */ |
| int analyzerMode = 4; |
| |
| try { |
| |
| for (int i = 0; i < args.length; i++) { |
| if (args[i].startsWith("-results") || |
| args[i].startsWith("-r")) |
| { |
| i++; |
| resDir = args[i]; |
| } else if (args[i].startsWith("-basexml") || |
| args[i].startsWith("-b")) |
| { |
| i++; |
| baseXML = args[i]; |
| } else if (args[i].startsWith("-targetxml") || |
| args[i].startsWith("-t")) |
| { |
| i++; |
| targetXML = args[i]; |
| } else if (args[i].startsWith("-resultxml") || |
| args[i].startsWith("-xml")) |
| { |
| i++; |
| resultXML = args[i]; |
| } else if (args[i].startsWith("-group") || |
| args[i].startsWith("-g")) |
| { |
| i++; |
| group = Integer.parseInt(args[i]); |
| System.out.println("Grouping Level for tests: " + group); |
| } else if (args[i].startsWith("-analyzermode") || |
| args[i].startsWith("-am")) |
| { |
| i++; |
| String strAnalyzerMode = args[i]; |
| if(strAnalyzerMode.equalsIgnoreCase("BEST")) { |
| analyzerMode = 0; |
| } else if (strAnalyzerMode.equalsIgnoreCase("WORST")) { |
| analyzerMode = 1; |
| } else if (strAnalyzerMode.equalsIgnoreCase("AVERAGE")) { |
| analyzerMode = 2; |
| } else if (strAnalyzerMode.equalsIgnoreCase("MIDAVG")) { |
| analyzerMode = 3; |
| } else { |
| printUsage(); |
| } |
| System.out.println("Analyzer-Mode: " + analyzerMode); |
| } |
| } |
| } |
| catch(Exception e) { |
| printUsage(); |
| } |
| |
| if(resDir != null) { |
| |
| XMLHTMLReporter.setGroupLevel(group); |
| J2DAnalyzer.setMode(analyzerMode); |
| |
| if(targetXML != null && baseXML != null) { |
| XMLHTMLReporter.generateComparisonReport(resDir, baseXML, |
| targetXML); |
| } else if (resultXML != null) { |
| XMLHTMLReporter.generateReport(resDir, resultXML); |
| } else { |
| printUsage(); |
| } |
| } else { |
| printUsage(); |
| } |
| } |
| } |