1 /**********************************************************************
2 * Copyright (c) 2013 Ericsson
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
10 * Matthew Khouzam - Initial API and implementation
11 * Patrick Tasse - Update open trace and add open experiment
12 **********************************************************************/
14 package org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
;
17 import java
.util
.List
;
19 import org
.eclipse
.core
.resources
.IFile
;
20 import org
.eclipse
.core
.resources
.IFolder
;
21 import org
.eclipse
.core
.resources
.IProject
;
22 import org
.eclipse
.core
.resources
.IResource
;
23 import org
.eclipse
.core
.resources
.IWorkspace
;
24 import org
.eclipse
.core
.resources
.IWorkspaceRoot
;
25 import org
.eclipse
.core
.resources
.ResourcesPlugin
;
26 import org
.eclipse
.core
.runtime
.CoreException
;
27 import org
.eclipse
.core
.runtime
.IPath
;
28 import org
.eclipse
.core
.runtime
.IStatus
;
29 import org
.eclipse
.core
.runtime
.Path
;
30 import org
.eclipse
.core
.runtime
.Status
;
31 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.Activator
;
32 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.model
.TmfImportHelper
;
33 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.model
.TmfTraceImportException
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.TmfTraceException
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfExperiment
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.editors
.TmfEditorInput
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.editors
.TmfEventsEditor
;
40 import org
.eclipse
.swt
.widgets
.Display
;
41 import org
.eclipse
.swt
.widgets
.MessageBox
;
42 import org
.eclipse
.swt
.widgets
.Shell
;
43 import org
.eclipse
.ui
.IEditorInput
;
44 import org
.eclipse
.ui
.IEditorPart
;
45 import org
.eclipse
.ui
.IReusableEditor
;
46 import org
.eclipse
.ui
.IWorkbench
;
47 import org
.eclipse
.ui
.IWorkbenchPage
;
48 import org
.eclipse
.ui
.PartInitException
;
49 import org
.eclipse
.ui
.PlatformUI
;
50 import org
.eclipse
.ui
.ide
.IDE
;
51 import org
.eclipse
.ui
.part
.FileEditorInput
;
56 * Helper class for opening trace resources and loading them to a tracing
59 * @author Matthew Khouzam
62 public class TmfOpenTraceHelper
{
64 private static final String ENDL
= System
.getProperty("line.separator"); //$NON-NLS-1$
67 * Opens a trace from a path while importing it to the project
68 * "projectRoot". The trace is linked as a resource.
71 * The project to import to
75 * the shell to use for dialogs
76 * @return IStatus OK if successful
77 * @throws CoreException
78 * core exceptions if something is not well set up in the back
81 public IStatus
openTraceFromPath(String projectRoot
, String path
, Shell shell
) throws CoreException
{
82 TmfTraceType tt
= TmfTraceType
.getInstance();
83 TraceTypeHelper traceTypeToSet
= null;
85 traceTypeToSet
= tt
.selectTraceType(path
, shell
);
86 } catch (TmfTraceImportException e
) {
87 MessageBox mb
= new MessageBox(shell
);
88 mb
.setMessage(e
.getMessage());
90 return new Status(IStatus
.ERROR
, Activator
.PLUGIN_ID
, e
.getMessage());
92 if (traceTypeToSet
== null) {
93 return Status
.CANCEL_STATUS
;
95 IProject project
= ResourcesPlugin
.getWorkspace().getRoot().getProject(projectRoot
);
96 IFolder folder
= project
.getFolder(TmfTraceFolder
.TRACE_FOLDER_NAME
);
97 String traceName
= getTraceName(path
, folder
);
98 if (traceExists(path
, folder
)) {
99 return openTraceFromProject(projectRoot
, traceName
);
101 final IPath tracePath
= folder
.getFullPath().append(traceName
);
102 final IPath pathString
= Path
.fromOSString(path
);
103 IResource linkedTrace
= TmfImportHelper
.createLink(folder
, pathString
, traceName
);
104 if (linkedTrace
!= null && linkedTrace
.exists()) {
105 IStatus ret
= TmfTraceType
.setTraceType(tracePath
, traceTypeToSet
);
107 ret
= openTraceFromProject(projectRoot
, traceName
);
111 return new Status(IStatus
.ERROR
, Activator
.PLUGIN_ID
,
112 Messages
.TmfOpenTraceHelper_LinkFailed
);
115 private static boolean traceExists(String file
, IFolder folder
) {
116 String val
= getTraceName(file
, folder
);
117 return (folder
.findMember(val
) != null);
120 private static boolean isWrongMember(IFolder folder
, String ret
, final File traceFile
) {
121 final IResource candidate
= folder
.findMember(ret
);
122 if (candidate
!= null) {
123 final IPath rawLocation
= candidate
.getRawLocation();
124 final File file
= rawLocation
.toFile();
125 return !file
.equals(traceFile
);
131 * Gets the display name, either "filename" or "filename(n)" if there is
132 * already a filename existing where n is the next non-used integer starting
138 * the folder to import to
139 * @return the filename
141 private static String
getTraceName(String file
, IFolder folder
) {
143 final File traceFile
= new File(file
);
144 ret
= traceFile
.getName();
145 for (int i
= 2; isWrongMember(folder
, ret
, traceFile
); i
++) {
146 ret
= traceFile
.getName() + '(' + i
+ ')';
152 * Open a trace from a project
155 * the root of the project
158 * @return success or error
160 public static IStatus
openTraceFromProject(String projectRoot
, String traceName
) {
161 final IWorkspace workspace
= ResourcesPlugin
.getWorkspace();
162 final IWorkspaceRoot root
= workspace
.getRoot();
163 IProject project
= root
.getProject(projectRoot
);
164 TmfImportHelper
.forceFolderRefresh(project
.getFolder(TmfTraceFolder
.TRACE_FOLDER_NAME
));
166 final TmfProjectElement project2
= TmfProjectRegistry
.getProject(project
, true);
167 final TmfTraceFolder tracesFolder
= project2
.getTracesFolder();
168 final List
<TmfTraceElement
> traces
= tracesFolder
.getTraces();
169 TmfTraceElement found
= null;
170 for (TmfTraceElement candidate
: traces
) {
171 if (candidate
.getName().equals(traceName
)) {
176 return new Status(IStatus
.ERROR
, Activator
.PLUGIN_ID
, Messages
.TmfOpenTraceHelper_ErrorOpeningTrace
);
178 openTraceFromElement(found
);
179 return Status
.OK_STATUS
;
183 * Open a trace from a trace element. If the trace is already opened,
184 * its editor is activated and brought to top.
186 * @param traceElement
187 * the {@link TmfTraceElement} to open
189 public static void openTraceFromElement(final TmfTraceElement traceElement
) {
193 file
= traceElement
.createBookmarksFile();
194 } catch (final CoreException e
) {
195 Activator
.getDefault().logError(Messages
.TmfOpenTraceHelper_ErrorOpeningTrace
+ ' ' + traceElement
.getName());
196 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenTrace
, Messages
.TmfOpenTraceHelper_ErrorTrace
+ ENDL
+ ENDL
+ e
.getMessage());
200 final IWorkbench wb
= PlatformUI
.getWorkbench();
201 final IWorkbenchPage activePage
= wb
.getActiveWorkbenchWindow().getActivePage();
202 final IEditorPart editor
= activePage
.findEditor(new FileEditorInput(file
));
203 if (editor
!= null) {
204 activePage
.activate(editor
);
208 Thread thread
= new Thread() {
212 final ITmfTrace trace
= traceElement
.instantiateTrace();
213 final ITmfEvent traceEvent
= traceElement
.instantiateEvent();
214 if ((trace
== null) || (traceEvent
== null)) {
215 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenTrace
, Messages
.TmfOpenTraceHelper_NoTraceType
);
223 trace
.initTrace(traceElement
.getResource(), traceElement
.getLocation().getPath(), traceEvent
.getClass());
224 } catch (final TmfTraceException e
) {
225 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenTrace
, Messages
.TmfOpenTraceHelper_InitError
+ ENDL
+ ENDL
+ e
);
230 // Get the editor id from the extension point
231 String traceEditorId
= traceElement
.getEditorId();
232 final String editorId
= (traceEditorId
!= null) ? traceEditorId
: TmfEventsEditor
.ID
;
233 final IEditorInput editorInput
= new TmfEditorInput(file
, trace
);
235 Display
.getDefault().asyncExec(new Runnable() {
239 activePage
.openEditor(editorInput
, editorId
);
240 IDE
.setDefaultEditor(file
, editorId
);
241 // editor should dispose the trace on close
242 } catch (final PartInitException e
) {
243 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenTrace
, Messages
.TmfOpenTraceHelper_ErrorOpeningTrace
+ ENDL
+ ENDL
+ e
.getMessage());
244 Activator
.getDefault().logError(Messages
.TmfOpenTraceHelper_ErrorOpeningTrace
+ ' ' + traceElement
.getName());
255 * Open an experiment from an experiment element. If the experiment is already opened,
256 * its editor is activated and brought to top.
258 * @param experimentElement
259 * the {@link TmfExperimentElement} to open
261 public static void openExperimentFromElement(final TmfExperimentElement experimentElement
) {
265 file
= experimentElement
.createBookmarksFile();
266 } catch (final CoreException e
) {
267 Activator
.getDefault().logError(Messages
.TmfOpenTraceHelper_ErrorOpeningExperiment
+ ' ' + experimentElement
.getName());
268 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenExperiment
, Messages
.TmfOpenTraceHelper_ErrorExperiment
+ ENDL
+ ENDL
+ e
.getMessage());
272 final IWorkbench wb
= PlatformUI
.getWorkbench();
273 final IWorkbenchPage activePage
= wb
.getActiveWorkbenchWindow().getActivePage();
274 final IEditorPart editor
= activePage
.findEditor(new FileEditorInput(file
));
275 if (editor
!= null) {
276 activePage
.activate(editor
);
280 Thread thread
= new Thread() {
284 /* Unlike traces, there is no instanceExperiment, so we call this function
285 * here alone. Maybe it would be better to do this on experiment's element
288 experimentElement
.refreshSupplementaryFolder();
290 // Instantiate the experiment's traces
291 final List
<TmfTraceElement
> traceEntries
= experimentElement
.getTraces();
292 final int nbTraces
= traceEntries
.size();
293 int cacheSize
= Integer
.MAX_VALUE
;
294 String commonEditorId
= null;
295 final ITmfTrace
[] traces
= new ITmfTrace
[nbTraces
];
296 for (int i
= 0; i
< nbTraces
; i
++) {
297 TmfTraceElement element
= traceEntries
.get(i
);
299 // Since trace is under an experiment, use the original trace from the traces folder
300 element
= element
.getElementUnderTraceFolder();
302 final ITmfTrace trace
= element
.instantiateTrace();
303 final ITmfEvent traceEvent
= element
.instantiateEvent();
304 if ((trace
== null) || (traceEvent
== null)) {
305 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenExperiment
,
306 Messages
.TmfOpenTraceHelper_ErrorOpeningTrace
+ ' ' + element
.getName() +
307 ENDL
+ Messages
.TmfOpenTraceHelper_NoTraceType
);
308 for (int j
= 0; j
< i
; j
++) {
317 trace
.initTrace(element
.getResource(), element
.getLocation().getPath(), traceEvent
.getClass());
318 } catch (final TmfTraceException e
) {
319 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenExperiment
,
320 element
.getName() + ':' + ' ' + Messages
.TmfOpenTraceHelper_InitError
+ ENDL
+ ENDL
+ e
);
321 for (int j
= 0; j
< i
; j
++) {
327 cacheSize
= Math
.min(cacheSize
, trace
.getCacheSize());
329 // If all traces use the same editorId, use it, otherwise use the default
330 final String editorId
= element
.getEditorId();
331 if (commonEditorId
== null) {
332 commonEditorId
= (editorId
!= null) ? editorId
: TmfEventsEditor
.ID
;
333 } else if (!commonEditorId
.equals(editorId
)) {
334 commonEditorId
= TmfEventsEditor
.ID
;
339 // Create the experiment
340 final TmfExperiment experiment
= new TmfExperiment(ITmfEvent
.class, experimentElement
.getName(), traces
, cacheSize
, experimentElement
.getResource());
341 experiment
.setBookmarksFile(file
);
343 final String editorId
= commonEditorId
;
344 final IEditorInput editorInput
= new TmfEditorInput(file
, experiment
);
346 Display
.getDefault().asyncExec(new Runnable() {
350 activePage
.openEditor(editorInput
, editorId
);
351 IDE
.setDefaultEditor(file
, editorId
);
352 // editor should dispose the trace on close
353 } catch (final PartInitException e
) {
354 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenExperiment
, Messages
.TmfOpenTraceHelper_ErrorOpeningExperiment
+ ENDL
+ ENDL
+ e
.getMessage());
355 Activator
.getDefault().logError(Messages
.TmfOpenTraceHelper_ErrorOpeningExperiment
+ ' ' + experimentElement
.getName());
356 experiment
.dispose();
366 * Reopen a trace from a trace element in the provided editor
368 * @param traceElement
369 * the {@link TmfTraceElement} to open
371 * the reusable editor
373 public static void reopenTraceFromElement(final TmfTraceElement traceElement
, final IReusableEditor editor
) {
377 file
= traceElement
.createBookmarksFile();
378 } catch (final CoreException e
) {
379 Activator
.getDefault().logError(Messages
.TmfOpenTraceHelper_ErrorOpeningTrace
+ ' ' + traceElement
.getName());
380 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenTrace
, Messages
.TmfOpenTraceHelper_ErrorTrace
+ ENDL
+ ENDL
+ e
.getMessage());
384 Thread thread
= new Thread() {
388 final ITmfTrace trace
= traceElement
.instantiateTrace();
389 final ITmfEvent traceEvent
= traceElement
.instantiateEvent();
390 if ((trace
== null) || (traceEvent
== null)) {
391 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenTrace
, Messages
.TmfOpenTraceHelper_NoTraceType
);
399 trace
.initTrace(traceElement
.getResource(), traceElement
.getLocation().getPath(), traceEvent
.getClass());
400 } catch (final TmfTraceException e
) {
401 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenTrace
, Messages
.TmfOpenTraceHelper_InitError
+ ENDL
+ ENDL
+ e
);
406 final IEditorInput editorInput
= new TmfEditorInput(file
, trace
);
408 Display
.getDefault().asyncExec(new Runnable() {
411 final IWorkbench wb
= PlatformUI
.getWorkbench();
412 final IWorkbenchPage activePage
= wb
.getActiveWorkbenchWindow().getActivePage();
413 activePage
.reuseEditor(editor
, editorInput
);
414 activePage
.activate(editor
);
423 * Reopen an experiment from an experiment element in the provided editor
425 * @param experimentElement
426 * the {@link TmfExperimentElement} to open
428 * the reusable editor
430 public static void reopenExperimentFromElement(final TmfExperimentElement experimentElement
, final IReusableEditor editor
) {
434 file
= experimentElement
.createBookmarksFile();
435 } catch (final CoreException e
) {
436 Activator
.getDefault().logError(Messages
.TmfOpenTraceHelper_ErrorOpeningExperiment
+ ' ' + experimentElement
.getName());
437 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenExperiment
, Messages
.TmfOpenTraceHelper_ErrorExperiment
+ ENDL
+ ENDL
+ e
.getMessage());
441 Thread thread
= new Thread() {
445 /* Unlike traces, there is no instanceExperiment, so we call this function
446 * here alone. Maybe it would be better to do this on experiment's element
449 experimentElement
.refreshSupplementaryFolder();
451 // Instantiate the experiment's traces
452 final List
<TmfTraceElement
> traceEntries
= experimentElement
.getTraces();
453 final int nbTraces
= traceEntries
.size();
454 int cacheSize
= Integer
.MAX_VALUE
;
455 final ITmfTrace
[] traces
= new ITmfTrace
[nbTraces
];
456 for (int i
= 0; i
< nbTraces
; i
++) {
457 TmfTraceElement element
= traceEntries
.get(i
);
459 // Since trace is under an experiment, use the original trace from the traces folder
460 element
= element
.getElementUnderTraceFolder();
462 final ITmfTrace trace
= element
.instantiateTrace();
463 final ITmfEvent traceEvent
= element
.instantiateEvent();
464 if ((trace
== null) || (traceEvent
== null)) {
465 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenExperiment
,
466 Messages
.TmfOpenTraceHelper_ErrorOpeningTrace
+ ' ' + element
.getName() +
467 ENDL
+ Messages
.TmfOpenTraceHelper_NoTraceType
);
468 for (int j
= 0; j
< i
; j
++) {
477 trace
.initTrace(element
.getResource(), element
.getLocation().getPath(), traceEvent
.getClass());
478 } catch (final TmfTraceException e
) {
479 TraceUtils
.displayErrorMsg(Messages
.TmfOpenTraceHelper_OpenExperiment
,
480 element
.getName() + ':' + ' ' + Messages
.TmfOpenTraceHelper_InitError
+ ENDL
+ ENDL
+ e
);
481 for (int j
= 0; j
< i
; j
++) {
487 cacheSize
= Math
.min(cacheSize
, trace
.getCacheSize());
492 // Create the experiment
493 final TmfExperiment experiment
= new TmfExperiment(ITmfEvent
.class, experimentElement
.getName(), traces
, cacheSize
, experimentElement
.getResource());
494 experiment
.setBookmarksFile(file
);
496 final IEditorInput editorInput
= new TmfEditorInput(file
, experiment
);
498 Display
.getDefault().asyncExec(new Runnable() {
501 final IWorkbench wb
= PlatformUI
.getWorkbench();
502 final IWorkbenchPage activePage
= wb
.getActiveWorkbenchWindow().getActivePage();
503 activePage
.reuseEditor(editor
, editorInput
);
504 activePage
.activate(editor
);