Merge commit 'e1de8d2d152352eded708615a967021db7800709' into lttng-luna
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / project / model / TmfOpenTraceHelper.java
CommitLineData
76fccfb0
MK
1/**********************************************************************
2 * Copyright (c) 2013 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Matthew Khouzam - Initial API and implementation
67c53011 11 * Patrick Tasse - Update open trace and add open experiment
76fccfb0
MK
12 **********************************************************************/
13
14package org.eclipse.linuxtools.tmf.ui.project.model;
15
16import java.io.File;
17import java.util.List;
18
19import org.eclipse.core.resources.IFile;
20import org.eclipse.core.resources.IFolder;
21import org.eclipse.core.resources.IProject;
22import org.eclipse.core.resources.IResource;
23import org.eclipse.core.resources.IWorkspace;
24import org.eclipse.core.resources.IWorkspaceRoot;
25import org.eclipse.core.resources.ResourcesPlugin;
26import org.eclipse.core.runtime.CoreException;
27import org.eclipse.core.runtime.IPath;
28import org.eclipse.core.runtime.IStatus;
29import org.eclipse.core.runtime.Path;
30import org.eclipse.core.runtime.Status;
31import org.eclipse.linuxtools.internal.tmf.ui.Activator;
32import org.eclipse.linuxtools.internal.tmf.ui.project.model.TmfImportHelper;
33import org.eclipse.linuxtools.internal.tmf.ui.project.model.TmfTraceImportException;
34import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
35import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
36import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
67c53011 37import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;
76fccfb0
MK
38import org.eclipse.linuxtools.tmf.ui.editors.TmfEditorInput;
39import org.eclipse.linuxtools.tmf.ui.editors.TmfEventsEditor;
40import org.eclipse.swt.widgets.Display;
41import org.eclipse.swt.widgets.MessageBox;
42import org.eclipse.swt.widgets.Shell;
43import org.eclipse.ui.IEditorInput;
44import org.eclipse.ui.IEditorPart;
371536f0 45import org.eclipse.ui.IEditorReference;
eb271b88 46import org.eclipse.ui.IReusableEditor;
76fccfb0
MK
47import org.eclipse.ui.IWorkbench;
48import org.eclipse.ui.IWorkbenchPage;
49import org.eclipse.ui.PartInitException;
50import org.eclipse.ui.PlatformUI;
51import org.eclipse.ui.ide.IDE;
52import org.eclipse.ui.part.FileEditorInput;
53
54/**
55 * Open trace helper
56 *
57 * Helper class for opening trace resources and loading them to a tracing
58 * project.
59 *
60 * @author Matthew Khouzam
61 * @since 2.1
62 */
63public class TmfOpenTraceHelper {
64
65 private static final String ENDL = System.getProperty("line.separator"); //$NON-NLS-1$
66
67 /**
68 * Opens a trace from a path while importing it to the project
69 * "projectRoot". The trace is linked as a resource.
70 *
71 * @param projectRoot
72 * The project to import to
73 * @param path
74 * the file to import
75 * @param shell
76 * the shell to use for dialogs
77 * @return IStatus OK if successful
78 * @throws CoreException
79 * core exceptions if something is not well set up in the back
80 * end
81 */
82 public IStatus openTraceFromPath(String projectRoot, String path, Shell shell) throws CoreException {
4958a213
MK
83 return openTraceFromPath(projectRoot, path, shell, null);
84 }
85
86 /**
87 * Opens a trace from a path while importing it to the project
88 * "projectRoot". The trace is linked as a resource.
89 *
90 * @param projectRoot
91 * The project to import to
92 * @param path
93 * the file to import
94 * @param shell
95 * the shell to use for dialogs
96 * @param tracetypeHint
97 * The trace type id, can be null
98 * @return IStatus OK if successful
99 * @throws CoreException
100 * core exceptions if something is not well set up in the back
101 * end
102 *
103 * @since 2.2
104 */
105 public IStatus openTraceFromPath(String projectRoot, String path, Shell shell, String tracetypeHint) throws CoreException {
76fccfb0
MK
106 TmfTraceType tt = TmfTraceType.getInstance();
107 TraceTypeHelper traceTypeToSet = null;
108 try {
4958a213 109 traceTypeToSet = tt.selectTraceType(path, shell, tracetypeHint);
76fccfb0
MK
110 } catch (TmfTraceImportException e) {
111 MessageBox mb = new MessageBox(shell);
112 mb.setMessage(e.getMessage());
113 mb.open();
114 return new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage());
115 }
116 if (traceTypeToSet == null) {
117 return Status.CANCEL_STATUS;
118 }
119 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectRoot);
120 IFolder folder = project.getFolder(TmfTraceFolder.TRACE_FOLDER_NAME);
121 String traceName = getTraceName(path, folder);
122 if (traceExists(path, folder)) {
123 return openTraceFromProject(projectRoot, traceName);
124 }
125 final IPath tracePath = folder.getFullPath().append(traceName);
126 final IPath pathString = Path.fromOSString(path);
127 IResource linkedTrace = TmfImportHelper.createLink(folder, pathString, traceName);
128 if (linkedTrace != null && linkedTrace.exists()) {
129 IStatus ret = TmfTraceType.setTraceType(tracePath, traceTypeToSet);
130 if (ret.isOK()) {
131 ret = openTraceFromProject(projectRoot, traceName);
132 }
133 return ret;
134 }
135 return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
136 Messages.TmfOpenTraceHelper_LinkFailed);
137 }
138
139 private static boolean traceExists(String file, IFolder folder) {
140 String val = getTraceName(file, folder);
141 return (folder.findMember(val) != null);
142 }
143
144 private static boolean isWrongMember(IFolder folder, String ret, final File traceFile) {
145 final IResource candidate = folder.findMember(ret);
146 if (candidate != null) {
147 final IPath rawLocation = candidate.getRawLocation();
148 final File file = rawLocation.toFile();
149 return !file.equals(traceFile);
150 }
151 return false;
152 }
153
154 /**
155 * Gets the display name, either "filename" or "filename(n)" if there is
156 * already a filename existing where n is the next non-used integer starting
157 * from 2
158 *
159 * @param file
160 * the file with path
161 * @param folder
162 * the folder to import to
163 * @return the filename
164 */
165 private static String getTraceName(String file, IFolder folder) {
166 String ret;
167 final File traceFile = new File(file);
168 ret = traceFile.getName();
169 for (int i = 2; isWrongMember(folder, ret, traceFile); i++) {
170 ret = traceFile.getName() + '(' + i + ')';
171 }
172 return ret;
173 }
174
175 /**
176 * Open a trace from a project
177 *
178 * @param projectRoot
179 * the root of the project
180 * @param traceName
181 * the trace name
182 * @return success or error
183 */
184 public static IStatus openTraceFromProject(String projectRoot, String traceName) {
185 final IWorkspace workspace = ResourcesPlugin.getWorkspace();
186 final IWorkspaceRoot root = workspace.getRoot();
187 IProject project = root.getProject(projectRoot);
188 TmfImportHelper.forceFolderRefresh(project.getFolder(TmfTraceFolder.TRACE_FOLDER_NAME));
189
190 final TmfProjectElement project2 = TmfProjectRegistry.getProject(project, true);
191 final TmfTraceFolder tracesFolder = project2.getTracesFolder();
192 final List<TmfTraceElement> traces = tracesFolder.getTraces();
193 TmfTraceElement found = null;
194 for (TmfTraceElement candidate : traces) {
195 if (candidate.getName().equals(traceName)) {
196 found = candidate;
197 }
198 }
199 if (found == null) {
200 return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TmfOpenTraceHelper_ErrorOpeningTrace);
201 }
67c53011
PT
202 openTraceFromElement(found);
203 return Status.OK_STATUS;
76fccfb0
MK
204 }
205
206 /**
4958a213
MK
207 * Open a trace from a trace element. If the trace is already opened, its
208 * editor is activated and brought to top.
76fccfb0
MK
209 *
210 * @param traceElement
211 * the {@link TmfTraceElement} to open
76fccfb0 212 */
67c53011
PT
213 public static void openTraceFromElement(final TmfTraceElement traceElement) {
214
215 final IFile file;
216 try {
217 file = traceElement.createBookmarksFile();
218 } catch (final CoreException e) {
219 Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ' ' + traceElement.getName());
220 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_ErrorTrace + ENDL + ENDL + e.getMessage());
221 return;
222 }
223
224 final IWorkbench wb = PlatformUI.getWorkbench();
225 final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
371536f0 226 final IEditorPart editor = findEditor(new FileEditorInput(file), true);
67c53011
PT
227 if (editor != null) {
228 activePage.activate(editor);
229 return;
230 }
231
76fccfb0
MK
232 Thread thread = new Thread() {
233 @Override
234 public void run() {
235
236 final ITmfTrace trace = traceElement.instantiateTrace();
237 final ITmfEvent traceEvent = traceElement.instantiateEvent();
238 if ((trace == null) || (traceEvent == null)) {
67c53011 239 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_NoTraceType);
76fccfb0 240 if (trace != null) {
76fccfb0
MK
241 trace.dispose();
242 }
243 return;
244 }
245
76fccfb0
MK
246 try {
247 trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
248 } catch (final TmfTraceException e) {
249 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_InitError + ENDL + ENDL + e);
250 trace.dispose();
251 return;
252 }
253
67c53011
PT
254 // Get the editor id from the extension point
255 String traceEditorId = traceElement.getEditorId();
256 final String editorId = (traceEditorId != null) ? traceEditorId : TmfEventsEditor.ID;
257 final IEditorInput editorInput = new TmfEditorInput(file, trace);
76fccfb0
MK
258
259 Display.getDefault().asyncExec(new Runnable() {
260 @Override
261 public void run() {
262 try {
67c53011
PT
263 activePage.openEditor(editorInput, editorId);
264 IDE.setDefaultEditor(file, editorId);
265 // editor should dispose the trace on close
76fccfb0
MK
266 } catch (final PartInitException e) {
267 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ENDL + ENDL + e.getMessage());
67c53011 268 Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ' ' + traceElement.getName());
76fccfb0
MK
269 trace.dispose();
270 }
271 }
272 });
273 }
274 };
275 thread.start();
67c53011
PT
276 }
277
278 /**
4958a213
MK
279 * Open an experiment from an experiment element. If the experiment is
280 * already opened, its editor is activated and brought to top.
67c53011
PT
281 *
282 * @param experimentElement
283 * the {@link TmfExperimentElement} to open
284 */
285 public static void openExperimentFromElement(final TmfExperimentElement experimentElement) {
286
287 final IFile file;
288 try {
289 file = experimentElement.createBookmarksFile();
290 } catch (final CoreException e) {
291 Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningExperiment + ' ' + experimentElement.getName());
292 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment, Messages.TmfOpenTraceHelper_ErrorExperiment + ENDL + ENDL + e.getMessage());
293 return;
294 }
295
296 final IWorkbench wb = PlatformUI.getWorkbench();
297 final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
371536f0 298 final IEditorPart editor = findEditor(new FileEditorInput(file), true);
67c53011
PT
299 if (editor != null) {
300 activePage.activate(editor);
301 return;
302 }
303
304 Thread thread = new Thread() {
305 @Override
306 public void run() {
307
4958a213
MK
308 /*
309 * Unlike traces, there is no instanceExperiment, so we call
310 * this function here alone. Maybe it would be better to do this
311 * on experiment's element constructor?
67c53011
PT
312 */
313 experimentElement.refreshSupplementaryFolder();
314
315 // Instantiate the experiment's traces
316 final List<TmfTraceElement> traceEntries = experimentElement.getTraces();
317 final int nbTraces = traceEntries.size();
318 int cacheSize = Integer.MAX_VALUE;
319 String commonEditorId = null;
320 final ITmfTrace[] traces = new ITmfTrace[nbTraces];
321 for (int i = 0; i < nbTraces; i++) {
322 TmfTraceElement element = traceEntries.get(i);
323
4958a213
MK
324 // Since trace is under an experiment, use the original
325 // trace from the traces folder
67c53011
PT
326 element = element.getElementUnderTraceFolder();
327
328 final ITmfTrace trace = element.instantiateTrace();
329 final ITmfEvent traceEvent = element.instantiateEvent();
330 if ((trace == null) || (traceEvent == null)) {
eb271b88
PT
331 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment,
332 Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ' ' + element.getName() +
4958a213 333 ENDL + Messages.TmfOpenTraceHelper_NoTraceType);
67c53011
PT
334 for (int j = 0; j < i; j++) {
335 traces[j].dispose();
336 }
337 if (trace != null) {
338 trace.dispose();
339 }
340 return;
341 }
342 try {
343 trace.initTrace(element.getResource(), element.getLocation().getPath(), traceEvent.getClass());
344 } catch (final TmfTraceException e) {
eb271b88
PT
345 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment,
346 element.getName() + ':' + ' ' + Messages.TmfOpenTraceHelper_InitError + ENDL + ENDL + e);
67c53011
PT
347 for (int j = 0; j < i; j++) {
348 traces[j].dispose();
349 }
350 trace.dispose();
351 return;
352 }
353 cacheSize = Math.min(cacheSize, trace.getCacheSize());
354
4958a213
MK
355 // If all traces use the same editorId, use it, otherwise
356 // use the default
67c53011
PT
357 final String editorId = element.getEditorId();
358 if (commonEditorId == null) {
359 commonEditorId = (editorId != null) ? editorId : TmfEventsEditor.ID;
360 } else if (!commonEditorId.equals(editorId)) {
361 commonEditorId = TmfEventsEditor.ID;
362 }
363 traces[i] = trace;
364 }
365
366 // Create the experiment
367 final TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, experimentElement.getName(), traces, cacheSize, experimentElement.getResource());
368 experiment.setBookmarksFile(file);
369
370 final String editorId = commonEditorId;
371 final IEditorInput editorInput = new TmfEditorInput(file, experiment);
372
373 Display.getDefault().asyncExec(new Runnable() {
374 @Override
375 public void run() {
376 try {
377 activePage.openEditor(editorInput, editorId);
378 IDE.setDefaultEditor(file, editorId);
379 // editor should dispose the trace on close
380 } catch (final PartInitException e) {
381 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment, Messages.TmfOpenTraceHelper_ErrorOpeningExperiment + ENDL + ENDL + e.getMessage());
382 Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningExperiment + ' ' + experimentElement.getName());
383 experiment.dispose();
384 }
385 }
386 });
387 }
388 };
389 thread.start();
76fccfb0
MK
390 }
391
371536f0 392 /**
4958a213
MK
393 * Returns the editor with the specified input. Returns null if there is no
394 * opened editor with that input. If restore is requested, the method finds
395 * and returns the editor even if it is not restored yet after a restart.
396 *
397 * @param input
398 * the editor input
399 * @param restore
400 * true if the editor should be restored
401 * @return an editor with input equals to <code>input</code>
402 */
371536f0
PT
403 private static IEditorPart findEditor(IEditorInput input, boolean restore) {
404 final IWorkbench wb = PlatformUI.getWorkbench();
405 final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
406 for (IEditorReference editorReference : activePage.getEditorReferences()) {
407 try {
408 IEditorInput editorInput = editorReference.getEditorInput();
409 if (editorInput.equals(input)) {
410 return editorReference.getEditor(restore);
411 }
412 } catch (PartInitException e) {
413 }
414 }
415 return null;
4958a213 416 }
371536f0 417
eb271b88
PT
418 /**
419 * Reopen a trace from a trace element in the provided editor
420 *
421 * @param traceElement
422 * the {@link TmfTraceElement} to open
423 * @param editor
424 * the reusable editor
425 */
426 public static void reopenTraceFromElement(final TmfTraceElement traceElement, final IReusableEditor editor) {
427
428 final IFile file;
429 try {
430 file = traceElement.createBookmarksFile();
431 } catch (final CoreException e) {
432 Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ' ' + traceElement.getName());
433 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_ErrorTrace + ENDL + ENDL + e.getMessage());
434 return;
435 }
436
437 Thread thread = new Thread() {
438 @Override
439 public void run() {
440
441 final ITmfTrace trace = traceElement.instantiateTrace();
442 final ITmfEvent traceEvent = traceElement.instantiateEvent();
443 if ((trace == null) || (traceEvent == null)) {
444 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_NoTraceType);
445 if (trace != null) {
446 trace.dispose();
447 }
448 return;
449 }
450
451 try {
452 trace.initTrace(traceElement.getResource(), traceElement.getLocation().getPath(), traceEvent.getClass());
453 } catch (final TmfTraceException e) {
454 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenTrace, Messages.TmfOpenTraceHelper_InitError + ENDL + ENDL + e);
455 trace.dispose();
456 return;
457 }
458
459 final IEditorInput editorInput = new TmfEditorInput(file, trace);
460
461 Display.getDefault().asyncExec(new Runnable() {
462 @Override
463 public void run() {
464 final IWorkbench wb = PlatformUI.getWorkbench();
465 final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
466 activePage.reuseEditor(editor, editorInput);
467 activePage.activate(editor);
468 }
469 });
470 }
471 };
472 thread.start();
473 }
474
475 /**
476 * Reopen an experiment from an experiment element in the provided editor
477 *
478 * @param experimentElement
479 * the {@link TmfExperimentElement} to open
480 * @param editor
481 * the reusable editor
482 */
483 public static void reopenExperimentFromElement(final TmfExperimentElement experimentElement, final IReusableEditor editor) {
484
485 final IFile file;
486 try {
487 file = experimentElement.createBookmarksFile();
488 } catch (final CoreException e) {
489 Activator.getDefault().logError(Messages.TmfOpenTraceHelper_ErrorOpeningExperiment + ' ' + experimentElement.getName());
490 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment, Messages.TmfOpenTraceHelper_ErrorExperiment + ENDL + ENDL + e.getMessage());
491 return;
492 }
493
494 Thread thread = new Thread() {
495 @Override
496 public void run() {
497
4958a213
MK
498 /*
499 * Unlike traces, there is no instanceExperiment, so we call
500 * this function here alone. Maybe it would be better to do this
501 * on experiment's element constructor?
eb271b88
PT
502 */
503 experimentElement.refreshSupplementaryFolder();
504
505 // Instantiate the experiment's traces
506 final List<TmfTraceElement> traceEntries = experimentElement.getTraces();
507 final int nbTraces = traceEntries.size();
508 int cacheSize = Integer.MAX_VALUE;
509 final ITmfTrace[] traces = new ITmfTrace[nbTraces];
510 for (int i = 0; i < nbTraces; i++) {
511 TmfTraceElement element = traceEntries.get(i);
512
4958a213
MK
513 // Since trace is under an experiment, use the original
514 // trace from the traces folder
eb271b88
PT
515 element = element.getElementUnderTraceFolder();
516
517 final ITmfTrace trace = element.instantiateTrace();
518 final ITmfEvent traceEvent = element.instantiateEvent();
519 if ((trace == null) || (traceEvent == null)) {
520 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment,
521 Messages.TmfOpenTraceHelper_ErrorOpeningTrace + ' ' + element.getName() +
4958a213 522 ENDL + Messages.TmfOpenTraceHelper_NoTraceType);
eb271b88
PT
523 for (int j = 0; j < i; j++) {
524 traces[j].dispose();
525 }
526 if (trace != null) {
527 trace.dispose();
528 }
529 return;
530 }
531 try {
532 trace.initTrace(element.getResource(), element.getLocation().getPath(), traceEvent.getClass());
533 } catch (final TmfTraceException e) {
534 TraceUtils.displayErrorMsg(Messages.TmfOpenTraceHelper_OpenExperiment,
535 element.getName() + ':' + ' ' + Messages.TmfOpenTraceHelper_InitError + ENDL + ENDL + e);
536 for (int j = 0; j < i; j++) {
537 traces[j].dispose();
538 }
539 trace.dispose();
540 return;
541 }
542 cacheSize = Math.min(cacheSize, trace.getCacheSize());
543
544 traces[i] = trace;
545 }
546
547 // Create the experiment
548 final TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, experimentElement.getName(), traces, cacheSize, experimentElement.getResource());
549 experiment.setBookmarksFile(file);
550
551 final IEditorInput editorInput = new TmfEditorInput(file, experiment);
552
553 Display.getDefault().asyncExec(new Runnable() {
554 @Override
555 public void run() {
556 final IWorkbench wb = PlatformUI.getWorkbench();
557 final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
558 activePage.reuseEditor(editor, editorInput);
559 activePage.activate(editor);
560 }
561 });
562 }
563 };
564 thread.start();
565 }
566
76fccfb0 567}
This page took 0.072682 seconds and 5 git commands to generate.