1 /*
   2  * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  *
   8  *   - Redistributions of source code must retain the above copyright
   9  *     notice, this list of conditions and the following disclaimer.
  10  *
  11  *   - Redistributions in binary form must reproduce the above copyright
  12  *     notice, this list of conditions and the following disclaimer in the
  13  *     documentation and/or other materials provided with the distribution.
  14  *
  15  *   - Neither the name of Oracle nor the names of its
  16  *     contributors may be used to endorse or promote products derived
  17  *     from this software without specific prior written permission.
  18  *
  19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30  */
  31 
  32 /*
  33  * This source code is provided to illustrate the usage of a given feature
  34  * or technique and has been deliberately simplified. Additional steps
  35  * required for a production-quality application, such as security checks,
  36  * input validation and proper error handling, might not be present in
  37  * this sample code.
  38  */
  39 
  40 
  41 /**
  42  * XMLHTMLReporter.java
  43  *
  44  * Generates HTML reports from XML results
  45  *
  46  * @author Rakesh Menon
  47  */
  48 
  49 package j2dbench.report;
  50 
  51 import java.io.*;
  52 import java.util.*;
  53 import java.text.DecimalFormat;
  54 import java.text.SimpleDateFormat;
  55 
  56 public class XMLHTMLReporter {
  57 
  58     /**
  59      * Flag to indicate - Generate new report or append to existing report
  60      */
  61     private static final int HTMLGEN_FILE_NEW = 1;
  62     private static final int HTMLGEN_FILE_UPDATE = 2;
  63 
  64     /**
  65      * Path to results directory where all results are stored
  66      */
  67     public static String resultsDir = ".";
  68 
  69     /**
  70      * Holds the groups and corresponding group-display-names
  71      */
  72     public static List groups = new ArrayList();
  73     public static Map groupNames = new HashMap();
  74 
  75     /**
  76      * Level at which tests are grouped to be displayed in summary
  77      */
  78     public static int LEVEL = 2;
  79 
  80     /**
  81      * Color -> Better, Same, Worse
  82      */
  83     private static final String[] color = {"#99FF99", "#CCFFFF", "#FFCC00"};
  84 
  85     /**
  86      * String for holding base-build and target-build version
  87      */
  88     private static String baseBuild = "";
  89     private static String targetBuild = "";
  90 
  91     private static final DecimalFormat decimalFormat =
  92         new DecimalFormat("0.##");
  93     private static final SimpleDateFormat dateFormat =
  94         new SimpleDateFormat("EEE, MMM d, yyyy G 'at' HH:mm:ss z");
  95 
  96     public static void setGroupLevel(int level) {
  97         XMLHTMLReporter.LEVEL = level;
  98     }
  99 
 100     /**
 101      * Add Test Group to the list
 102      */
 103     private static void addGroup(String testName) {
 104 
 105         String testNameSplit[] = testName.replace('.', '_').split("_");
 106         String group = testNameSplit[0];
 107         for(int i=1; i<LEVEL; i++) {
 108             group = group + "." + testNameSplit[i];
 109         }
 110 
 111         if( ! groups.contains(group)) {
 112             groups.add(group);
 113             groupNames.put(group, getDisplayGroupName(group));
 114         }
 115     }
 116 
 117     /**
 118      * Generate a Display Name for this group
 119      */
 120     private static String getDisplayGroupName(String group) {
 121 
 122         String groupSplit[] = group.replace('.', '_').split("_");
 123 
 124         StringBuffer groupName = new StringBuffer();
 125         String tempName = null;
 126 
 127         for(int i=0; i<groupSplit.length; i++) {
 128             tempName = groupSplit[i].substring(0, 1).toUpperCase() +
 129                 groupSplit[i].substring(1);
 130             if(i == 0) {
 131                 groupName.append(tempName);
 132             } else {
 133                 groupName.append(" " + tempName);
 134             }
 135         }
 136 
 137         return groupName.toString();
 138     }
 139 
 140     /**
 141      * Get the group to which this testcase belongs
 142      */
 143     private static String getGroup(String testName) {
 144 
 145         String testNameSplit[] = testName.replace('.', '_').split("_");
 146         String group = testNameSplit[0];
 147         for(int i=1; i<LEVEL; i++) {
 148             group = group + "." + testNameSplit[i];
 149         }
 150 
 151         return group;
 152     }
 153 
 154     /**
 155      * Opens a File and returns a PrintWriter instance based on new/update
 156      * option specified in argument.
 157      */
 158     private static PrintWriter openFile(String name, int nSwitch) {
 159 
 160         FileOutputStream file = null;
 161         OutputStreamWriter writer = null;
 162 
 163         try {
 164             switch (nSwitch) {
 165                 case 1: // HTMLGEN_FILE_NEW
 166                     file = new FileOutputStream(name, false);
 167                     break;
 168                 case 2: // HTMLGEN_FILE_UPDATE
 169                     file = new FileOutputStream(name, true);
 170                     break;
 171             }
 172             writer = new OutputStreamWriter(file);
 173         } catch (IOException ee) {
 174             System.out.println("Error opening file: " + ee);
 175             System.exit(1);
 176         }
 177 
 178         return new PrintWriter(new BufferedWriter(writer));
 179     }
 180 
 181     /**
 182      * Generate an HTML report based on the XML results file passed -
 183      * J2DBench_Results.html
 184      */
 185     public static void generateReport(String resultsDir, String xmlFileName) {
 186 
 187         try {
 188 
 189             String strhtml = null;
 190             String strstr = null;
 191             String[] tempstr2 = new String[2];
 192             String[] tempstr = new String[2];
 193 
 194             J2DAnalyzer.readResults(xmlFileName);
 195             J2DAnalyzer.SingleResultSetHolder srsh =
 196                 (J2DAnalyzer.SingleResultSetHolder)
 197                 J2DAnalyzer.results.elementAt(0);
 198             Enumeration enum_ = srsh.getKeyEnumeration();
 199             Vector keyvector = new Vector();
 200             while (enum_.hasMoreElements()) {
 201                 keyvector.add(enum_.nextElement());
 202             }
 203             String keys[] = new String[keyvector.size()];
 204             keyvector.copyInto(keys);
 205             J2DAnalyzer.sort(keys);
 206 
 207             File reportFile = new File(resultsDir, "J2DBench_Results.html");
 208             PrintWriter writer =
 209                 openFile(reportFile.getAbsolutePath(), HTMLGEN_FILE_NEW);
 210 
 211             writer.println("<html><body bgcolor=\"#ffffff\"><hr size=\"1\">");
 212             writer.println("<center><h2>J2DBench2 - Report</h2>");
 213             writer.println("</center><hr size=\"1\"><br>");
 214             writer.println("<table cols=\"2\" cellspacing=\"2\" " +
 215                            "cellpadding=\"5\" " +
 216                            "border=\"0\" width=\"80%\">");
 217             writer.println("<tr><td bgcolor=\"#CCCCFF\" colspan=\"2\">" +
 218                            "<b>Build Details</b></td></tr>");
 219             writer.println("<tr>");
 220             writer.println("<td bgcolor=\"#f0f0f0\">Description</td>");
 221             writer.println("<td>" + srsh.getDescription() + "</td>");
 222             writer.println("</tr>");
 223             writer.println("<tr><td bgcolor=\"#f0f0f0\">From Date</td>");
 224             writer.println("<td>" +
 225                            dateFormat.format(new Date(srsh.getStartTime())) +
 226                            "</td></tr>");
 227             writer.println("<tr><td bgcolor=\"#f0f0f0\">To Date</td>");
 228             writer.println("<td>" +
 229                            dateFormat.format(new Date(srsh.getEndTime())) +
 230                            "</td></tr>");
 231             writer.flush();
 232 
 233             //System Properties
 234             writer.println("<tr><td bgcolor=\"#CCCCFF\"><b>System Property</b>"+
 235                            "</td><td bgcolor=\"#CCCCFF\">" +
 236                            "<b>Value</b></td></tr>");
 237             String key = null;
 238             String value = null;
 239             Map sysProps = srsh.getProperties();
 240             Iterator iter = sysProps.keySet().iterator();
 241             while(iter.hasNext()) {
 242                 key = iter.next().toString();
 243                 value = sysProps.get(key).toString();
 244                 writer.println("<tr><td bgcolor=\"#f0f0f0\">" +
 245                                key + "</td><td>" + value + "&nbsp;</td></tr>");
 246             }
 247             writer.flush();
 248 
 249             writer.println("</table>");
 250             writer.println("<br>");
 251             writer.println("<hr size=\"1\">");
 252             writer.println("<br>");
 253 
 254             writer.println("<table cellspacing=\"0\" " +
 255                            "cellpadding=\"3\" border=\"1\" width=\"80%\">");
 256             writer.println("<tr>");
 257             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 258                            "<b>Num Reps</b></td>");
 259             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 260                            "<b>Num Units</b></td>");
 261             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 262                            "<b>Name</b></td>");
 263             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 264                            "<b>Options</b></td>");
 265             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 266                            "<b>Score</b></td>");
 267             writer.println("</tr>");
 268             writer.flush();
 269 
 270             for (int k = 0; k < keys.length; k++) {
 271 
 272                 J2DAnalyzer.ResultHolder testResult =
 273                     srsh.getResultByKey(keys[k]);
 274 
 275                 writer.println("<tr>");
 276                 writer.println("<td>" + testResult.getReps() + "</td>");
 277                 writer.println("<td>" + testResult.getUnits() + "</td>");
 278                 writer.println("<td>" + testResult.getName() + "</td>");
 279                 writer.println("<td valign=\"center\"><ul>");
 280                 Map map = testResult.getOptions();
 281                 iter = map.keySet().iterator();
 282                 while(iter.hasNext()) {
 283                     key = iter.next().toString();
 284                     value = map.get(key).toString();
 285                     writer.println("<li>" + key + " = " + value + "</li>");
 286                 }
 287                 writer.println("</ul></td>");
 288                 writer.println("<td valign=\"center\">" +
 289                                decimalFormat.format(testResult.getScore()) +
 290                                "</td>");
 291                 writer.println("</tr>");
 292             }
 293             writer.flush();
 294 
 295             writer.println("</table>");
 296 
 297             writer.println("<br><hr WIDTH=\"100%\" size=\"1\">");
 298             writer.println("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>");
 299 
 300             writer.flush();
 301             writer.close();
 302         }
 303         catch(Exception e) {
 304             e.printStackTrace();
 305         }
 306     }
 307 
 308     /**
 309      * Generate the reports from the base & target result XML
 310      */
 311     public static void generateComparisonReport(String resultsDir,
 312                                                 String baseXMLFileName,
 313                                                 String targetXMLFileName) {
 314 
 315         XMLHTMLReporter.resultsDir = resultsDir;
 316 
 317         //Get Base XML File ResultSetHolder
 318         J2DAnalyzer.readResults(baseXMLFileName);
 319         J2DAnalyzer.SingleResultSetHolder baseSRSH =
 320             (J2DAnalyzer.SingleResultSetHolder) J2DAnalyzer.results.elementAt(0);
 321         Enumeration baseEnum_ = baseSRSH.getKeyEnumeration();
 322         Vector baseKeyvector = new Vector();
 323         while (baseEnum_.hasMoreElements()) {
 324             baseKeyvector.add(baseEnum_.nextElement());
 325         }
 326         String baseKeys[] = new String[baseKeyvector.size()];
 327         baseKeyvector.copyInto(baseKeys);
 328         J2DAnalyzer.sort(baseKeys);
 329 
 330         //Get Target XML File ResultSetHolder
 331         J2DAnalyzer.readResults(targetXMLFileName);
 332         J2DAnalyzer.SingleResultSetHolder targetSRSH =
 333             (J2DAnalyzer.SingleResultSetHolder)
 334                 J2DAnalyzer.results.elementAt(1);
 335         Enumeration targetEnum_ = baseSRSH.getKeyEnumeration();
 336         Vector targetKeyvector = new Vector();
 337         while (targetEnum_.hasMoreElements()) {
 338             targetKeyvector.add(targetEnum_.nextElement());
 339         }
 340         String targetKeys[] = new String[targetKeyvector.size()];
 341         targetKeyvector.copyInto(targetKeys);
 342         J2DAnalyzer.sort(targetKeys);
 343 
 344         baseBuild = (String)baseSRSH.getProperties().get("java.vm.version");
 345         targetBuild = (String)targetSRSH.getProperties().get("java.vm.version");
 346         generateSysPropsReport(targetSRSH);
 347 
 348         File reportFile = new File(resultsDir, "J2DBench_Complete_Report.html");
 349         PrintWriter writer = openFile(reportFile.getAbsolutePath(),
 350                                       HTMLGEN_FILE_NEW);
 351 
 352         String header = getHeader(baseSRSH, targetSRSH,
 353                                   "J2DBench - Complete Report",
 354                                   "System_Properties.html");
 355         writer.println(header);
 356         writer.flush();
 357 
 358         StringBuffer startTags = new StringBuffer();
 359         startTags.append("<tr>");
 360         startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 361                          "<b>Num Reps</b></td>");
 362         startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 363                          "<b>Num Units</b></td>");
 364         startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 365                          "<b>Name</b></td>");
 366         startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 367                          "<b>Options</b></td>");
 368         startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 369                          "<b>" + baseBuild + " Score</b></td>");
 370         startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\"><b>" +
 371                          targetBuild + " Score</b></td>");
 372         startTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 373                          "<b>% Speedup</b></td>");
 374         startTags.append("</tr>");
 375 
 376         StringBuffer worseResultTags = new StringBuffer(startTags.toString());
 377         StringBuffer sameResultTags = new StringBuffer(startTags.toString());
 378         StringBuffer betterResultTags = new StringBuffer(startTags.toString());
 379 
 380         Map consolBaseRes = new HashMap();
 381         Map consolTargetResult = new HashMap();
 382 
 383         Map testCaseBaseResult = new HashMap();
 384         Map testCaseResultCount = new HashMap();
 385         Map testCaseTargetResult = new HashMap();
 386 
 387         for (int k = 0; k < targetKeys.length; k++) {
 388 
 389             J2DAnalyzer.ResultHolder baseTCR =
 390                 baseSRSH.getResultByKey(targetKeys[k]);
 391             J2DAnalyzer.ResultHolder targetTCR =
 392                 targetSRSH.getResultByKey(targetKeys[k]);
 393 
 394             Object curTestCountObj = testCaseResultCount.get(baseTCR.getName());
 395             int curTestCount = 0;
 396             if(curTestCountObj != null) {
 397                 curTestCount = ((Integer) curTestCountObj).intValue();
 398             }
 399             curTestCount++;
 400             testCaseBaseResult.put(baseTCR.getName() + "_" +
 401                                    (curTestCount - 1), baseTCR);
 402             testCaseTargetResult.put(targetTCR.getName() + "_" +
 403                                      (curTestCount - 1), targetTCR);
 404             testCaseResultCount.put(baseTCR.getName(),
 405                                     new Integer(curTestCount));
 406 
 407             /******************************************************************
 408              * Add the Test to Group List
 409              ******************************************************************/
 410             addGroup(baseTCR.getName());
 411 
 412             double baseScore = baseTCR.getScore();
 413             double targetScore = targetTCR.getScore();
 414 
 415             int selColorIndex = selectColor(baseScore, targetScore);
 416 
 417             StringBuffer tagBuffer = new StringBuffer();
 418 
 419             tagBuffer.append("<tr bgcolor=\""+ color[selColorIndex] + "\">");
 420             tagBuffer.append("<td align=\"center\">" + baseTCR.getScore() +
 421                              "</td>");
 422             tagBuffer.append("<td align=\"center\">" + baseTCR.getUnits() +
 423                              "</td>");
 424             tagBuffer.append("<td align=\"center\">" + baseTCR.getName() +
 425                              "</td>");
 426             tagBuffer.append("<td valign=\"center\"><ul>");
 427             Map map = baseTCR.getOptions();
 428             Iterator iter = map.keySet().iterator();
 429             while(iter.hasNext()) {
 430                 Object key = iter.next().toString();
 431                 Object value = map.get(key).toString();
 432                 tagBuffer.append("<li>" + key + " = " + value + "</li>");
 433             }
 434             tagBuffer.append("</ul></td>");
 435             tagBuffer.append("<td valign=\"center\" align=\"center\">" +
 436                              decimalFormat.format(baseTCR.getScore()) +
 437                              "</td>");
 438             tagBuffer.append("<td valign=\"center\" align=\"center\">" +
 439                              decimalFormat.format(targetTCR.getScore()) +
 440                              "</td>");
 441             tagBuffer.append("<td valign=\"center\" align=\"center\">" +
 442                              decimalFormat.format(
 443                                  calculateSpeedupPercentage(
 444                                      baseTCR.getScore(),
 445                                      targetTCR.getScore())) + "</td>");
 446             tagBuffer.append("</tr>");
 447 
 448             switch(selColorIndex) {
 449                 case 0:
 450                     betterResultTags.append(tagBuffer.toString());
 451                     break;
 452                 case 1:
 453                     sameResultTags.append(tagBuffer.toString());
 454                     break;
 455                 case 2:
 456                     worseResultTags.append(tagBuffer.toString());
 457                     break;
 458             }
 459 
 460             Object curTotalScoreObj = consolBaseRes.get(baseTCR.getName());
 461             double curTotalScore = 0;
 462             if(curTotalScoreObj != null) {
 463                 curTotalScore = ((Double) curTotalScoreObj).doubleValue();
 464             }
 465             curTotalScore = curTotalScore + baseTCR.getScore();
 466             consolBaseRes.put(baseTCR.getName(), new Double(curTotalScore));
 467 
 468             curTotalScoreObj = consolTargetResult.get(targetTCR.getName());
 469             curTotalScore = 0;
 470             if(curTotalScoreObj != null) {
 471                 curTotalScore = ((Double) curTotalScoreObj).doubleValue();
 472             }
 473             curTotalScore = curTotalScore + targetTCR.getScore();
 474             consolTargetResult.put(targetTCR.getName(),
 475                                    new Double(curTotalScore));
 476         }
 477 
 478         writer.println("<br><hr WIDTH=\"100%\" size=\"1\">");
 479         writer.println("<A NAME=\"results\"></A><H3>Results:</H3>");
 480 
 481         writer.println("<table cellspacing=\"0\" " +
 482                          "cellpadding=\"3\" border=\"1\" width=\"80%\">");
 483 
 484         writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" +
 485                        "<font size=\"+1\">Tests which run BETTER on target" +
 486                        "</font></td></tr>");
 487         writer.println(betterResultTags.toString());
 488         writer.flush();
 489 
 490         writer.println("<tr><td colspan=\"7\">&nbsp;<br>&nbsp;</td></tr>");
 491         writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" +
 492                        "<font size=\"+1\">Tests which run " +
 493                        "SAME on target</font></td></tr>");
 494         writer.println(sameResultTags.toString());
 495         writer.flush();
 496 
 497         writer.println("<tr><td colspan=\"7\">&nbsp;<br>&nbsp;</td></tr>");
 498         writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" +
 499                        "<font size=\"+1\">Tests which run WORSE on target" +
 500                        "</font></td></tr>");
 501         writer.println(worseResultTags.toString());
 502         writer.flush();
 503 
 504         writer.println("</table>");
 505 
 506         writer.println(getFooter());
 507         writer.flush();
 508 
 509         writer.close();
 510 
 511         generateTestCaseSummaryReport(baseSRSH, targetSRSH,
 512                                       consolBaseRes, consolTargetResult,
 513                                       testCaseBaseResult,
 514                                       testCaseResultCount,
 515                                       testCaseTargetResult);
 516 
 517         generateGroupSummaryReport(baseSRSH, targetSRSH,
 518                                    consolBaseRes, consolTargetResult,
 519                                    testCaseBaseResult,
 520                                    testCaseResultCount, testCaseTargetResult);
 521     }
 522 
 523     /**
 524      * Generate Group-Summary report - Summary_Report.html
 525      */
 526     private static void generateGroupSummaryReport(
 527         J2DAnalyzer.SingleResultSetHolder baseSRSH,
 528         J2DAnalyzer.SingleResultSetHolder targetSRSH,
 529         Map consolBaseResult,
 530         Map consolTargetResult,
 531         Map testCaseBaseResult,
 532         Map testCaseResultCount,
 533         Map testCaseTargetResult) {
 534 
 535         File groupSummaryReportFile =
 536             new File(resultsDir, "Summary_Report.html");
 537         PrintWriter writer =
 538             openFile(groupSummaryReportFile.getAbsolutePath(),
 539                      HTMLGEN_FILE_NEW);
 540 
 541         String header = getHeader(baseSRSH, targetSRSH,
 542                                   "J2DBench - Summary Report",
 543                                   "System_Properties.html");
 544         writer.println(header);
 545         writer.flush();
 546 
 547         writer.println("<br><hr size=\"1\">");
 548 
 549         Map baseValuesMap = new HashMap();
 550         Map targetValuesMap = new HashMap();
 551 
 552         String tempGroup = null;
 553         for(int i=0; i<groups.size(); i++) {
 554             tempGroup = groups.get(i).toString();
 555             baseValuesMap.put(tempGroup, new Double(0));
 556             targetValuesMap.put(tempGroup, new Double(0));
 557         }
 558 
 559 
 560         Object key = null;
 561         double baseValue = 0, targetValue = 0;
 562         Iterator resultsIter = consolBaseResult.keySet().iterator();
 563 
 564         while(resultsIter.hasNext()) {
 565 
 566             key = resultsIter.next();
 567 
 568             baseValue = ((Double) consolBaseResult.get(key)).doubleValue();
 569             targetValue = ((Double) consolTargetResult.get(key)).doubleValue();
 570 
 571             tempGroup = getGroup(key.toString());
 572 
 573             Object curTotalScoreObj = null;
 574             double curTotalScore = 0;
 575 
 576             curTotalScoreObj = baseValuesMap.get(tempGroup);
 577             if(curTotalScoreObj != null) {
 578                 curTotalScore = ((Double) curTotalScoreObj).doubleValue();
 579             }
 580             curTotalScore = curTotalScore + baseValue;
 581             baseValuesMap.put(tempGroup, new Double(curTotalScore));
 582 
 583             curTotalScore = 0;
 584             curTotalScoreObj = targetValuesMap.get(tempGroup);
 585             if(curTotalScoreObj != null) {
 586                 curTotalScore = ((Double) curTotalScoreObj).doubleValue();
 587             }
 588             curTotalScore = curTotalScore + targetValue;
 589             targetValuesMap.put(tempGroup, new Double(curTotalScore));
 590         }
 591 
 592         writer.println("<A NAME=\"results_summary\"></A>" +
 593                        "<H3>Results Summary:</H3>");
 594         writer.println("<table cols=\"4\" cellspacing=\"0\" " +
 595                        "cellpadding=\"3\" border=\"1\" width=\"80%\">");
 596         writer.println("<TR BGCOLOR=\"#CCCCFF\">");
 597         writer.println("<TD><B>Testcase</B></TD>");
 598         writer.println("<TD align=\"center\"><B>Score for " + baseBuild +
 599                        "</B></TD>");
 600         writer.println("<TD align=\"center\"><B>Score for " + targetBuild +
 601                        "</B></TD>");
 602         writer.println("<TD align=\"center\"><B>% Speedup</TD>");
 603         writer.println("</TR>");
 604 
 605         StringBuffer betterResultTags = new StringBuffer();
 606         StringBuffer sameResultTags = new StringBuffer();
 607         StringBuffer worseResultTags = new StringBuffer();
 608 
 609         resultsIter = baseValuesMap.keySet().iterator();
 610 
 611         double speedup = 0;
 612 
 613         while(resultsIter.hasNext()) {
 614 
 615             key = resultsIter.next();
 616 
 617             baseValue = ((Double) baseValuesMap.get(key)).doubleValue();
 618             targetValue = ((Double) targetValuesMap.get(key)).doubleValue();
 619             speedup = calculateSpeedupPercentage(baseValue, targetValue);
 620 
 621             int selColorIndex = selectColor(baseValue, targetValue);
 622 
 623             String tcFileName = key.toString().replace('.', '_');
 624             tcFileName = tcFileName.toLowerCase() + ".html";
 625 
 626             switch(selColorIndex) {
 627                 case 0:
 628                     betterResultTags.append("<tr bgcolor=\""+
 629                                             color[selColorIndex] + "\">");
 630                     betterResultTags.append("<td><a href=" +
 631                         "\"Testcase_Summary_Report.html#status_" + key +
 632                                             "\">" + groupNames.get(key) +
 633                                             "</a></td>");
 634                     betterResultTags.append("<td align=\"center\">" +
 635                                             decimalFormat.format(baseValue) +
 636                                             "</td>");
 637                     betterResultTags.append("<td align=\"center\">" +
 638                                             decimalFormat.format(targetValue) +
 639                                             "</td>");
 640                     betterResultTags.append("<td align=\"center\">" +
 641                                             decimalFormat.format(speedup) +
 642                                             "</td>");
 643                     betterResultTags.append("</tr>");
 644                     break;
 645                 case 1:
 646                     sameResultTags.append("<tr bgcolor=\""+
 647                                           color[selColorIndex] + "\">");
 648                     sameResultTags.append("<td>" +
 649                         "<a href=\"Testcase_Summary_Report.html#status_" + key +
 650                                           "\">" + groupNames.get(key) +
 651                                           "</a></td>");
 652                     sameResultTags.append("<td align=\"center\">" +
 653                                           decimalFormat.format(baseValue) +
 654                                           "</td>");
 655                     sameResultTags.append("<td align=\"center\">" +
 656                                           decimalFormat.format(targetValue) +
 657                                           "</td>");
 658                     sameResultTags.append("<td align=\"center\">" +
 659                                           decimalFormat.format(speedup) +
 660                                           "</td>");
 661                     sameResultTags.append("</tr>");
 662                     break;
 663                 case 2:
 664                     worseResultTags.append("<tr bgcolor=\""+
 665                                            color[selColorIndex] + "\">");
 666                     worseResultTags.append("<td>" +
 667                         "<a href=\"Testcase_Summary_Report.html#status_" + key +
 668                                            "\">" + groupNames.get(key) +
 669                                            "</a></td>");
 670                     worseResultTags.append("<td align=\"center\">" +
 671                                            decimalFormat.format(baseValue) +
 672                                            "</td>");
 673                     worseResultTags.append("<td align=\"center\">" +
 674                                            decimalFormat.format(targetValue) +
 675                                            "</td>");
 676                     worseResultTags.append("<td align=\"center\">" +
 677                                            decimalFormat.format(speedup) +
 678                                            "</td>");
 679                     worseResultTags.append("</tr>");
 680                     break;
 681             }
 682         }
 683 
 684         writer.println(betterResultTags.toString());
 685         writer.flush();
 686 
 687         writer.println(sameResultTags.toString());
 688         writer.flush();
 689 
 690         writer.println(worseResultTags.toString());
 691         writer.flush();
 692 
 693         writer.println("</table>");
 694 
 695         writer.println(getFooter());
 696         writer.flush();
 697         writer.close();
 698     }
 699 
 700     /**
 701      * Generate Testcase Summary Report - Testcase_Summary_Report.html
 702      */
 703     private static void generateTestCaseSummaryReport(
 704         J2DAnalyzer.SingleResultSetHolder baseSRSH,
 705         J2DAnalyzer.SingleResultSetHolder targetSRSH,
 706         Map consolBaseResult,
 707         Map consolTargetResult,
 708         Map testCaseBaseResult,
 709         Map testCaseResultCount,
 710         Map testCaseTargetResult) {
 711 
 712         File tcSummaryReportFile =
 713             new File(resultsDir, "Testcase_Summary_Report.html");
 714         PrintWriter writer =
 715             openFile(tcSummaryReportFile.getAbsolutePath(), HTMLGEN_FILE_NEW);
 716 
 717         String header = getHeader(baseSRSH, targetSRSH,
 718                                   "J2DBench - Testcase Summary Report",
 719                                   "System_Properties.html");
 720         writer.println(header);
 721         writer.flush();
 722 
 723         StringBuffer testResultsStartBuffer = new StringBuffer();
 724         testResultsStartBuffer.append("<TR BGCOLOR=\"#CCCCFF\">");
 725         testResultsStartBuffer.append("<TD><B>Testcase</B></TD>");
 726         testResultsStartBuffer.append("<TD align=\"center\"><B>Score for " +
 727                                       baseBuild + "</B></TD>");
 728         testResultsStartBuffer.append("<TD align=\"center\"><B>Score for " +
 729                                      targetBuild + "</B></TD>");
 730         testResultsStartBuffer.append("<TD align=\"center\"><B>% Speedup</TD>");
 731         testResultsStartBuffer.append("</TR>");
 732 
 733         StringBuffer testResultsScoreBuffer = new StringBuffer();
 734         testResultsScoreBuffer.append("<table cols=\"4\" cellspacing=\"0\" " +
 735                                       "cellpadding=\"3\" border=\"1\" " +
 736                                       "width=\"80%\">");
 737 
 738         StringBuffer betterResultTags = new StringBuffer();
 739         StringBuffer sameResultTags = new StringBuffer();
 740         StringBuffer worseResultTags = new StringBuffer();
 741 
 742         Double baseValue = null, targetValue = null;
 743 
 744         String curGroupName = null;
 745         String curTestName = null;
 746 
 747         Object[] groupNameArray = groups.toArray();
 748         Arrays.sort(groupNameArray);
 749 
 750         Object[] testCaseList = consolBaseResult.keySet().toArray();
 751         Arrays.sort(testCaseList);
 752 
 753         writer.println("<br><hr size=\"1\"><br>");
 754         writer.println("<A NAME=\"status\"></A><H3>Status:</H3>");
 755 
 756         writer.println("<table cellspacing=\"0\" " +
 757                        "cellpadding=\"3\" border=\"1\" width=\"80%\">");
 758 
 759         for(int j=0; j<groupNameArray.length; j++) {
 760 
 761             if(j != 0) {
 762                 testResultsScoreBuffer.append("<tr><td colspan=\"4\">&nbsp;" +
 763                                               "<br>&nbsp;</td></tr>");
 764                 writer.println("<tr><td colspan=\"5\">&nbsp;<br>&nbsp;" +
 765                                "</td></tr>");
 766             }
 767 
 768             curGroupName = groupNameArray[j].toString();
 769 
 770             writer.println("<tr><td colspan=\"5\" valign=\"center\" " +
 771                            "bgcolor=\"#f0f0f0\">" +
 772                            "<A NAME=\"status_" + curGroupName + "\"></A>" +
 773                            "<font size=\"+1\">Status - " +
 774                            groupNames.get(curGroupName) + "</font></td></tr>");
 775             writer.println("<tr>");
 776             writer.println("<td bgcolor=\"#CCCCFF\"><b>Tests " +
 777                            "Performance</b></td>");
 778             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 779                            "<b>BETTER (Num / %)</b></td>");
 780             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 781                            "<b>SAME (Num / %)</b></td>");
 782             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 783                            "<b>WORSE (Num / %)</b></td>");
 784             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
 785                            "<b>Total</b></td>");
 786             writer.println("</tr>");
 787             writer.flush();
 788 
 789             testResultsScoreBuffer.append("<tr><td colspan=\"4\" " +
 790                                           "valign=\"center\" " +
 791                                           "bgcolor=\"#f0f0f0\">" +
 792                                           "<A NAME=\"test_result_" +
 793                                           curGroupName +
 794                                           "\"></A><font size=\"+1\">" +
 795                                           "Test Results - " +
 796                                           groupNames.get(curGroupName) +
 797                                           "</font></td></tr>");
 798             testResultsScoreBuffer.append(testResultsStartBuffer);
 799 
 800             String tableTags[] = null;
 801 
 802             for(int i=0; i<testCaseList.length; i++) {
 803 
 804                 curTestName = testCaseList[i].toString();
 805 
 806                 if(curTestName.startsWith(curGroupName)) {
 807 
 808                     tableTags = generateTestCaseReport(
 809                         curGroupName, curTestName, baseSRSH, targetSRSH,
 810                         testCaseResultCount, testCaseBaseResult,
 811                         testCaseTargetResult);
 812 
 813                     writer.println(tableTags[0]);
 814                     writer.flush();
 815 
 816                     testResultsScoreBuffer.append(tableTags[1]);
 817                 }
 818             }
 819         }
 820 
 821         testResultsScoreBuffer.append("</table>");
 822         writer.println("</table>");
 823 
 824         writer.println("<br><hr size=\"1\"><br>");
 825         writer.println("<A NAME=\"test_results\"></A><H3>Test Results:</H3>");
 826         writer.println(testResultsScoreBuffer.toString());
 827         writer.flush();
 828 
 829         writer.println(getFooter());
 830         writer.flush();
 831 
 832         writer.close();
 833     }
 834 
 835     /**
 836      *|----------|------------------------|--------------------------|-----------|
 837      *| Testcase | Score for <base build> | Score for <target build> | % Speedup |
 838      *|----------|------------------------|--------------------------|-----------|
 839      *
 840      */
 841     private static String getTestResultsTableForSummary(String testName,
 842                                                         double baseScore,
 843                                                         double targetScore)
 844     {
 845 
 846         double totalScore = baseScore + targetScore;
 847 
 848         String fileName = testName.replace('.', '_');
 849         fileName = fileName.toLowerCase() + ".html";
 850 
 851         int selColorIndex = selectColor(baseScore, targetScore);
 852 
 853         StringBuffer buffer = new StringBuffer();
 854 
 855         buffer.append("<TR BGCOLOR=\"" + color[selColorIndex] + "\">");
 856         buffer.append("<TD><P><A HREF=\"testcases/" + fileName +
 857                       "\">" + testName + "</A></P></TD>");
 858         buffer.append("<TD align=\"center\"><P><A HREF=\"testcases/" +
 859                       fileName +
 860                       "\"><B>" + decimalFormat.format(baseScore) +
 861                       "</B></A></P></TD>");
 862         buffer.append("<TD align=\"center\"><P><A HREF=\"testcases/" +
 863                       fileName + "\"><B>" + decimalFormat.format(targetScore) +
 864                       "</B></A></P></TD>");
 865         buffer.append("<TD align=\"center\"><P><A HREF=\"testcases/" +
 866                       fileName + "\"><B>" +
 867                       decimalFormat.format(calculateSpeedupPercentage(
 868                           baseScore,
 869                           targetScore)) +
 870                       "</B></A></P></TD>");
 871         buffer.append("</TR>");
 872 
 873         return buffer.toString();
 874     }
 875 
 876     /**
 877      *|-------------------|-------------------|-----------------|-------------------|--------|
 878      *| Tests Performance | BETTER  (Num / %) | SAME  (Num / %) | WORSE  ( Num / %) | Total  |
 879      *|-------------------|-------------------|-----------------|-------------------|--------|
 880      *
 881      */
 882     private static String getStatusTableForSummary(
 883         String curGroupName, String testName, int nBetter,
 884         int nSame, int nWorse)
 885     {
 886 
 887         String fileName = testName.replace('.', '_');
 888         fileName = fileName.toLowerCase() + ".html";
 889 
 890         int totalTests = nBetter + nSame + nWorse;
 891 
 892         StringBuffer buffer = new StringBuffer();
 893 
 894         buffer.append("<TR>");
 895         buffer.append("<TD><P><A HREF=\"#test_result_" + curGroupName +
 896                       "\">" + testName + "</A></P></TD>");
 897         buffer.append("<TD BGCOLOR=\"#99FF99\" align=\"center\"><P>" +
 898                       "<A HREF=\"#test_result_" + curGroupName +
 899                       "\"><B>" + nBetter + "</A></B>&nbsp;&nbsp;&nbsp;&nbsp;(" +
 900                       (nBetter * 100)/totalTests + "%)</P></TD>");
 901         buffer.append("<TD BGCOLOR=\"#CCFFFF\" align=\"center\"><P>" +
 902                       "<A HREF=\"#test_result_" + curGroupName +
 903                       "\"><B>" + nSame + "</A></B>&nbsp;&nbsp;&nbsp;&nbsp;(" +
 904                       (nSame * 100)/totalTests + "%)</P></TD>");
 905         buffer.append("<TD BGCOLOR=\"#FFCC00\" align=\"center\"><P>" +
 906                       "<A HREF=\"#test_result_" + curGroupName +
 907                       "\"><B>" + nWorse + "</A></B>&nbsp;&nbsp;&nbsp;&nbsp;(" +
 908                       (nWorse * 100)/totalTests + "%)</P></TD>");
 909         buffer.append("<TD BGCOLOR=\"#FFFFFF\" align=\"center\"><P>" +
 910                       "<A HREF=\"#test_result_" + curGroupName +
 911                       "\"><B>" + totalTests + "</B></A></P></TD>");
 912         buffer.append("</TR>");
 913 
 914         return buffer.toString();
 915     }
 916 
 917     /**
 918      *  |-------------------|-----------------|------------------------------|
 919      *  | Tests performance | Number of tests | % from total number of tests |
 920      *  |-------------------|-----------------|------------------------------|
 921      *
 922      */
 923     private static String getPerformanceTableForTestcase(
 924         String testName, int nBetter, int nSame, int nWorse) {
 925 
 926         StringBuffer buffer = new StringBuffer();
 927 
 928         int totalTests = nBetter + nSame + nWorse;
 929 
 930         buffer.append("<hr size=\"1\">");
 931         buffer.append("<H3>Status:</H3>");
 932 
 933         buffer.append("<table cols=\"4\" cellspacing=\"0\" " +
 934                       "cellpadding=\"3\" border=\"1\" width=\"80%\">");
 935         buffer.append("<TR BGCOLOR=\"#CCCCFF\">");
 936         buffer.append("<TD align=\"center\"><B>Tests performance</B></TD>");
 937         buffer.append("<TD align=\"center\"><B>Number of tests</B></TD>");
 938         buffer.append("<TD align=\"center\"><B>% from total number of " +
 939                       "tests</B></TD>");
 940         buffer.append("</TR>");
 941 
 942         buffer.append("<TR BGCOLOR=\"#99FF99\">");
 943         buffer.append("<TD><P><A HREF=\"#better\">" +
 944                       "Target is at least 10 percent BETTER</A></P></TD>");
 945         buffer.append("<TD align=\"center\"><P><A HREF=\"#better\"><B>" +
 946                       nBetter + "</B></A></P></TD>");
 947         buffer.append("<TD align=\"center\"><P>" + (nBetter * 100/totalTests) +
 948                       "</P></TD>");
 949         buffer.append("</TR>");
 950 
 951         buffer.append("<TR BGCOLOR=\"#CCFFFF\">");
 952         buffer.append("<TD><P><A HREF=\"#same\">" +
 953                       "The same within 10 percent</A></P></TD>");
 954         buffer.append("<TD align=\"center\"><P><A HREF=\"#same\"><B>" +
 955                       nSame + "</B></A></P></TD>");
 956         buffer.append("<TD align=\"center\"><P>" + (nSame * 100/totalTests) +
 957                       "</P></TD>");
 958         buffer.append("</TR>");
 959 
 960         buffer.append("<TR BGCOLOR=\"#FFCC00\">");
 961         buffer.append("<TD><P><A HREF=\"#worse\">" +
 962                       "Target is at least 10 percent WORSE</A></P></TD>");
 963         buffer.append("<TD align=\"center\"><P><A HREF=\"#worse\"><B>" +
 964                       nWorse + "</B></A></P></TD>");
 965         buffer.append("<TD align=\"center\"><P>" + (nWorse * 100/totalTests) +
 966                       "</P></TD>");
 967         buffer.append("</TR>");
 968 
 969         buffer.append("</TABLE>");
 970 
 971         return buffer.toString();
 972     }
 973 
 974     /**
 975      *  |-----------|---------|--------------------|----------------------|------------|
 976      *  | Num Units | Options | <base build> Score | <target build> Score | % Speedup  |
 977      *  |-----------|---------|--------------------|----------------------|------------|
 978      *
 979      *  String[0] = getStatusTableForSummary()
 980      *  String[1] = getTestResultsTableForSummary()
 981      *
 982      * Generate Testcase Report - testcases/<testcase name>.html
 983      */
 984     private static String[] generateTestCaseReport(
 985         String curGroupName,
 986         Object key,
 987         J2DAnalyzer.SingleResultSetHolder baseSRSH,
 988         J2DAnalyzer.SingleResultSetHolder targetSRSH,
 989         Map testCaseResultCount,
 990         Map testCaseBaseResult,
 991         Map testCaseTargetResult) {
 992 
 993         int numBetterTestCases = 0;
 994         int numWorseTestCases = 0;
 995         int numSameTestCases = 0;
 996 
 997         StringBuffer tcStartTags = new StringBuffer();
 998         tcStartTags.append("<tr>");
 999         tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
1000                            "<b>Num Units</b></td>");
1001         tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
1002                            "<b>Options</b></td>");
1003         tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\"><b>" +
1004                            baseBuild + " Score</b></td>");
1005         tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\"><b>" +
1006                            targetBuild + " Score</b></td>");
1007         tcStartTags.append("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
1008                            "<b>% Speedup</b></td>");
1009         tcStartTags.append("</tr>");
1010 
1011         StringBuffer worseTestcaseResultTags =
1012             new StringBuffer(tcStartTags.toString());
1013         StringBuffer sameTestcaseResultTags =
1014             new StringBuffer(tcStartTags.toString());
1015         StringBuffer betterTestcaseResultTags =
1016             new StringBuffer(tcStartTags.toString());
1017 
1018         Object curTestCountObj = testCaseResultCount.get(key.toString());
1019         int curTestCount = 0;
1020         if(curTestCountObj != null) {
1021             curTestCount = ((Integer) curTestCountObj).intValue();
1022         }
1023 
1024         String fileName = key.toString().replace('.', '_');
1025         fileName = fileName.toLowerCase() + ".html";
1026         File testcaseReportFile =
1027             new File(resultsDir + File.separator + "testcases", fileName);
1028         PrintWriter writer = openFile(
1029             testcaseReportFile.getAbsolutePath(), HTMLGEN_FILE_NEW);
1030 
1031         String header = getHeader(baseSRSH, targetSRSH,
1032                                   "J2DBench - " + key.toString(),
1033                                   "../System_Properties.html");
1034         writer.println(header);
1035         writer.flush();
1036 
1037         double totalBaseScore = 0;
1038         double totalTargetScore = 0;
1039 
1040         for(int i=0; i<curTestCount; i++) {
1041 
1042             J2DAnalyzer.ResultHolder baseTCR =
1043                 (J2DAnalyzer.ResultHolder)testCaseBaseResult.get(
1044                     key.toString() + "_" + i);
1045             J2DAnalyzer.ResultHolder targetTCR =
1046                 (J2DAnalyzer.ResultHolder) testCaseTargetResult.get(
1047                     key.toString() + "_" + i);
1048 
1049             double baseScore = baseTCR.getScore();
1050             double targetScore = targetTCR.getScore();
1051 
1052             StringBuffer tcTagBuffer = new StringBuffer();
1053 
1054             int selColorIndex = selectColor(baseScore, targetScore);
1055             tcTagBuffer.append("<tr bgcolor=\""+ color[selColorIndex] + "\">");
1056             tcTagBuffer.append("<td align=\"center\">" + baseTCR.getUnits() +
1057                                "</td>");
1058             tcTagBuffer.append("<td valign=\"center\">");
1059 
1060             Map map = baseTCR.getOptions();
1061             Iterator iter = map.keySet().iterator();
1062             Object subKey=null, subValue=null;
1063             tcTagBuffer.append("<ul>");
1064             while(iter.hasNext()) {
1065                 subKey = iter.next().toString();
1066                 subValue = map.get(subKey).toString();
1067                 tcTagBuffer.append("<li>" + subKey + " = " +
1068                                    subValue + "</li>");
1069             }
1070             tcTagBuffer.append("</ul></td>");
1071             tcTagBuffer.append("<td valign=\"center\" align=\"center\">" +
1072                                decimalFormat.format(baseTCR.getScore()) +
1073                                "</td>");
1074             tcTagBuffer.append("<td valign=\"center\" align=\"center\">" +
1075                                decimalFormat.format(targetTCR.getScore()) +
1076                                "</td>");
1077             tcTagBuffer.append("<td valign=\"center\" align=\"center\">" +
1078                                decimalFormat.format(
1079                                    calculateSpeedupPercentage(
1080                                        baseTCR.getScore(),
1081                                        targetTCR.getScore())) +
1082                                    "</td>");
1083             tcTagBuffer.append("</tr>");
1084 
1085             totalBaseScore = totalBaseScore + baseTCR.getScore();
1086             totalTargetScore = totalTargetScore + targetTCR.getScore();
1087 
1088             switch(selColorIndex) {
1089                 case 0:
1090                     betterTestcaseResultTags.append(tcTagBuffer.toString());
1091                     numBetterTestCases++;
1092                     break;
1093                 case 1:
1094                     sameTestcaseResultTags.append(tcTagBuffer.toString());
1095                     numSameTestCases++;
1096                     break;
1097                 case 2:
1098                     worseTestcaseResultTags.append(tcTagBuffer.toString());
1099                     numWorseTestCases++;
1100                     break;
1101             }
1102         }
1103 
1104         String performanceTable =
1105             getPerformanceTableForTestcase(key.toString(),
1106                                            numBetterTestCases, numSameTestCases,
1107                                            numWorseTestCases);
1108 
1109         writer.println(performanceTable);
1110         writer.flush();
1111 
1112         writer.println("<hr size=\"1\">");
1113         writer.println("<A NAME=\"details\"></A><H3>Details:</H3>");
1114 
1115         writer.println("<table cellspacing=\"0\" " +
1116                        "cellpadding=\"3\" border=\"1\" width=\"80%\">");
1117 
1118         writer.println("<tr><td colspan=\"5\" " +
1119                        "valign=\"center\" bgcolor=\"#f0f0f0\">" +
1120                        "<a name=\"better\"></a><font size=\"+1\">" +
1121                        key.toString() +
1122                        " Tests which run BETTER on target</font></td></tr>");
1123         writer.println(betterTestcaseResultTags.toString());
1124         writer.flush();
1125 
1126         writer.println("<tr><td colspan=\"5\">&nbsp;<br>&nbsp;</td></tr>");
1127 
1128         writer.println("<tr><td colspan=\"5\" " +
1129                        "valign=\"center\" bgcolor=\"#f0f0f0\">" +
1130                        "<a name=\"same\"></a><font size=\"+1\">" +
1131                        key.toString() +
1132                        " Tests which run SAME on target</font></td></tr>");
1133         writer.println(sameTestcaseResultTags.toString());
1134         writer.flush();
1135 
1136         writer.println("<tr><td colspan=\"5\">&nbsp;<br>&nbsp;</td></tr>");
1137 
1138         writer.println("<tr><td colspan=\"5\" " +
1139                        "valign=\"center\" bgcolor=\"#f0f0f0\">" +
1140                        "<a name=\"worse\"></a><font size=\"+1\">" +
1141                        key.toString() +
1142                        " Tests which run WORSE on target</font></td></tr>");
1143         writer.println(worseTestcaseResultTags.toString());
1144         writer.flush();
1145 
1146         writer.println("</table>");
1147 
1148         writer.println(getFooter());
1149         writer.flush();
1150 
1151         writer.close();
1152 
1153         String statusTable =
1154             getStatusTableForSummary(curGroupName, key.toString(),
1155                                      numBetterTestCases,
1156                                      numSameTestCases, numWorseTestCases);
1157 
1158         String testResultsTable =
1159             getTestResultsTableForSummary(key.toString(),
1160                                           totalBaseScore, totalTargetScore);
1161 
1162         return new String[] {statusTable, testResultsTable};
1163     }
1164 
1165     /**
1166      * Returns footer tag for HTML files
1167      */
1168     private static String getFooter() {
1169 
1170         StringBuffer buffer = new StringBuffer();
1171 
1172         buffer.append("<br><hr WIDTH=\"100%\" size=\"1\">");
1173         buffer.append("<A NAME=\"legend\"></A><H3>Legend:</H3>");
1174         buffer.append("<table cellspacing=\"0\" cellpadding=\"3\" " +
1175                       "border=\"1\" width=\"80%\">");
1176         buffer.append("<TR BGCOLOR=\"" + color[0] +
1177                       "\"><TD>The result for " + targetBuild +
1178                       " is at least 10 percent BETTER than for " + baseBuild +
1179                       "</TD></TR>");
1180         buffer.append("<TR BGCOLOR=\"" + color[1] +
1181                       "\"><TD>The results for " + targetBuild + " and " +
1182                       baseBuild + " are within 10 percent</TD></TR>");
1183         buffer.append("<TR BGCOLOR=\"" + color[2] +
1184                       "\"><TD>The result for " + targetBuild +
1185                       " is at least 10 percent WORSE than " + baseBuild +
1186                       "</TD></TR>");
1187         buffer.append("<TR><TD>The 'Score' is a number of " +
1188                       "successful rendering " +
1189                       "operations per second</TD></TR>");
1190         buffer.append("</table>");
1191 
1192         buffer.append("<br><hr WIDTH=\"100%\" size=\"1\">");
1193         buffer.append("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>");
1194 
1195         return buffer.toString();
1196     }
1197 
1198     /**
1199      * Returns header tag for HTML files
1200      */
1201     private static String
1202         getHeader(J2DAnalyzer.SingleResultSetHolder baseSRSH,
1203                   J2DAnalyzer.SingleResultSetHolder targetSRSH,
1204                   String title,
1205                  String sysPropLoc)
1206     {
1207 
1208         StringBuffer buffer = new StringBuffer();
1209 
1210         String headerTitle = getHeaderTitle(title);
1211         buffer.append(headerTitle);
1212 
1213         //System Properties
1214         buffer.append("<tr><td bgcolor=\"#CCCCFF\">" +
1215                       "<b><A HREF=\"" + sysPropLoc + "\">System Property</A>" +
1216                       "</b></td>" +
1217                       "<td bgcolor=\"#CCCCFF\"><b><A HREF=\"" +
1218                       sysPropLoc + "\">Value<A></b></td></tr>");
1219         Map sysProps = targetSRSH.getProperties();
1220         buffer.append("<tr><td bgcolor=\"#f0f0f0\">os.name</td><td>" +
1221                       sysProps.get("os.name") + "</td></tr>");
1222         buffer.append("<tr><td bgcolor=\"#f0f0f0\">os.version</td><td>" +
1223                       sysProps.get("os.version") + "</td></tr>");
1224         buffer.append("<tr><td bgcolor=\"#f0f0f0\">os.arch</td><td>" +
1225                       sysProps.get("os.arch") + "</td></tr>");
1226         buffer.append("<tr><td bgcolor=\"#f0f0f0\">sun.desktop</td><td>" +
1227                       sysProps.get("sun.desktop") + "</td></tr>");
1228 
1229         buffer.append("</table>");
1230 
1231         return buffer.toString();
1232     }
1233 
1234     /**
1235      * Returns start tag and title tag for HTML files
1236      */
1237     private static String getHeaderTitle(String title) {
1238 
1239         StringBuffer buffer = new StringBuffer();
1240 
1241         buffer.append("<html><head><title>" + title + "</title></head>");
1242         buffer.append("<body bgcolor=\"#ffffff\"><hr size=\"1\">");
1243         buffer.append("<center><h2>" + title + "</h2>");
1244         buffer.append("</center><hr size=\"1\"><br>");
1245         buffer.append("<table cols=\"2\" cellspacing=\"2\" cellpadding=\"5\" " +
1246                       "border=\"0\" width=\"80%\">");
1247         buffer.append("<tr><td bgcolor=\"#CCCCFF\" colspan=\"2\">" +
1248                       "<b>Test Details</b></td></tr>");
1249         buffer.append("<tr><td bgcolor=\"#f0f0f0\">Base Build</td>");
1250         buffer.append("<td>" + baseBuild + "</td></tr>");
1251         buffer.append("<tr><td bgcolor=\"#f0f0f0\">Target Build</td>");
1252         buffer.append("<td>" + targetBuild + "</td></tr>");
1253 
1254         return buffer.toString();
1255     }
1256 
1257     /**
1258      * Generats System-Properties HTML file - System_Property.html
1259      */
1260     private static void
1261         generateSysPropsReport(J2DAnalyzer.SingleResultSetHolder srsh)
1262     {
1263 
1264         File sysPropsFile =
1265             new File(resultsDir, "System_Properties.html");
1266         PrintWriter writer =
1267             openFile(sysPropsFile.getAbsolutePath(), HTMLGEN_FILE_NEW);
1268 
1269         String headerTitle = getHeaderTitle("System Properties");
1270         writer.println(headerTitle);
1271         writer.flush();
1272 
1273         writer.println("<tr><td bgcolor=\"#CCCCFF\"><b>" +
1274                        "System Property</b></td><td bgcolor=\"#CCCCFF\">" +
1275                        "<b>Value</b></td></tr>");
1276 
1277         String key = null;
1278         String value = null;
1279         Map sysProps = srsh.getProperties();
1280         Iterator iter = sysProps.keySet().iterator();
1281         while(iter.hasNext()) {
1282             key = iter.next().toString();
1283             value = sysProps.get(key).toString();
1284             writer.println("<tr><td bgcolor=\"#f0f0f0\">" +
1285                            key + "</td><td>" + value + "</td></tr>");
1286         }
1287         writer.println("</table>");
1288         writer.flush();
1289 
1290         writer.println("<br><hr WIDTH=\"100%\" size=\"1\">");
1291         writer.println("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>");
1292 
1293         writer.flush();
1294     }
1295 
1296     /**
1297      * Returns the index of color from color array based on the results
1298      * Can change this implementation so as to select based on some analysis.
1299      */
1300     private static int selectColor(double baseScore, double targetScore) {
1301 
1302         double res = calculateSpeedupPercentage(baseScore, targetScore);
1303 
1304         if (res < -10) {
1305             return 2;
1306         } else if (res > 10) {
1307             return 0;
1308         } else {
1309             return 1;
1310         }
1311     }
1312 
1313     /**
1314      * Calculate Speedup Percentage ->
1315      *     ((target_score - base_score) * 100) / baseScore
1316      * Can change this implementation so as to provide some analysis.
1317      */
1318     private static double calculateSpeedupPercentage(double baseScore,
1319                                                      double targetScore)
1320     {
1321         return ((targetScore - baseScore) * 100)/baseScore;
1322     }
1323 
1324     private static void printUsage() {
1325         String usage =
1326             "\njava XMLHTMLReporter [options]      "     +
1327             "                                      \n\n" +
1328             "where options include:                "     +
1329             "                                      \n"   +
1330             "    -r | -results <result directory>  "     +
1331             "directory to which reports are stored \n"   +
1332             "    -basexml | -b <xml file path>     "     +
1333             "path to base-build result             \n"   +
1334             "    -targetxml | -t <xml file path>   "     +
1335             "path to target-build result           \n"   +
1336             "    -resultxml | -xml <xml file path> "     +
1337             "path to result XML                    \n"   +
1338             "    -group | -g  <level>              "     +
1339             "group-level for tests                 \n"   +
1340             "                                      "     +
1341             " [ 1 , 2 , 3 or 4 ]                   \n"   +
1342             "    -analyzermode | -am               "     +
1343             "mode to be used for finding score     \n"   +
1344             "                                      "     +
1345             " [ BEST , WORST , AVERAGE , MIDAVG ]  ";
1346         System.out.println(usage);
1347         System.exit(0);
1348     }
1349 
1350     /**
1351      * main
1352      */
1353     public static void main(String args[]) {
1354 
1355         String resDir = ".";
1356         String baseXML = null;
1357         String targetXML = null;
1358         String resultXML = null;
1359         int group = 2;
1360 
1361         /* ---- Analysis Mode ----
1362             BEST    = 1;
1363             WORST   = 2;
1364             AVERAGE = 3;
1365             MIDAVG  = 4;
1366          ------------------------ */
1367         int analyzerMode = 4;
1368 
1369         try {
1370 
1371             for (int i = 0; i < args.length; i++) {
1372                 if (args[i].startsWith("-results") ||
1373                     args[i].startsWith("-r"))
1374                 {
1375                     i++;
1376                     resDir = args[i];
1377                 } else if (args[i].startsWith("-basexml") ||
1378                            args[i].startsWith("-b"))
1379                 {
1380                     i++;
1381                     baseXML = args[i];
1382                 } else if (args[i].startsWith("-targetxml") ||
1383                            args[i].startsWith("-t"))
1384                 {
1385                     i++;
1386                     targetXML = args[i];
1387                 } else if (args[i].startsWith("-resultxml") ||
1388                            args[i].startsWith("-xml"))
1389                 {
1390                     i++;
1391                     resultXML = args[i];
1392                 } else if (args[i].startsWith("-group") ||
1393                            args[i].startsWith("-g"))
1394                 {
1395                     i++;
1396                     group = Integer.parseInt(args[i]);
1397                     System.out.println("Grouping Level for tests: " + group);
1398                 } else if (args[i].startsWith("-analyzermode") ||
1399                            args[i].startsWith("-am"))
1400                 {
1401                     i++;
1402                     String strAnalyzerMode = args[i];
1403                     if(strAnalyzerMode.equalsIgnoreCase("BEST")) {
1404                         analyzerMode = 0;
1405                     } else if (strAnalyzerMode.equalsIgnoreCase("WORST")) {
1406                         analyzerMode = 1;
1407                     } else if (strAnalyzerMode.equalsIgnoreCase("AVERAGE")) {
1408                         analyzerMode = 2;
1409                     } else if (strAnalyzerMode.equalsIgnoreCase("MIDAVG")) {
1410                         analyzerMode = 3;
1411                     } else {
1412                         printUsage();
1413                     }
1414                     System.out.println("Analyzer-Mode: " + analyzerMode);
1415                 }
1416             }
1417         }
1418         catch(Exception e) {
1419             printUsage();
1420         }
1421 
1422         if(resDir != null) {
1423 
1424             XMLHTMLReporter.setGroupLevel(group);
1425             J2DAnalyzer.setMode(analyzerMode);
1426 
1427             if(targetXML != null && baseXML != null) {
1428                 XMLHTMLReporter.generateComparisonReport(resDir, baseXML,
1429                                                          targetXML);
1430             } else if (resultXML != null) {
1431                 XMLHTMLReporter.generateReport(resDir, resultXML);
1432             } else {
1433                 printUsage();
1434             }
1435         } else {
1436             printUsage();
1437         }
1438     }
1439 }