1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*******************************************************************************
2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Copyright (c) 2000, 2009 IBM Corporation and others.
3402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * All rights reserved. This program and the accompanying materials
4402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * are made available under the terms of the Eclipse Public License v1.0
5402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * which accompanies this distribution, and is available at
6402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * http://www.eclipse.org/legal/epl-v10.html
7402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
8402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Contributors:
9402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *     IBM Corporation - initial API and implementation
10402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *******************************************************************************/
11402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpackage org.eclipse.test.internal.performance.results.ui;
12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.File;
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.PrintWriter;
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.StringWriter;
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.lang.reflect.InvocationTargetException;
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Comparator;
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.core.runtime.IProgressMonitor;
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.core.runtime.IStatus;
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.core.runtime.preferences.InstanceScope;
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.action.Action;
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.action.IMenuManager;
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.action.Separator;
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.dialogs.MessageDialog;
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.dialogs.ProgressMonitorDialog;
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.operation.IRunnableWithProgress;
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.resource.JFaceResources;
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.viewers.IStructuredSelection;
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.viewers.LabelProvider;
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.viewers.SelectionChangedEvent;
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.viewers.TreeViewer;
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.viewers.Viewer;
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.jface.viewers.ViewerSorter;
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.swt.SWT;
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.swt.graphics.Color;
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.swt.graphics.Font;
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.swt.graphics.FontData;
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.swt.widgets.Composite;
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.internal.performance.results.db.DB_Results;
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.internal.performance.results.model.BuildResultsElement;
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.internal.performance.results.model.ResultsElement;
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.internal.performance.results.utils.Util;
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.performance.ui.GenerateResults;
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.ui.PlatformUI;
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.ui.dialogs.ElementListSelectionDialog;
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.ui.model.WorkbenchContentProvider;
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.ui.model.WorkbenchLabelProvider;
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/**
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * View to see all the builds which have performance results stored in the database.
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <p>
56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Typical actions from this view are update local data files with builds results
57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * and generated the HTML pages.
58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * </p>
59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class BuildsView extends PerformancesView {
61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Action to generate results.
64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	final class GenerateAction extends Action {
66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		IStatus status;
67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public void run() {
69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Ask for output directory
71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String resultGenerationDir = BuildsView.this.preferences.get(IPerformancesConstants.PRE_RESULTS_GENERATION_DIR, "");
72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String pathFilter = (BuildsView.this.outputDir == null) ? resultGenerationDir : BuildsView.this.outputDir.getPath();
73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File dir = changeDir(pathFilter, "Select directory to write comparison files");
74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (dir == null) {
75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				return;
76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			BuildsView.this.outputDir = dir;
78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			BuildsView.this.preferences.put(IPerformancesConstants.PRE_RESULTS_GENERATION_DIR, dir.getAbsolutePath());
79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Select the reference
81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String[] baselines = BuildsView.this.results.getBaselines();
82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int bLength = baselines.length;
83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String selectedBaseline;
84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			switch (bLength) {
85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				case 0:
86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// no baseline, nothing to do...
87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					selectedBaseline = BuildsView.this.results.getPerformanceResults().getBaselineName();
88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					break;
89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				case 1:
90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// only one baseline, no selection to do
91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					selectedBaseline = baselines[0];
92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					break;
93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				default:
94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// select the baseline from list
95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					ElementListSelectionDialog dialog = new ElementListSelectionDialog(getSite().getShell(), new LabelProvider());
96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dialog.setTitle(getTitleToolTip());
97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dialog.setMessage("Select the baseline to use while generating results:");
98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					String[] defaultBaseline = new String[] { baselines[baselines.length - 1] };
99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dialog.setInitialSelections(defaultBaseline);
100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dialog.setElements(baselines);
101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dialog.open();
102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					Object[] selected = dialog.getResult();
103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if (selected == null)
104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						return;
105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					selectedBaseline = (String) selected[0];
106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					break;
107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			final String baselineName = selectedBaseline;
109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			BuildsView.this.results.getPerformanceResults().setBaselineName(baselineName);
110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Ask for fingerprints
112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			final boolean fingerprints = MessageDialog.openQuestion(BuildsView.this.shell, getTitleToolTip(), "Generate only fingerprints?");
113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Generate all selected builds
115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int length = BuildsView.this.buildsResults.length;
116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			for (int i = 0; i < length; i++) {
117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				generate(i, baselineName, fingerprints);
118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		/*
122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		 * Generate the HTML pages.
123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		 */
124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		private void generate(int i, final String baselineName, final boolean fingerprints) {
125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Create output directory
126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			final String buildName = BuildsView.this.buildsResults[i].getName();
127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			final File genDir = new File(BuildsView.this.outputDir, buildName);
128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (!genDir.exists() && !genDir.mkdir()) {
129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				MessageDialog.openError(BuildsView.this.shell, getTitleToolTip(), "Cannot create " + genDir.getPath() + " to generate results!");
130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				return;
131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Create runnable
134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			IRunnableWithProgress runnable = new IRunnableWithProgress() {
135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					try {
138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						monitor.beginTask("Generate performance results", 10000);
139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						GenerateResults generation = new GenerateResults(BuildsView.this.results.getPerformanceResults(),
140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						    buildName,
141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						    baselineName,
142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						    fingerprints,
143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						    BuildsView.this.dataDir,
144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						    genDir);
145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						GenerateAction.this.status = generation.run(monitor);
146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						monitor.done();
147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					} catch (Exception e) {
148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						e.printStackTrace();
149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			};
152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Run with progress monitor
154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			ProgressMonitorDialog readProgress = new ProgressMonitorDialog(getSite().getShell());
155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			try {
156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				readProgress.run(true, true, runnable);
157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} catch (InvocationTargetException e) {
158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// skip
159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} catch (InterruptedException e) {
160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// skip
161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Results
164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (!this.status.isOK()) {
165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				StringWriter swriter = new StringWriter();
166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				PrintWriter pwriter = new PrintWriter(swriter);
167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				swriter.write(this.status.getMessage());
168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				Throwable ex = this.status.getException();
169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (ex != null) {
170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					swriter.write(": ");
171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					swriter.write(ex.getMessage());
172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					swriter.write('\n');
173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					ex.printStackTrace(pwriter);
174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				MessageDialog.open(this.status.getSeverity(),
176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				    BuildsView.this.shell,
177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				    getTitleToolTip(),
178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				    swriter.toString(),
179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				    SWT.NONE);
180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Action to update local data files with the performance results of a build.
186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 *
187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * This may be done lazily (i.e. not done if the local data already knows
188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * the build) or forced (i.e. done whatever the local data files contain).
189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	class UpdateBuildAction extends Action {
191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		boolean force;
193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		UpdateBuildAction(boolean force) {
195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			super();
196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			this.force = force;
197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public void run() {
200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Verify that directories are set
202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (BuildsView.this.dataDir == null) {
203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (changeDataDir() == null) {
204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if (!MessageDialog.openConfirm(BuildsView.this.shell, getTitleToolTip(), "No local files directory is set, hence the update could not be written! OK to continue?")) {
205402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						return;
206402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
207402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
208402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
209402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
210402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Progress dialog
211402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			IRunnableWithProgress runnable = new IRunnableWithProgress() {
212402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
213402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
214402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					try {
215402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						updateBuilds(monitor);
216402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					} catch (Exception e) {
217402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						e.printStackTrace();
218402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
219402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
220402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			};
221402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			ProgressMonitorDialog readProgress = new ProgressMonitorDialog(getSite().getShell());
222402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			try {
223402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				readProgress.run(true, true, runnable);
224402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} catch (InvocationTargetException e) {
225402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				return;
226402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} catch (InterruptedException e) {
227402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				return;
228402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
229402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
230402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Reset Components and Builds views input
231402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			refreshInput();
232402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			getSiblingView().refreshInput();
233402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
234402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
235402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		void updateBuilds(IProgressMonitor monitor) {
236402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			BuildsView.this.updateBuilds(monitor, this.force);
237402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
238402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
239402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
240402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
241402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Action to update local data files with the performance results of all builds.
242402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 *
243402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * This may be done lazily (i.e. not done if the local data already knows
244402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * the build) or forced (i.e. done whatever the local data files contain).
245402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
246402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	class UpdateAllBuildsAction extends UpdateBuildAction {
247402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
248402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		UpdateAllBuildsAction(boolean force) {
249402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			super(force);
250402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
251402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//
252402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//		public boolean isEnabled() {
253402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//			String[] elements = buildsToUpdate();
254402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//			return elements != null;
255402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//		}
256402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
257402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		void updateBuilds(IProgressMonitor monitor) {
258402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			BuildsView.this.updateAllBuilds(monitor, this.force);
259402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
260402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
261402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
262402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
263402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Class to compare builds regarding their date instead of their name.
264402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 *
265402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @see Util#getBuildDate(String)
266402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
267402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	class BuildDateComparator implements Comparator {
268402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public int compare(Object o1, Object o2) {
269402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	        String s1 = (String) o1;
270402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	        String s2 = (String) o2;
271402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	        return Util.getBuildDate(s1).compareTo(Util.getBuildDate(s2));
272402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	    }
273402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
274402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
275402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Views
276402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	PerformancesView componentsView;
277402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
278402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Results model
279402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	BuildResultsElement[] buildsResults;
280402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
281402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Generation info
282402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	File outputDir;
283402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
284402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Actions
285402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	Action generate;
286402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	UpdateBuildAction updateBuild, updateAllBuilds;
287402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	UpdateBuildAction forceUpdateBuild, forceUpdateAllBuilds;
288402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
289402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// SWT resources
290402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	Font italicFont;
291402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
292402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
293402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Default constructor.
294402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
295402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic BuildsView() {
296402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.preferences = new InstanceScope().getNode(IPerformancesConstants.PLUGIN_ID);
297402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.preferences.addPreferenceChangeListener(this);
298402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
299402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
300402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
301402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Compute the list of builds to update based on their status.
302402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
303402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael MollString[] buildsToUpdate() {
304402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	Object[] elements = this.results.getBuilds();
305402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	int length = elements.length;
306402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	String[] buildsToUpdate = new String[length];
307402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	int count = 0;
308402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	for (int i=0; i<length; i++) {
309402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		BuildResultsElement element = (BuildResultsElement) elements[i];
310402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (element.getStatus() == 0) {
311402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	        buildsToUpdate[count++] = element.getName();
312402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
313402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
314402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (count == 0) return null;
315402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (count < length) {
316402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.arraycopy(buildsToUpdate, 0, buildsToUpdate = new String[count], 0, count);
317402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
318402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	return buildsToUpdate;
319402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
320402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
321402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/* (non-Javadoc)
322402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see org.eclipse.test.internal.performance.results.ui.PerformancesView#createPartControl(org.eclipse.swt.widgets.Composite)
323402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
324402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic void createPartControl(Composite parent) {
325402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	super.createPartControl(parent);
326402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
327402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Create the viewer
328402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
329402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
330402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Set the content provider: first level is builds list
331402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	WorkbenchContentProvider contentProvider = new WorkbenchContentProvider() {
332402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public Object[] getElements(Object o) {
333402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return getBuilds();
334402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
335402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	};
336402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.viewer.setContentProvider(contentProvider);
337402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
338402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Set the label provider
339402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	WorkbenchLabelProvider labelProvider = new WorkbenchLabelProvider() {
340402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
341402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// Set an italic font when no local data have been read
342402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public Font getFont(Object element) {
343402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Font font = super.getFont(element);
344402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (element instanceof BuildResultsElement) {
345402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (((BuildResultsElement) element).isUnknown()) {
346402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if (BuildsView.this.italicFont == null) {
347402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						FontData[] defaultFont = JFaceResources.getDefaultFont().getFontData();
348402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						FontData italicFontData = new FontData(defaultFont[0].getName(), defaultFont[0].getHeight(), SWT.ITALIC);
349402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						BuildsView.this.italicFont = new Font(DEFAULT_DISPLAY, italicFontData);
350402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
351402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					return BuildsView.this.italicFont;
352402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
353402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
354402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return font;
355402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
356402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
357402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// Set font in gray when no local data is available (i.e. local data needs to be updated)
358402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public Color getForeground(Object element) {
359402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Color color = super.getForeground(element);
360402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (element instanceof BuildResultsElement) {
361402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (!((BuildResultsElement) element).isRead()) {
362402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					color = DARK_GRAY;
363402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
364402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
365402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return color;
366402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
367402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	};
368402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.viewer.setLabelProvider(labelProvider);
369402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
370402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Set the children sorter
371402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	ViewerSorter nameSorter = new ViewerSorter() {
372402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
373402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// Sort children using specific comparison (see the implementation
374402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// of the #compareTo(Object) in the ResultsElement hierarchy
375402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public int compare(Viewer view, Object e1, Object e2) {
376402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (e2 instanceof ResultsElement) {
377402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				return ((ResultsElement) e2).compareTo(e1);
378402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
379402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return super.compare(view, e1, e2);
380402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
381402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	};
382402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.viewer.setSorter(nameSorter);
383402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
384402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Finalize viewer initialization
385402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	PlatformUI.getWorkbench().getHelpSystem().setHelp(this.viewer.getControl(), "org.eclipse.test.performance.ui.builds");
386402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	finalizeViewerCreation();
387402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
388402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
389402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/* (non-Javadoc)
390402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see org.eclipse.ui.part.WorkbenchPart#dispose()
391402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
392402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic void dispose() {
393402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (this.italicFont != null) {
394402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.italicFont.dispose();
395402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
396402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	super.dispose();
397402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
398402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
399402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
400402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * (non-Javadoc)
401402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see org.eclipse.test.internal.performance.results.ui.PerformancesView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
402402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
403402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid fillContextMenu(IMenuManager manager) {
404402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	super.fillContextMenu(manager);
405402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	manager.add(this.generate);
406402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	manager.add(this.updateBuild);
407402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	manager.add(this.forceUpdateBuild);
408402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
409402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
410402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
411402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * (non-Javadoc)
412402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see org.eclipse.test.internal.performance.results.ui.PerformancesView#fillLocalPullDown(org.eclipse.jface.action.IMenuManager)
413402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
414402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid fillFiltersDropDown(IMenuManager manager) {
415402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	super.fillFiltersDropDown(manager);
416402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	manager.add(this.filterLastBuilds);
417402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
418402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
419402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
420402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Fill the local data drop-down menu
421402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
422402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid fillLocalDataDropDown(IMenuManager manager) {
423402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	super.fillLocalDataDropDown(manager);
424402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	manager.add(new Separator());
425402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	manager.add(this.updateAllBuilds);
426402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	manager.add(this.forceUpdateAllBuilds);
427402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
428402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
429402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
430402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Get all builds from the model.
431402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
432402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael MollObject[] getBuilds() {
433402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (this.results == null) {
434402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		initResults();
435402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
436402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	return this.results.getBuilds();
437402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
438402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
439402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
440402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Return the components view.
441402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
442402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael MollPerformancesView getSiblingView() {
443402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (this.componentsView == null) {
444402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.componentsView = (PerformancesView) getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsView");
445402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
446402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	return this.componentsView;
447402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
448402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
449402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
450402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * (non-Javadoc)
451402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see org.eclipse.test.internal.performance.results.ui.PerformancesView#makeActions()
452402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
453402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid makeActions() {
454402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
455402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	super.makeActions();
456402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
457402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Generate action
458402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.generate = new GenerateAction();
459402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.generate.setText("&Generate");
460402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
461402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Update build actions
462402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	boolean connected = this.preferences.getBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
463402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateBuild = new UpdateBuildAction(false);
464402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateBuild.setText("&Update from DB");
465402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateBuild.setEnabled(connected);
466402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	this.forceUpdateBuild = new UpdateBuildAction(true);
467402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	this.forceUpdateBuild.setText("Force Update");
468402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
469402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Update build action
470402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateAllBuilds = new UpdateAllBuildsAction(false);
471402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateAllBuilds.setText("&Update from DB (all)");
472402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateAllBuilds.setEnabled(connected);
473402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	this.forceUpdateAllBuilds = new UpdateAllBuildsAction(true);
474402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	this.forceUpdateAllBuilds.setText("Force Update all");
475402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
476402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Set filters default
477402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.filterBaselineBuilds.setChecked(false);
478402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.filterNightlyBuilds.setChecked(false);
479402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
480402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
481402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/**
482402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Reset the views.
483402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
484402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic void resetView() {
485402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
486402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	boolean debug = true;
487402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
488402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Look whether database constants has changed or not
489402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	int eclipseVersion = this.preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
490402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	boolean connected = this.preferences.getBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
491402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	String databaseLocation = this.preferences.get(IPerformancesConstants.PRE_DATABASE_LOCATION, IPerformancesConstants.NETWORK_DATABASE_LOCATION);
492402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	String lastBuild = this.preferences.get(IPerformancesConstants.PRE_LAST_BUILD, null);
493402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	boolean noLastBuild = lastBuild.length() == 0;
494402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (debug) {
495402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("Reset View:");
496402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- eclispe version = "+eclipseVersion);
497402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- connected       = "+connected);
498402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- db location     = "+databaseLocation);
499402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- last build      = "+(noLastBuild?"<none>":lastBuild));
500402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
501402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	final boolean sameVersion = DB_Results.getDbVersion().endsWith(Integer.toString(eclipseVersion));
502402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	final boolean sameConnection = connected == DB_Results.DB_CONNECTION;
503402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	final boolean sameDB = sameVersion && databaseLocation.equals(DB_Results.getDbLocation());
504402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	boolean sameLastBuild = (noLastBuild && LAST_BUILD == null) || lastBuild.equals(LAST_BUILD);
505402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (debug) {
506402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- same version:    "+sameVersion);
507402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- same connection: "+sameConnection);
508402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- same DB:         "+sameDB);
509402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- same last build: "+sameLastBuild);
510402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
511402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	final PerformancesView siblingView = getSiblingView();
512402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (sameConnection && sameDB) {
513402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (!sameLastBuild) {
514402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Set last build
515402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			LAST_BUILD = noLastBuild ? null : lastBuild;
516402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			this.results.setLastBuildName(LAST_BUILD);
517402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			siblingView.results.setLastBuildName(LAST_BUILD);
518402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
519402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// Reset views content
520402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			resetInput();
521402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			siblingView.resetInput();
522402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
523402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// May be read local data now
524402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File newDataDir = changeDataDir();
525402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (newDataDir == null) {
526402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				this.dataDir = null;
527402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				siblingView.dataDir = null;
528402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
529402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
530402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// No database preferences has changed do nothing
531402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return;
532402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
533402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
534402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Update database constants
535402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	boolean updated = DB_Results.updateDbConstants(connected, eclipseVersion, databaseLocation);
536402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (debug) {
537402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("	- updated:         "+updated);
538402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
539402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (!connected) {
540402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (!updated) {
541402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			MessageDialog.openError(this.shell, getTitleToolTip(), "Error while updating database results constants!\nOpen error log to see more details on this error");
542402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
543402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	} else if (updated) {
544402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringBuffer message = new StringBuffer("Database connection has been correctly ");
545402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		message.append( connected ? "opened." : "closed.");
546402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		MessageDialog.openInformation(this.shell, getTitleToolTip(), message.toString());
547402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	} else {
548402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		MessageDialog.openError(this.shell, getTitleToolTip(), "The database connection cannot be established!\nOpen error log to see more details on this error");
549402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		DB_Results.updateDbConstants(false, eclipseVersion, databaseLocation);
550402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
551402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	setTitleToolTip();
552402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	siblingView.setTitleToolTip();
553402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
554402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Refresh view
555402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (sameVersion && sameLastBuild) {
556402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// Refresh only builds view as the sibling view (Components) contents is based on local data files contents
557402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.results.resetBuildNames();
558402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		refreshInput();
559402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	} else {
560402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// Reset views content
561402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		resetInput();
562402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		siblingView.resetInput();
563402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
564402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// May be read local data now
565402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (MessageDialog.openQuestion(this.shell, getTitleToolTip(), "Do you want to read local data right now?")) {
566402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			changeDataDir();
567402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else {
568402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			this.dataDir = null;
569402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			siblingView.dataDir = null;
570402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
571402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
572402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
573402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Update actions
574402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateBuild.setEnabled(connected);
575402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateAllBuilds.setEnabled(connected);
576402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
577402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
578402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*
579402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * (non-Javadoc)
580402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see org.eclipse.test.internal.performance.results.ui.PerformancesView#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
581402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
582402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic void selectionChanged(SelectionChangedEvent event) {
583402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	super.selectionChanged(event);
584402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
585402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Update selected element
586402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	Object selection = this.viewer.getSelection();
587402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	int length = 0;
588402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (selection instanceof IStructuredSelection) {
589402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Object[] elements = ((IStructuredSelection)selection).toArray();
590402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		length = elements == null ? 0 : elements.length;
591402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.buildsResults = new BuildResultsElement[length];
592402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (length == 0) {
593402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			this.updateAllBuilds.setText("&Update from DB (all)");
594402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return;
595402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
596402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for (int i=0; i<length; i++) {
597402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			this.buildsResults[i] = (BuildResultsElement) elements[i];
598402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
599402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	} else {
600402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return;
601402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
602402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
603402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Update update build action
604402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	boolean enableUpdateBuild = true;
605402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	boolean enableGenerate = true;
606402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	int readBuilds = 0;
607402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	for (int i=0; i<length; i++) {
608402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (this.buildsResults[i].isRead()) {
609402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//			enableUpdateBuild = false;
610402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			readBuilds++;
611402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else {
612402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//			enableGenerate = false;
613402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
614402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
615402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	this.updateBuild.setEnabled(enableUpdateBuild);
616402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll//	this.forceUpdateBuild.setEnabled(!enableUpdateBuild);
617402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	final boolean force = readBuilds < length;
618402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateBuild.force = force;
619402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateAllBuilds.force = force;
620402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.updateAllBuilds.setText("&Update from DB");
621402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
622402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Update generate action
623402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	boolean enableGenerate = true;
624402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (enableGenerate) {
625402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for (int i=0; i<length; i++) {
626402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (this.buildsResults[i].getName().startsWith(DB_Results.getDbBaselinePrefix())) {
627402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				enableGenerate = false;
628402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				break;
629402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
630402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
631402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
632402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.generate.setEnabled(enableGenerate);
633402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
634402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
635402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid updateAllBuilds(IProgressMonitor monitor, boolean force) {
636402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (this.dataDir == null) {
637402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		changeDataDir();
638402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
639402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	String[] builds = buildsToUpdate();
640402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (builds == null) {
641402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.results.updateBuild(null, true, this.dataDir, monitor);
642402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	} else {
643402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.results.updateBuilds(builds, force, this.dataDir, monitor);
644402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
645402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
646402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
647402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid updateBuilds(IProgressMonitor monitor, boolean force) {
648402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	if (this.dataDir == null) {
649402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		changeDataDir();
650402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
651402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	int length = this.buildsResults.length;
652402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	String[] builds = new String[length];
653402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	for (int i = 0; i < length; i++) {
654402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		builds[i] = this.buildsResults[i].getName();
655402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
656402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	this.results.updateBuilds(builds, force, this.dataDir, monitor);
657402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
658402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
659402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}