1 /*
2  * Copyright (c) 2004, 2018, 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 + "&nbsp;</td></tr>");
246             }
247             writer.flush();
248 
249             writer.println("</table>");
250             writer.println("<br>");
251             writer.println("<hr size=\"1\">");
252             writer.println("<br>");
253 
254             writer.println("<table cellspacing=\"0\" " +
255                            "cellpadding=\"3\" border=\"1\" width=\"80%\">");
256             writer.println("<tr>");
257             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
258                            "<b>Num Reps</b></td>");
259             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
260                            "<b>Num Units</b></td>");
261             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
262                            "<b>Name</b></td>");
263             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
264                            "<b>Options</b></td>");
265             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
266                            "<b>Score</b></td>");
267             writer.println("</tr>");
268             writer.flush();
269 
270             for (int k = 0; k < keys.length; k++) {
271 
272                 J2DAnalyzer.ResultHolder testResult =
273                     srsh.getResultByKey(keys[k]);
274 
275                 writer.println("<tr>");
276                 writer.println("<td>" + testResult.getReps() + "</td>");
277                 writer.println("<td>" + testResult.getUnits() + "</td>");
278                 writer.println("<td>" + testResult.getName() + "</td>");
279                 writer.println("<td valign=\"center\"><ul>");
280                 Map map = testResult.getOptions();
281                 iter = map.keySet().iterator();
282                 while(iter.hasNext()) {
283                     key = iter.next().toString();
284                     value = map.get(key).toString();
285                     writer.println("<li>" + key + " = " + value + "</li>");
286                 }
287                 writer.println("</ul></td>");
288                 writer.println("<td valign=\"center\">" +
289                                decimalFormat.format(testResult.getScore()) +
290                                "</td>");
291                 writer.println("</tr>");
292             }
293             writer.flush();
294 
295             writer.println("</table>");
296 
297             writer.println("<br><hr WIDTH=\"100%\" size=\"1\">");
298             writer.println("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>");
299 
300             writer.flush();
301             writer.close();
302         }
303         catch(Exception e) {
304             e.printStackTrace();
305         }
306     }
307 
308     /**
309      * Generate the reports from the base & target result XML
310      */
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\">&nbsp;<br>&nbsp;</td></tr>");
491         writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" +
492                        "<font size=\"+1\">Tests which run " +
493                        "SAME on target</font></td></tr>");
494         writer.println(sameResultTags.toString());
495         writer.flush();
496 
497         writer.println("<tr><td colspan=\"7\">&nbsp;<br>&nbsp;</td></tr>");
498         writer.println("<tr><td colspan=\"7\" bgcolor=\"#f0f0f0\">" +
499                        "<font size=\"+1\">Tests which run WORSE on target" +
500                        "</font></td></tr>");
501         writer.println(worseResultTags.toString());
502         writer.flush();
503 
504         writer.println("</table>");
505 
506         writer.println(getFooter());
507         writer.flush();
508 
509         writer.close();
510 
511         generateTestCaseSummaryReport(baseSRSH, targetSRSH,
512                                       consolBaseRes, consolTargetResult,
513                                       testCaseBaseResult,
514                                       testCaseResultCount,
515                                       testCaseTargetResult);
516 
517         generateGroupSummaryReport(baseSRSH, targetSRSH,
518                                    consolBaseRes, consolTargetResult,
519                                    testCaseBaseResult,
520                                    testCaseResultCount, testCaseTargetResult);
521     }
522 
523     /**
524      * Generate Group-Summary report - Summary_Report.html
525      */
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\">&nbsp;" +
763                                               "<br>&nbsp;</td></tr>");
764                 writer.println("<tr><td colspan=\"5\">&nbsp;<br>&nbsp;" +
765                                "</td></tr>");
766             }
767 
768             curGroupName = groupNameArray[j].toString();
769 
770             writer.println("<tr><td colspan=\"5\" valign=\"center\" " +
771                            "bgcolor=\"#f0f0f0\">" +
772                            "<A NAME=\"status_" + curGroupName + "\"></A>" +
773                            "<font size=\"+1\">Status - " +
774                            groupNames.get(curGroupName) + "</font></td></tr>");
775             writer.println("<tr>");
776             writer.println("<td bgcolor=\"#CCCCFF\"><b>Tests " +
777                            "Performance</b></td>");
778             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
779                            "<b>BETTER (Num / %)</b></td>");
780             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
781                            "<b>SAME (Num / %)</b></td>");
782             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
783                            "<b>WORSE (Num / %)</b></td>");
784             writer.println("<td bgcolor=\"#CCCCFF\" align=\"center\">" +
785                            "<b>Total</b></td>");
786             writer.println("</tr>");
787             writer.flush();
788 
789             testResultsScoreBuffer.append("<tr><td colspan=\"4\" " +
790                                           "valign=\"center\" " +
791                                           "bgcolor=\"#f0f0f0\">" +
792                                           "<A NAME=\"test_result_" +
793                                           curGroupName +
794                                           "\"></A><font size=\"+1\">" +
795                                           "Test Results - " +
796                                           groupNames.get(curGroupName) +
797                                           "</font></td></tr>");
798             testResultsScoreBuffer.append(testResultsStartBuffer);
799 
800             String[] tableTags = null;
801 
802             for(int i=0; i<testCaseList.length; i++) {
803 
804                 curTestName = testCaseList[i].toString();
805 
806                 if(curTestName.startsWith(curGroupName)) {
807 
808                     tableTags = generateTestCaseReport(
809                         curGroupName, curTestName, baseSRSH, targetSRSH,
810                         testCaseResultCount, testCaseBaseResult,
811                         testCaseTargetResult);
812 
813                     writer.println(tableTags[0]);
814                     writer.flush();
815 
816                     testResultsScoreBuffer.append(tableTags[1]);
817                 }
818             }
819         }
820 
821         testResultsScoreBuffer.append("</table>");
822         writer.println("</table>");
823 
824         writer.println("<br><hr size=\"1\"><br>");
825         writer.println("<A NAME=\"test_results\"></A><H3>Test Results:</H3>");
826         writer.println(testResultsScoreBuffer.toString());
827         writer.flush();
828 
829         writer.println(getFooter());
830         writer.flush();
831 
832         writer.close();
833     }
834 
835     /**
836      *|----------|------------------------|--------------------------|-----------|
837      *| Testcase | Score for <base build> | Score for <target build> | % Speedup |
838      *|----------|------------------------|--------------------------|-----------|
839      *
840      */
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>&nbsp;&nbsp;&nbsp;&nbsp;(" +
900                       (nBetter * 100)/totalTests + "%)</P></TD>");
901         buffer.append("<TD BGCOLOR=\"#CCFFFF\" align=\"center\"><P>" +
902                       "<A HREF=\"#test_result_" + curGroupName +
903                       "\"><B>" + nSame + "</A></B>&nbsp;&nbsp;&nbsp;&nbsp;(" +
904                       (nSame * 100)/totalTests + "%)</P></TD>");
905         buffer.append("<TD BGCOLOR=\"#FFCC00\" align=\"center\"><P>" +
906                       "<A HREF=\"#test_result_" + curGroupName +
907                       "\"><B>" + nWorse + "</A></B>&nbsp;&nbsp;&nbsp;&nbsp;(" +
908                       (nWorse * 100)/totalTests + "%)</P></TD>");
909         buffer.append("<TD BGCOLOR=\"#FFFFFF\" align=\"center\"><P>" +
910                       "<A HREF=\"#test_result_" + curGroupName +
911                       "\"><B>" + totalTests + "</B></A></P></TD>");
912         buffer.append("</TR>");
913 
914         return buffer.toString();
915     }
916 
917     /**
918      *  |-------------------|-----------------|------------------------------|
919      *  | Tests performance | Number of tests | % from total number of tests |
920      *  |-------------------|-----------------|------------------------------|
921      *
922      */
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\">&nbsp;<br>&nbsp;</td></tr>");
1127 
1128         writer.println("<tr><td colspan=\"5\" " +
1129                        "valign=\"center\" bgcolor=\"#f0f0f0\">" +
1130                        "<a name=\"same\"></a><font size=\"+1\">" +
1131                        key.toString() +
1132                        " Tests which run SAME on target</font></td></tr>");
1133         writer.println(sameTestcaseResultTags.toString());
1134         writer.flush();
1135 
1136         writer.println("<tr><td colspan=\"5\">&nbsp;<br>&nbsp;</td></tr>");
1137 
1138         writer.println("<tr><td colspan=\"5\" " +
1139                        "valign=\"center\" bgcolor=\"#f0f0f0\">" +
1140                        "<a name=\"worse\"></a><font size=\"+1\">" +
1141                        key.toString() +
1142                        " Tests which run WORSE on target</font></td></tr>");
1143         writer.println(worseTestcaseResultTags.toString());
1144         writer.flush();
1145 
1146         writer.println("</table>");
1147 
1148         writer.println(getFooter());
1149         writer.flush();
1150 
1151         writer.close();
1152 
1153         String statusTable =
1154             getStatusTableForSummary(curGroupName, key.toString(),
1155                                      numBetterTestCases,
1156                                      numSameTestCases, numWorseTestCases);
1157 
1158         String testResultsTable =
1159             getTestResultsTableForSummary(key.toString(),
1160                                           totalBaseScore, totalTargetScore);
1161 
1162         return new String[] {statusTable, testResultsTable};
1163     }
1164 
1165     /**
1166      * Returns footer tag for HTML files
1167      */
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 
1227         buffer.append("</table>");
1228 
1229         return buffer.toString();
1230     }
1231 
1232     /**
1233      * Returns start tag and title tag for HTML files
1234      */
getHeaderTitle(String title)1235     private static String getHeaderTitle(String title) {
1236 
1237         StringBuffer buffer = new StringBuffer();
1238 
1239         buffer.append("<html><head><title>" + title + "</title></head>");
1240         buffer.append("<body bgcolor=\"#ffffff\"><hr size=\"1\">");
1241         buffer.append("<center><h2>" + title + "</h2>");
1242         buffer.append("</center><hr size=\"1\"><br>");
1243         buffer.append("<table cols=\"2\" cellspacing=\"2\" cellpadding=\"5\" " +
1244                       "border=\"0\" width=\"80%\">");
1245         buffer.append("<tr><td bgcolor=\"#CCCCFF\" colspan=\"2\">" +
1246                       "<b>Test Details</b></td></tr>");
1247         buffer.append("<tr><td bgcolor=\"#f0f0f0\">Base Build</td>");
1248         buffer.append("<td>" + baseBuild + "</td></tr>");
1249         buffer.append("<tr><td bgcolor=\"#f0f0f0\">Target Build</td>");
1250         buffer.append("<td>" + targetBuild + "</td></tr>");
1251 
1252         return buffer.toString();
1253     }
1254 
1255     /**
1256      * Generats System-Properties HTML file - System_Property.html
1257      */
1258     private static void
generateSysPropsReport(J2DAnalyzer.SingleResultSetHolder srsh)1259         generateSysPropsReport(J2DAnalyzer.SingleResultSetHolder srsh)
1260     {
1261 
1262         File sysPropsFile =
1263             new File(resultsDir, "System_Properties.html");
1264         PrintWriter writer =
1265             openFile(sysPropsFile.getAbsolutePath(), HTMLGEN_FILE_NEW);
1266 
1267         String headerTitle = getHeaderTitle("System Properties");
1268         writer.println(headerTitle);
1269         writer.flush();
1270 
1271         writer.println("<tr><td bgcolor=\"#CCCCFF\"><b>" +
1272                        "System Property</b></td><td bgcolor=\"#CCCCFF\">" +
1273                        "<b>Value</b></td></tr>");
1274 
1275         String key = null;
1276         String value = null;
1277         Map sysProps = srsh.getProperties();
1278         Iterator iter = sysProps.keySet().iterator();
1279         while(iter.hasNext()) {
1280             key = iter.next().toString();
1281             value = sysProps.get(key).toString();
1282             writer.println("<tr><td bgcolor=\"#f0f0f0\">" +
1283                            key + "</td><td>" + value + "</td></tr>");
1284         }
1285         writer.println("</table>");
1286         writer.flush();
1287 
1288         writer.println("<br><hr WIDTH=\"100%\" size=\"1\">");
1289         writer.println("</p><hr WIDTH=\"100%\" size=\"1\"></body></html>");
1290 
1291         writer.flush();
1292     }
1293 
1294     /**
1295      * Returns the index of color from color array based on the results
1296      * Can change this implementation so as to select based on some analysis.
1297      */
selectColor(double baseScore, double targetScore)1298     private static int selectColor(double baseScore, double targetScore) {
1299 
1300         double res = calculateSpeedupPercentage(baseScore, targetScore);
1301 
1302         if (res < -10) {
1303             return 2;
1304         } else if (res > 10) {
1305             return 0;
1306         } else {
1307             return 1;
1308         }
1309     }
1310 
1311     /**
1312      * Calculate Speedup Percentage ->
1313      *     ((target_score - base_score) * 100) / baseScore
1314      * Can change this implementation so as to provide some analysis.
1315      */
calculateSpeedupPercentage(double baseScore, double targetScore)1316     private static double calculateSpeedupPercentage(double baseScore,
1317                                                      double targetScore)
1318     {
1319         return ((targetScore - baseScore) * 100)/baseScore;
1320     }
1321 
printUsage()1322     private static void printUsage() {
1323         String usage =
1324             "\njava XMLHTMLReporter [options]      "     +
1325             "                                      \n\n" +
1326             "where options include:                "     +
1327             "                                      \n"   +
1328             "    -r | -results <result directory>  "     +
1329             "directory to which reports are stored \n"   +
1330             "    -basexml | -b <xml file path>     "     +
1331             "path to base-build result             \n"   +
1332             "    -targetxml | -t <xml file path>   "     +
1333             "path to target-build result           \n"   +
1334             "    -resultxml | -xml <xml file path> "     +
1335             "path to result XML                    \n"   +
1336             "    -group | -g  <level>              "     +
1337             "group-level for tests                 \n"   +
1338             "                                      "     +
1339             " [ 1 , 2 , 3 or 4 ]                   \n"   +
1340             "    -analyzermode | -am               "     +
1341             "mode to be used for finding score     \n"   +
1342             "                                      "     +
1343             " [ BEST , WORST , AVERAGE , MIDAVG ]  ";
1344         System.out.println(usage);
1345         System.exit(0);
1346     }
1347 
1348     /**
1349      * main
1350      */
main(String[] args)1351     public static void main(String[] args) {
1352 
1353         String resDir = ".";
1354         String baseXML = null;
1355         String targetXML = null;
1356         String resultXML = null;
1357         int group = 2;
1358 
1359         /* ---- Analysis Mode ----
1360             BEST    = 1;
1361             WORST   = 2;
1362             AVERAGE = 3;
1363             MIDAVG  = 4;
1364          ------------------------ */
1365         int analyzerMode = 4;
1366 
1367         try {
1368 
1369             for (int i = 0; i < args.length; i++) {
1370                 if (args[i].startsWith("-results") ||
1371                     args[i].startsWith("-r"))
1372                 {
1373                     i++;
1374                     resDir = args[i];
1375                 } else if (args[i].startsWith("-basexml") ||
1376                            args[i].startsWith("-b"))
1377                 {
1378                     i++;
1379                     baseXML = args[i];
1380                 } else if (args[i].startsWith("-targetxml") ||
1381                            args[i].startsWith("-t"))
1382                 {
1383                     i++;
1384                     targetXML = args[i];
1385                 } else if (args[i].startsWith("-resultxml") ||
1386                            args[i].startsWith("-xml"))
1387                 {
1388                     i++;
1389                     resultXML = args[i];
1390                 } else if (args[i].startsWith("-group") ||
1391                            args[i].startsWith("-g"))
1392                 {
1393                     i++;
1394                     group = Integer.parseInt(args[i]);
1395                     System.out.println("Grouping Level for tests: " + group);
1396                 } else if (args[i].startsWith("-analyzermode") ||
1397                            args[i].startsWith("-am"))
1398                 {
1399                     i++;
1400                     String strAnalyzerMode = args[i];
1401                     if(strAnalyzerMode.equalsIgnoreCase("BEST")) {
1402                         analyzerMode = 0;
1403                     } else if (strAnalyzerMode.equalsIgnoreCase("WORST")) {
1404                         analyzerMode = 1;
1405                     } else if (strAnalyzerMode.equalsIgnoreCase("AVERAGE")) {
1406                         analyzerMode = 2;
1407                     } else if (strAnalyzerMode.equalsIgnoreCase("MIDAVG")) {
1408                         analyzerMode = 3;
1409                     } else {
1410                         printUsage();
1411                     }
1412                     System.out.println("Analyzer-Mode: " + analyzerMode);
1413                 }
1414             }
1415         }
1416         catch(Exception e) {
1417             printUsage();
1418         }
1419 
1420         if(resDir != null) {
1421 
1422             XMLHTMLReporter.setGroupLevel(group);
1423             J2DAnalyzer.setMode(analyzerMode);
1424 
1425             if(targetXML != null && baseXML != null) {
1426                 XMLHTMLReporter.generateComparisonReport(resDir, baseXML,
1427                                                          targetXML);
1428             } else if (resultXML != null) {
1429                 XMLHTMLReporter.generateReport(resDir, resultXML);
1430             } else {
1431                 printUsage();
1432             }
1433         } else {
1434             printUsage();
1435         }
1436     }
1437 }
1438