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 + " </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\"> <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 */ 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\"> " + 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 */ 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> (" + 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 */ 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\"> <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 */ 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 }