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 setGroupLevel(int level)96 public static void setGroupLevel(int level) { 97 XMLHTMLReporter.LEVEL = level; 98 } 99 100 /** 101 * Add Test Group to the list 102 */ addGroup(String testName)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 */ getDisplayGroupName(String group)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 */ getGroup(String testName)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 */ openFile(String name, int nSwitch)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 */ generateReport(String resultsDir, String xmlFileName)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 + " </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 */ generateComparisonReport(String resultsDir, String baseXMLFileName, String targetXMLFileName)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\"> <br> </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\"> <br> </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 */ generateGroupSummaryReport( J2DAnalyzer.SingleResultSetHolder baseSRSH, J2DAnalyzer.SingleResultSetHolder targetSRSH, Map consolBaseResult, Map consolTargetResult, Map testCaseBaseResult, Map testCaseResultCount, Map testCaseTargetResult)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 */ generateTestCaseSummaryReport( J2DAnalyzer.SingleResultSetHolder baseSRSH, J2DAnalyzer.SingleResultSetHolder targetSRSH, Map consolBaseResult, Map consolTargetResult, Map testCaseBaseResult, Map testCaseResultCount, Map testCaseTargetResult)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\"> " + 763 "<br> </td></tr>"); 764 writer.println("<tr><td colspan=\"5\"> <br> " + 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 */ getTestResultsTableForSummary(String testName, double baseScore, double targetScore)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 */ getStatusTableForSummary( String curGroupName, String testName, int nBetter, int nSame, int nWorse)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> (" + 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> (" + 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> (" + 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 */ getPerformanceTableForTestcase( String testName, int nBetter, int nSame, int nWorse)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 */ generateTestCaseReport( String curGroupName, Object key, J2DAnalyzer.SingleResultSetHolder baseSRSH, J2DAnalyzer.SingleResultSetHolder targetSRSH, Map testCaseResultCount, Map testCaseBaseResult, Map testCaseTargetResult)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\"> <br> </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\"> <br> </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 */ getFooter()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 getHeader(J2DAnalyzer.SingleResultSetHolder baseSRSH, J2DAnalyzer.SingleResultSetHolder targetSRSH, String title, String sysPropLoc)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 */ getHeaderTitle(String title)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 generateSysPropsReport(J2DAnalyzer.SingleResultSetHolder srsh)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 */ selectColor(double baseScore, double targetScore)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 */ calculateSpeedupPercentage(double baseScore, double targetScore)1318 private static double calculateSpeedupPercentage(double baseScore, 1319 double targetScore) 1320 { 1321 return ((targetScore - baseScore) * 100)/baseScore; 1322 } 1323 printUsage()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 */ main(String args[])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 } 1440