Home | History | Annotate | Download | only in ui
      1 /*******************************************************************************
      2  * Copyright (c) 2000, 2009 IBM Corporation and others.
      3  * All rights reserved. This program and the accompanying materials
      4  * are made available under the terms of the Eclipse Public License v1.0
      5  * which accompanies this distribution, and is available at
      6  * http://www.eclipse.org/legal/epl-v10.html
      7  *
      8  * Contributors:
      9  *     IBM Corporation - initial API and implementation
     10  *******************************************************************************/
     11 package org.eclipse.test.performance.ui;
     12 
     13 import java.io.PrintStream;
     14 import java.util.ArrayList;
     15 import java.util.Collections;
     16 import java.util.List;
     17 
     18 import org.eclipse.test.internal.performance.data.Dim;
     19 import org.eclipse.test.internal.performance.results.db.BuildResults;
     20 import org.eclipse.test.internal.performance.results.db.ConfigResults;
     21 import org.eclipse.test.internal.performance.results.db.DB_Results;
     22 import org.eclipse.test.internal.performance.results.utils.Util;
     23 
     24 /**
     25  * Class used to fill details file of scenario builds data.
     26  * @see ScenarioData
     27  */
     28 public class RawDataTable {
     29 
     30 	private ConfigResults configResults;
     31 	private List buildPrefixes;
     32 	private PrintStream stream;
     33 	private Dim[] dimensions = DB_Results.getResultsDimensions();
     34 	private boolean debug = false;
     35 
     36 private RawDataTable(ConfigResults results, PrintStream ps) {
     37 	this.configResults = results;
     38 	this.stream = ps;
     39 }
     40 
     41 public RawDataTable(ConfigResults results, List prefixes, PrintStream ps) {
     42 	this(results, ps);
     43 	this.buildPrefixes = prefixes;
     44 }
     45 public RawDataTable(ConfigResults results, String baselinePrefix, PrintStream ps) {
     46 	this(results, ps);
     47 	this.buildPrefixes = new ArrayList();
     48 	this.buildPrefixes.add(baselinePrefix);
     49 }
     50 
     51 /**
     52  * Print all build data to the current stream.
     53  */
     54 public void print(){
     55 	this.stream.print("<table border=\"1\">");
     56 	printSummary();
     57 	printDetails();
     58 	this.stream.print("</table>\n");
     59 }
     60 
     61 /*
     62  * Print table columns headers.
     63  */
     64 private void printColumnHeaders() {
     65 	StringBuffer buffer = new StringBuffer();
     66 	int length = this.dimensions.length;
     67 	for (int i=0; i<length; i++) {
     68 		buffer.append("<td><b>");
     69 		buffer.append(this.dimensions[i].getName());
     70 		buffer.append("</b></td>");
     71 	}
     72 	this.stream.print(buffer.toString());
     73 }
     74 
     75 /*
     76  * Print all build results in the table.
     77  */
     78 private void printDetails() {
     79 	this.stream.print("<tr><td><b>Build ID</b></td>");
     80 	printColumnHeaders();
     81 	this.stream.print("</tr>\n");
     82 
     83 	List builds = this.configResults.getBuildsMatchingPrefixes(this.buildPrefixes);
     84 	Collections.reverse(builds);
     85 	int size = builds.size();
     86 	for (int i=0; i<size; i++) {
     87 		BuildResults buildResults = (BuildResults) builds.get(i);
     88 		this.stream.print("<tr><td>");
     89 		this.stream.print(buildResults.getName());
     90 		this.stream.print("</td>");
     91 		int dimLength = this.dimensions.length;
     92 		for (int d=0; d<dimLength; d++) {
     93 			Dim dimension = this.dimensions[d];
     94 			int dim_id = dimension.getId();
     95 			double value = buildResults.getValue(dim_id);
     96 			printDimTitle(dimension.getName());
     97 			String displayValue = dimension.getDisplayValue(value);
     98 			this.stream.print(displayValue);
     99 			if (this.debug) System.out.print("\t"+displayValue);
    100 			this.stream.print("</td>");
    101 		}
    102 		if (this.debug) System.out.println();
    103 		this.stream.print("</tr>\n");
    104 	}
    105 	if (this.debug) System.out.println("\n");
    106 }
    107 
    108 /*
    109  * Print summary on top of the table.
    110  */
    111 private void printSummary() {
    112 	this.stream.print("<tr><td><b>Stats</b></td>");
    113 	printColumnHeaders();
    114 	this.stream.print("</tr>\n");
    115 
    116 	int length = this.dimensions.length;
    117 	double[][] dimStats = new double[length][];
    118 	for (int i=0; i<length; i++) {
    119 		dimStats[i] = this.configResults.getStatistics(this.buildPrefixes, this.dimensions[i].getId());
    120 	}
    121 
    122 	this.stream.print("<tr><td>#BUILDS SAMPLED</td>");
    123 	for (int i=0; i<length; i++) {
    124 		String dimName = this.dimensions[i].getName();
    125 		printDimTitle(dimName);
    126 		this.stream.print((int)dimStats[i][0]);
    127 		this.stream.print("</td>");
    128 	}
    129 	this.stream.print("</tr>\n");
    130 	this.stream.print("<tr><td>MEAN</td>");
    131 	printRowDoubles(dimStats, 1);
    132 	this.stream.print("</tr>\n");
    133 	this.stream.print("<tr><td>STD DEV</td>");
    134 	printRowDoubles(dimStats, 2);
    135 	this.stream.print("</tr>\n");
    136 	this.stream.print("<tr><td>COEF. VAR</td>");
    137 	printRowDoubles(dimStats, 3);
    138 	this.stream.print("</tr>\n");
    139 
    140 	// Blank line
    141 	this.stream.print("<tr>");
    142 	for (int i=0; i<length+1;	i++){
    143 		this.stream.print("<td>&nbsp;</td>");
    144 	}
    145 	this.stream.print("</tr>\n");
    146 }
    147 
    148 /*
    149  * Print values in table row.
    150  */
    151 private void printRowDoubles(double[][] stats, int idx) {
    152 	int length = this.dimensions.length;
    153 	for (int i=0; i<length; i++) {
    154 		double value = stats[i][idx];
    155 		String dimName = this.dimensions[i].getName();
    156 		if (idx == 3) {
    157 			if (value > 0.1 && value < 0.2) {
    158 				this.stream.print("<td bgcolor=\"yellow\" title=\"");
    159 			} else if (value >= 0.2) {
    160 				this.stream.print("<td bgcolor=\"FF9900\" title=\"");
    161 			} else {
    162 				this.stream.print("<td title=\"");
    163 			}
    164 			this.stream.print(dimName);
    165 			this.stream.print("\">");
    166 			this.stream.print(Util.PERCENTAGE_FORMAT.format(value));
    167 			this.stream.print("</td>");
    168 		} else {
    169 			printDimTitle(dimName);
    170 			this.stream.print(this.dimensions[i].getDisplayValue(value));
    171 			this.stream.print("</td>");
    172 		}
    173 	}
    174 }
    175 
    176 /*
    177  * Print dim title inside value reference.
    178  * TODO (frederic) See if this title is really necessary
    179  */
    180 private void printDimTitle(String dimName) {
    181     this.stream.print("<td title=\"");
    182     this.stream.print(dimName);
    183     this.stream.print("\">");
    184 }
    185 }
    186