aboutsummaryrefslogtreecommitdiff
path: root/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java
diff options
context:
space:
mode:
Diffstat (limited to 'basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java')
-rw-r--r--basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java445
1 files changed, 445 insertions, 0 deletions
diff --git a/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java
new file mode 100644
index 0000000..ca3e7fb
--- /dev/null
+++ b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java
@@ -0,0 +1,445 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.test.internal.performance.results.db;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.test.internal.performance.results.utils.Util;
+
+/**
+ * Class to handle performance results of an eclipse component
+ * (for example 'org.eclipse.jdt.core').
+ *
+ * It gives access to results for each scenario run for this component.
+ *
+ * @see ScenarioResults
+ */
+public class ComponentResults extends AbstractResults {
+
+public ComponentResults(AbstractResults parent, String name) {
+ super(parent, name);
+ this.printStream = parent.printStream;
+}
+
+Set getAllBuildNames() {
+ Set buildNames = new HashSet();
+ int size = size();
+ for (int i=0; i<size; i++) {
+ ScenarioResults scenarioResults = (ScenarioResults) this.children.get(i);
+ Set builds = scenarioResults.getAllBuildNames();
+ buildNames.addAll(builds);
+ }
+ return buildNames;
+}
+
+/**
+ * Return all the build names for this component sorted by ascending order.
+ *
+ * @return An array of names
+ */
+public String[] getAllSortedBuildNames() {
+ return getAllSortedBuildNames(false/*ascending order*/);
+}
+
+String[] getAllSortedBuildNames(final boolean reverse) {
+ Set allBuildNames = getAllBuildNames();
+ String[] sortedNames = new String[allBuildNames.size()];
+ allBuildNames.toArray(sortedNames);
+ Arrays.sort(sortedNames, new Comparator() {
+ public int compare(Object o1, Object o2) {
+ String s1 = (String) (reverse ? o2 : o1);
+ String s2 = (String) (reverse ? o1 : o2);
+ return Util.getBuildDate(s1).compareTo(Util.getBuildDate(s2));
+ }
+ });
+ return sortedNames;
+}
+
+ComponentResults getComponentResults() {
+ return this;
+}
+
+/**
+ * Get all results numbers for a given machine of the current component.
+ *
+ * @param configName The name of the configuration to get numbers
+ * @param fingerprints Set whether only fingerprints scenario should be taken into account
+ * @return A list of lines. Each line represent a build and is a list of either strings or values.
+ * Values are an array of double:
+ * <ul>
+ * <li>{@link #BUILD_VALUE_INDEX}: the build value in milliseconds</li>
+ * <li>{@link #BASELINE_VALUE_INDEX}: the baseline value in milliseconds</li>
+ * <li>{@link #DELTA_VALUE_INDEX}: the difference between the build value and its more recent baseline</li>
+ * <li>{@link #DELTA_ERROR_INDEX}: the error made while computing the difference</li>
+ * <li>{@link #BUILD_ERROR_INDEX}: the error made while measuring the build value</li>
+ * <li>{@link #BASELINE_ERROR_INDEX}: the error made while measuring the baseline value</li>
+ * </ul>
+*/
+public List getConfigNumbers(String configName, boolean fingerprints, List differences) {
+
+ // Initialize lists
+ AbstractResults[] scenarios = getChildren();
+ int length = scenarios.length;
+
+ // Print scenario names line
+ List firstLine = new ArrayList();
+ for (int i=0; i<length; i++) {
+ ScenarioResults scenarioResults = (ScenarioResults) scenarios[i];
+ if (!fingerprints || scenarioResults.hasSummary()) {
+ firstLine.add(scenarioResults.getName());
+ }
+ }
+
+ // Print each build line
+ String[] builds = getAllSortedBuildNames(true/*descending order*/);
+// int milestoneIndex = 0;
+// String milestoneDate = Util.getMilestoneDate(milestoneIndex);
+ String currentBuildName = null;
+ int buildsLength= builds.length;
+ firstLine.add(0, new Integer(buildsLength));
+ differences.add(firstLine);
+ for (int i=0; i<buildsLength; i++) {
+ List line = new ArrayList();
+ String buildName = builds[i];
+ line.add(buildName);
+ if (!buildName.startsWith(DB_Results.getDbBaselinePrefix())) {
+ for (int j=0; j<length; j++) {
+ ScenarioResults scenarioResults = (ScenarioResults) scenarios[j];
+ if (!fingerprints || scenarioResults.hasSummary()) {
+ ConfigResults configResults = scenarioResults.getConfigResults(configName);
+ BuildResults buildResults = configResults == null ? null : configResults.getBuildResults(buildName);
+ if (buildResults == null) {
+ // no result for this scenario in this build
+ line.add(NO_BUILD_RESULTS);
+ } else {
+ line.add(configResults.getNumbers(buildResults, configResults.getBaselineBuildResults(buildName)));
+ }
+ }
+ }
+ differences.add(line);
+ if (currentBuildName != null && currentBuildName.charAt(0) != 'N') {
+ }
+ currentBuildName = buildName;
+ }
+// if (milestoneDate != null) { // update previous builds
+// int dateComparison = milestoneDate.compareTo(Util.getBuildDate(buildName));
+// if (dateComparison <= 0) {
+// if (dateComparison == 0) {
+// }
+// if (++milestoneIndex == Util.MILESTONES.length) {
+// milestoneDate = null;
+// } else {
+// milestoneDate = Util.getMilestoneDate(milestoneIndex);
+// }
+// }
+// }
+ }
+
+ // Write differences lines
+ int last = buildsLength-1;
+ String lastBuildName = builds[last];
+ while (last > 0 && lastBuildName.startsWith(DB_Results.getDbBaselinePrefix())) {
+ lastBuildName = builds[--last];
+ }
+// appendDifferences(lastBuildName, configName, previousMilestoneName, differences, fingerprints);
+// appendDifferences(lastBuildName, configName, previousBuildName, differences, fingerprints);
+
+ // Return the computed differences
+ return differences;
+}
+
+/*
+double[] getConfigNumbers(BuildResults buildResults, BuildResults baselineResults) {
+ if (baselineResults == null) {
+ return INVALID_RESULTS;
+ }
+ double[] values = new double[NUMBERS_LENGTH];
+ for (int i=0 ;i<NUMBERS_LENGTH; i++) {
+ values[i] = Double.NaN;
+ }
+ double buildValue = buildResults.getValue();
+ values[BUILD_VALUE_INDEX] = buildValue;
+ double baselineValue = baselineResults.getValue();
+ values[BASELINE_VALUE_INDEX] = baselineValue;
+ double delta = (baselineValue - buildValue) / baselineValue;
+ values[DELTA_VALUE_INDEX] = delta;
+ if (Double.isNaN(delta)) {
+ return values;
+ }
+ long baselineCount = baselineResults.getCount();
+ long currentCount = buildResults.getCount();
+ if (baselineCount > 1 && currentCount > 1) {
+ double baselineError = baselineResults.getError();
+ double currentError = buildResults.getError();
+ values[BASELINE_ERROR_INDEX] = baselineError;
+ values[BUILD_ERROR_INDEX] = currentError;
+ values[DELTA_ERROR_INDEX] = Double.isNaN(baselineError)
+ ? currentError / baselineValue
+ : Math.sqrt(baselineError*baselineError + currentError*currentError) / baselineValue;
+ }
+ return values;
+}
+*/
+
+private ScenarioResults getScenarioResults(List scenarios, int searchedId) {
+ int size = scenarios.size();
+ for (int i=0; i<size; i++) {
+ ScenarioResults scenarioResults = (ScenarioResults) scenarios.get(i);
+ if (scenarioResults.id == searchedId) {
+ return scenarioResults;
+ }
+ }
+ return null;
+}
+
+/**
+ * Returns a list of scenario results which have a summary
+ *
+ * @param global Indicates whether the summary must be global or not.
+ * @param config Configuration name
+ * @return A list of {@link ScenarioResults scenario results} which have a summary
+ */
+public List getSummaryScenarios(boolean global, String config) {
+ int size= size();
+ List scenarios = new ArrayList(size);
+ for (int i=0; i<size; i++) {
+ ScenarioResults scenarioResults = (ScenarioResults) this.children.get(i);
+ ConfigResults configResults = scenarioResults.getConfigResults(config);
+ if (configResults != null) {
+ BuildResults buildResults = configResults.getCurrentBuildResults();
+ if ((global && buildResults.summaryKind == 1) || (!global && buildResults.summaryKind >= 0)) {
+ scenarios.add(scenarioResults);
+ }
+ }
+ }
+ return scenarios;
+}
+
+private String lastBuildName(int kind) {
+ String[] builds = getAllSortedBuildNames();
+ int idx = builds.length-1;
+ String lastBuildName = builds[idx--];
+ switch (kind) {
+ case 1: // no ref
+ while (lastBuildName.startsWith(DB_Results.getDbBaselinePrefix())) {
+ lastBuildName = builds[idx--];
+ }
+ break;
+ case 2: // only I-build or M-build
+ char ch = lastBuildName.charAt(0);
+ while (ch != 'I' && ch != 'M') {
+ lastBuildName = builds[idx--];
+ ch = lastBuildName.charAt(0);
+ }
+ break;
+ default:
+ break;
+ }
+ return lastBuildName;
+}
+
+/*
+ * Read local file contents and populate the results model with the collected
+ * information.
+ */
+String readLocalFile(File dir, List scenarios) throws FileNotFoundException {
+// if (!dir.exists()) return null;
+ File dataFile = new File(dir, getName()+".dat"); //$NON-NLS-1$
+ if (!dataFile.exists()) throw new FileNotFoundException();
+ DataInputStream stream = null;
+ try {
+ // Read local file info
+ stream = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
+ print(" - read local files info"); //$NON-NLS-1$
+ String lastBuildName = stream.readUTF(); // first string is the build name
+
+ // Next field is the number of scenarios for the component
+ int size = stream.readInt();
+
+ // Then follows all the scenario information
+ for (int i=0; i<size; i++) {
+ // ... which starts with the scenario id
+ int scenario_id = stream.readInt();
+ ScenarioResults scenarioResults = scenarios == null ? null : getScenarioResults(scenarios, scenario_id);
+ if (scenarioResults == null) {
+ // this can happen if scenario pattern does not cover all those stored in local data file
+ // hence, creates a fake scenario to read the numbers and skip to the next scenario
+ scenarioResults = new ScenarioResults(-1, null, null);
+// scenarioResults.parent = this;
+// scenarioResults.readData(stream);
+ // Should no longer occur as we get all scenarios from database now
+// throw new RuntimeException("Unexpected unfound scenario!"); //$NON-NLS-1$
+ }
+ scenarioResults.parent = this;
+ scenarioResults.printStream = this.printStream;
+ scenarioResults.readData(stream);
+ addChild(scenarioResults, true);
+ if (this.printStream != null) this.printStream.print('.');
+ }
+ println();
+ println(" => "+size+" scenarios data were read from file "+dataFile); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Return last build name stored in the local files
+ return lastBuildName;
+ } catch (IOException ioe) {
+ println(" !!! "+dataFile+" should be deleted as it contained invalid data !!!"); //$NON-NLS-1$ //$NON-NLS-2$
+ } finally {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ // nothing else to do!
+ }
+ }
+ return null;
+}
+
+/*
+ * Read the database values for a build name and a list of scenarios.
+ * The database is read only if the components does not already knows the
+ * given build (i.e. if it has not been already read) or if the force arguments is set.
+ */
+void updateBuild(String buildName, List scenarios, boolean force, File dataDir, SubMonitor subMonitor, PerformanceResults.RemainingTimeGuess timeGuess) {
+
+ // Read all variations
+ println("Component '"+this.name+"':"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // manage monitor
+ int size = scenarios.size();
+ subMonitor.setWorkRemaining(size+1);
+ StringBuffer buffer = new StringBuffer("Component "); //$NON-NLS-1$
+ buffer.append(this.name);
+ buffer.append("..."); //$NON-NLS-1$
+ String title = buffer.toString();
+ subMonitor.subTask(title+timeGuess.display());
+ timeGuess.count++;
+ subMonitor.worked(1);
+ if (subMonitor.isCanceled()) return;
+
+ // Read new values for the local result
+ boolean dirty = false;
+ long readTime = System.currentTimeMillis();
+ String log = " - read scenarios from DB:"; //$NON-NLS-1$
+ if (size > 0) {
+ for (int i=0; i<size; i++) {
+
+ // manage monitor
+ subMonitor.subTask(title+timeGuess.display());
+ timeGuess.count++;
+ if (log != null) {
+ println(log);
+ log = null;
+ }
+
+ // read results
+ ScenarioResults nextScenarioResults= (ScenarioResults) scenarios.get(i);
+ ScenarioResults scenarioResults = (ScenarioResults) getResults(nextScenarioResults.id);
+ if (scenarioResults == null) {
+ // Scenario is not known yet, force an update
+ scenarioResults = nextScenarioResults;
+ scenarioResults.parent = this;
+ scenarioResults.printStream = this.printStream;
+ scenarioResults.updateBuild(buildName, true);
+ dirty = true;
+ addChild(scenarioResults, true);
+ } else {
+ if (scenarioResults.updateBuild(buildName, force)) {
+ dirty = true;
+ }
+ }
+ if (dataDir != null && dirty && (System.currentTimeMillis() - readTime) > 300000) { // save every 5mn
+ writeData(buildName, dataDir, true, true);
+ dirty = false;
+ readTime = System.currentTimeMillis();
+ }
+
+ // manage monitor
+ subMonitor.worked(1);
+ if (subMonitor.isCanceled()) return;
+ }
+ }
+
+ // Write local files
+ if (dataDir != null) {
+ writeData(buildName, dataDir, false, dirty);
+ }
+
+ // Print global time
+ printGlobalTime(readTime);
+
+}
+
+/*
+ * Write the component results data to the file '<component name>.dat' in the given directory.
+ */
+void writeData(String buildName, File dir, boolean temp, boolean dirty) {
+// if (!dir.exists() && !dir.mkdirs()) {
+// System.err.println("can't create directory "+dir); //$NON-NLS-1$
+// }
+ File tmpFile = new File(dir, getName()+".tmp"); //$NON-NLS-1$
+ File dataFile = new File(dir, getName()+".dat"); //$NON-NLS-1$
+ if (!dirty) { // only possible on final write
+ if (tmpFile.exists()) {
+ if (dataFile.exists()) dataFile.delete();
+ tmpFile.renameTo(dataFile);
+ println(" => rename temporary file to "+dataFile); //$NON-NLS-1$
+ }
+ return;
+ }
+ if (tmpFile.exists()) {
+ tmpFile.delete();
+ }
+ File file;
+ if (temp) {
+ file = tmpFile;
+ } else {
+ if (dataFile.exists()) {
+ dataFile.delete();
+ }
+ file = dataFile;
+ }
+ try {
+ DataOutputStream stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
+ try {
+ int size = this.children.size();
+ stream.writeUTF(lastBuildName(0));
+ stream.writeInt(size);
+ for (int i=0; i<size; i++) {
+ ScenarioResults scenarioResults = (ScenarioResults) this.children.get(i);
+ scenarioResults.write(stream);
+ }
+ }
+ finally {
+ stream.close();
+ println(" => extracted data "+(temp?"temporarily ":"")+"written in file "+file); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+ } catch (FileNotFoundException e) {
+ System.err.println("can't create output file"+file); //$NON-NLS-1$
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+}
+
+}