1 /*******************************************************************************
2 * Copyright (c) 2010, 2015 Ericsson, École Polytechnique de Montréal
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 * Francois Chouinard - Initial API and implementation
11 * Bernd Hufmann - Added supplementary files handling
12 * Geneviève Bastien - Moved supplementary files handling to parent class,
13 * added code to copy trace
14 * Patrick Tasse - Close editors to release resources
15 * Jean-Christian Kouame - added trace properties to be shown into
17 * Geneviève Bastien - Moved trace type related methods to parent class
18 *******************************************************************************/
20 package org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
;
22 import java
.util
.Arrays
;
23 import java
.util
.Date
;
24 import java
.util
.HashMap
;
25 import java
.util
.LinkedList
;
26 import java
.util
.List
;
29 import org
.eclipse
.core
.filesystem
.EFS
;
30 import org
.eclipse
.core
.filesystem
.IFileInfo
;
31 import org
.eclipse
.core
.resources
.IFile
;
32 import org
.eclipse
.core
.resources
.IFolder
;
33 import org
.eclipse
.core
.resources
.IResource
;
34 import org
.eclipse
.core
.runtime
.CoreException
;
35 import org
.eclipse
.core
.runtime
.IConfigurationElement
;
36 import org
.eclipse
.core
.runtime
.IPath
;
37 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
38 import org
.eclipse
.core
.runtime
.Platform
;
39 import org
.eclipse
.core
.runtime
.URIUtil
;
40 import org
.eclipse
.osgi
.util
.NLS
;
41 import org
.eclipse
.swt
.widgets
.Display
;
42 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.Activator
;
43 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.editors
.ITmfEventsEditorConstants
;
44 import org
.eclipse
.tracecompass
.tmf
.core
.TmfCommonConstants
;
45 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
46 import org
.eclipse
.tracecompass
.tmf
.core
.parsers
.custom
.CustomTxtEvent
;
47 import org
.eclipse
.tracecompass
.tmf
.core
.parsers
.custom
.CustomTxtTrace
;
48 import org
.eclipse
.tracecompass
.tmf
.core
.parsers
.custom
.CustomTxtTraceDefinition
;
49 import org
.eclipse
.tracecompass
.tmf
.core
.parsers
.custom
.CustomXmlEvent
;
50 import org
.eclipse
.tracecompass
.tmf
.core
.parsers
.custom
.CustomXmlTrace
;
51 import org
.eclipse
.tracecompass
.tmf
.core
.parsers
.custom
.CustomXmlTraceDefinition
;
52 import org
.eclipse
.tracecompass
.tmf
.core
.project
.model
.TmfTraceType
;
53 import org
.eclipse
.tracecompass
.tmf
.core
.project
.model
.TraceTypeHelper
;
54 import org
.eclipse
.tracecompass
.tmf
.core
.synchronization
.TimestampTransformFactory
;
55 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimestampFormat
;
56 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
57 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTraceProperties
;
58 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
59 import org
.eclipse
.tracecompass
.tmf
.ui
.editors
.TmfEventsEditor
;
60 import org
.eclipse
.tracecompass
.tmf
.ui
.properties
.ReadOnlyTextPropertyDescriptor
;
61 import org
.eclipse
.ui
.IActionFilter
;
62 import org
.eclipse
.ui
.views
.properties
.IPropertyDescriptor
;
63 import org
.eclipse
.ui
.views
.properties
.IPropertySource2
;
65 import com
.ibm
.icu
.text
.DateFormat
;
66 import com
.ibm
.icu
.text
.NumberFormat
;
69 * Implementation of trace model element representing a trace. It provides
70 * methods to instantiate <code>ITmfTrace</code> and <code>ITmfEvent</code> as
71 * well as editor ID from the trace type extension definition.
74 * @author Francois Chouinard
76 public class TmfTraceElement
extends TmfCommonProjectElement
implements IActionFilter
, IPropertySource2
{
78 // ------------------------------------------------------------------------
80 // ------------------------------------------------------------------------
84 * Bundle attribute name
86 public static final String BUNDLE
= "bundle"; //$NON-NLS-1$
88 * IsLinked attribute name.
90 public static final String IS_LINKED
= "isLinked"; //$NON-NLS-1$
92 // Property View stuff
93 private static final String sfResourcePropertiesCategory
= Messages
.TmfTraceElement_ResourceProperties
;
94 private static final String sfName
= Messages
.TmfTraceElement_Name
;
95 private static final String sfPath
= Messages
.TmfTraceElement_Path
;
96 private static final String sfLocation
= Messages
.TmfTraceElement_Location
;
97 private static final String sfTraceType
= Messages
.TmfTraceElement_EventType
;
98 private static final String sfIsLinked
= Messages
.TmfTraceElement_IsLinked
;
99 private static final String sfSourceLocation
= Messages
.TmfTraceElement_SourceLocation
;
100 private static final String sfTimeOffset
= Messages
.TmfTraceElement_TimeOffset
;
101 private static final String sfLastModified
= Messages
.TmfTraceElement_LastModified
;
102 private static final String sfSize
= Messages
.TmfTraceElement_Size
;
103 private static final String sfTracePropertiesCategory
= Messages
.TmfTraceElement_TraceProperties
;
105 private static final ReadOnlyTextPropertyDescriptor sfNameDescriptor
= new ReadOnlyTextPropertyDescriptor(sfName
, sfName
);
106 private static final ReadOnlyTextPropertyDescriptor sfPathDescriptor
= new ReadOnlyTextPropertyDescriptor(sfPath
, sfPath
);
107 private static final ReadOnlyTextPropertyDescriptor sfLocationDescriptor
= new ReadOnlyTextPropertyDescriptor(sfLocation
, sfLocation
);
108 private static final ReadOnlyTextPropertyDescriptor sfTypeDescriptor
= new ReadOnlyTextPropertyDescriptor(sfTraceType
, sfTraceType
);
109 private static final ReadOnlyTextPropertyDescriptor sfIsLinkedDescriptor
= new ReadOnlyTextPropertyDescriptor(sfIsLinked
, sfIsLinked
);
110 private static final ReadOnlyTextPropertyDescriptor sfSourceLocationDescriptor
= new ReadOnlyTextPropertyDescriptor(sfSourceLocation
, sfSourceLocation
);
111 private static final ReadOnlyTextPropertyDescriptor sfTimeOffsetDescriptor
= new ReadOnlyTextPropertyDescriptor(sfTimeOffset
, sfTimeOffset
);
112 private static final ReadOnlyTextPropertyDescriptor sfLastModifiedDescriptor
= new ReadOnlyTextPropertyDescriptor(sfLastModified
, sfLastModified
);
113 private static final ReadOnlyTextPropertyDescriptor sfSizeDescriptor
= new ReadOnlyTextPropertyDescriptor(sfSize
, sfSize
);
115 private static final IPropertyDescriptor
[] sfDescriptors
= { sfNameDescriptor
, sfPathDescriptor
, sfLocationDescriptor
,
116 sfTypeDescriptor
, sfIsLinkedDescriptor
, sfSourceLocationDescriptor
,
117 sfTimeOffsetDescriptor
, sfLastModifiedDescriptor
, sfSizeDescriptor
};
120 sfNameDescriptor
.setCategory(sfResourcePropertiesCategory
);
121 sfPathDescriptor
.setCategory(sfResourcePropertiesCategory
);
122 sfLocationDescriptor
.setCategory(sfResourcePropertiesCategory
);
123 sfTypeDescriptor
.setCategory(sfResourcePropertiesCategory
);
124 sfIsLinkedDescriptor
.setCategory(sfResourcePropertiesCategory
);
125 sfSourceLocationDescriptor
.setCategory(sfResourcePropertiesCategory
);
126 sfTimeOffsetDescriptor
.setCategory(sfResourcePropertiesCategory
);
127 sfLastModifiedDescriptor
.setCategory(sfResourcePropertiesCategory
);
128 sfSizeDescriptor
.setCategory(sfResourcePropertiesCategory
);
131 private static final TmfTimestampFormat OFFSET_FORMAT
= new TmfTimestampFormat("T.SSS SSS SSS s"); //$NON-NLS-1$
133 private static final int FOLDER_MAX_COUNT
= 1024;
135 // ------------------------------------------------------------------------
136 // Static initialization
137 // ------------------------------------------------------------------------
139 // The mapping of available trace type IDs to their corresponding
140 // configuration element
141 private static final Map
<String
, IConfigurationElement
> sfTraceTypeAttributes
= new HashMap
<>();
142 private static final Map
<String
, IConfigurationElement
> sfTraceTypeUIAttributes
= new HashMap
<>();
143 private static final Map
<String
, IConfigurationElement
> sfTraceCategories
= new HashMap
<>();
146 * Initialize statically at startup by getting extensions from the platform
147 * extension registry.
149 public static void init() {
150 /* Read the tmf.core "tracetype" extension point */
151 IConfigurationElement
[] config
= Platform
.getExtensionRegistry().getConfigurationElementsFor(TmfTraceType
.TMF_TRACE_TYPE_ID
);
152 for (IConfigurationElement ce
: config
) {
153 switch (ce
.getName()) {
154 case TmfTraceType
.TYPE_ELEM
:
155 String traceTypeId
= ce
.getAttribute(TmfTraceType
.ID_ATTR
);
156 sfTraceTypeAttributes
.put(traceTypeId
, ce
);
158 case TmfTraceType
.CATEGORY_ELEM
:
159 String categoryId
= ce
.getAttribute(TmfTraceType
.ID_ATTR
);
160 sfTraceCategories
.put(categoryId
, ce
);
167 * Read the corresponding tmf.ui "tracetypeui" extension point for this
168 * trace type, if it exists.
170 config
= Platform
.getExtensionRegistry().getConfigurationElementsFor(TmfTraceTypeUIUtils
.TMF_TRACE_TYPE_UI_ID
);
171 for (IConfigurationElement ce
: config
) {
172 String elemName
= ce
.getName();
173 if (TmfTraceTypeUIUtils
.TYPE_ELEM
.equals(elemName
)) {
174 String traceType
= ce
.getAttribute(TmfTraceTypeUIUtils
.TRACETYPE_ATTR
);
175 sfTraceTypeUIAttributes
.put(traceType
, ce
);
180 // ------------------------------------------------------------------------
182 // ------------------------------------------------------------------------
184 private class FileInfo
{
190 // ------------------------------------------------------------------------
192 // ------------------------------------------------------------------------
194 private FileInfo fFileInfo
;
196 // ------------------------------------------------------------------------
198 // ------------------------------------------------------------------------
200 * Constructor. Creates trace model element under the trace folder.
205 * The trace resource.
207 * The parent element (trace folder)
209 public TmfTraceElement(String name
, IResource trace
, TmfTraceFolder parent
) {
210 super(name
, trace
, parent
);
214 * Constructor. Creates trace model element under the experiment folder.
219 * The trace resource.
221 * The parent element (experiment folder)
223 public TmfTraceElement(String name
, IResource trace
, TmfExperimentElement parent
) {
224 super(name
, trace
, parent
);
227 // ------------------------------------------------------------------------
229 // ------------------------------------------------------------------------
232 * Instantiate a <code>ITmfTrace</code> object based on the trace type and
233 * the corresponding extension.
235 * @return the <code>ITmfTrace</code> or <code>null</code> for an error
238 public ITmfTrace
instantiateTrace() {
241 // make sure that supplementary folder exists
242 refreshSupplementaryFolder();
244 String traceTypeId
= getTraceType();
245 if (traceTypeId
!= null) {
246 if (CustomTxtTrace
.isCustomTraceTypeId(traceTypeId
)) {
247 for (CustomTxtTraceDefinition def
: CustomTxtTraceDefinition
.loadAll()) {
248 String id
= CustomTxtTrace
.buildTraceTypeId(def
.categoryName
, def
.definitionName
);
249 if (traceTypeId
.equals(id
)) {
250 return new CustomTxtTrace(def
);
254 if (CustomXmlTrace
.isCustomTraceTypeId(traceTypeId
)) {
255 for (CustomXmlTraceDefinition def
: CustomXmlTraceDefinition
.loadAll()) {
256 String id
= CustomXmlTrace
.buildTraceTypeId(def
.categoryName
, def
.definitionName
);
257 if (traceTypeId
.equals(id
)) {
258 return new CustomXmlTrace(def
);
262 IConfigurationElement ce
= sfTraceTypeAttributes
.get(traceTypeId
);
266 ITmfTrace trace
= (ITmfTrace
) ce
.createExecutableExtension(TmfTraceType
.TRACE_TYPE_ATTR
);
269 } catch (CoreException e
) {
270 Activator
.getDefault().logError("Error instantiating ITmfTrace object for trace " + getName(), e
); //$NON-NLS-1$
276 * Instantiate a <code>ITmfEvent</code> object based on the trace type and
277 * the corresponding extension.
279 * @return the <code>ITmfEvent</code> or <code>null</code> for an error
281 public ITmfEvent
instantiateEvent() {
283 String traceTypeId
= getTraceType();
284 if (traceTypeId
!= null) {
285 if (CustomTxtTrace
.isCustomTraceTypeId(traceTypeId
)) {
286 for (CustomTxtTraceDefinition def
: CustomTxtTraceDefinition
.loadAll()) {
287 String id
= CustomTxtTrace
.buildTraceTypeId(def
.categoryName
, def
.definitionName
);
288 if (traceTypeId
.equals(id
)) {
289 return new CustomTxtEvent(def
);
293 if (CustomXmlTrace
.isCustomTraceTypeId(traceTypeId
)) {
294 for (CustomXmlTraceDefinition def
: CustomXmlTraceDefinition
.loadAll()) {
295 String id
= CustomXmlTrace
.buildTraceTypeId(def
.categoryName
, def
.definitionName
);
296 if (traceTypeId
.equals(id
)) {
297 return new CustomXmlEvent(def
);
301 IConfigurationElement ce
= sfTraceTypeAttributes
.get(traceTypeId
);
305 ITmfEvent event
= (ITmfEvent
) ce
.createExecutableExtension(TmfTraceType
.EVENT_TYPE_ATTR
);
308 } catch (CoreException e
) {
309 Activator
.getDefault().logError("Error instantiating ITmfEvent object for trace " + getName(), e
); //$NON-NLS-1$
315 public String
getEditorId() {
316 String traceTypeId
= getTraceType();
317 if (traceTypeId
!= null) {
318 if (CustomTxtTrace
.isCustomTraceTypeId(traceTypeId
) || CustomXmlTrace
.isCustomTraceTypeId(traceTypeId
)) {
319 return TmfEventsEditor
.ID
;
322 IConfigurationElement ce
= sfTraceTypeUIAttributes
.get(getTraceType());
324 /* This trace type does not define UI attributes */
327 IConfigurationElement
[] defaultEditorCE
= ce
.getChildren(TmfTraceTypeUIUtils
.DEFAULT_EDITOR_ELEM
);
328 if (defaultEditorCE
.length
== 1) {
329 return defaultEditorCE
[0].getAttribute(TmfTraceType
.ID_ATTR
);
336 * Returns the file resource used to store bookmarks after creating it if
337 * necessary. If the trace resource is a file, it is returned directly. If
338 * the trace resource is a folder, a linked file is returned. The file will
339 * be created if it does not exist.
341 * @return the bookmarks file
342 * @throws CoreException
343 * if the bookmarks file cannot be created
347 public IFile
createBookmarksFile() throws CoreException
{
348 IFile file
= getBookmarksFile();
349 if (fResource
instanceof IFolder
) {
350 return createBookmarksFile(getProject().getTracesFolder().getResource(), ITmfEventsEditorConstants
.TRACE_EDITOR_INPUT_TYPE
);
356 * Returns the file resource used to store bookmarks. The file may not
359 * @return the bookmarks file
363 public IFile
getBookmarksFile() {
365 if (fResource
instanceof IFile
) {
366 file
= (IFile
) fResource
;
367 } else if (fResource
instanceof IFolder
) {
368 final IFolder folder
= (IFolder
) fResource
;
369 file
= folder
.getFile(getName() + '_');
375 * Returns the <code>TmfTraceElement</code> located under the
376 * <code>TmfTracesFolder</code>.
378 * @return <code>this</code> if this element is under the
379 * <code>TmfTracesFolder</code> else the corresponding
380 * <code>TmfTraceElement</code> if this element is under
381 * <code>TmfExperimentElement</code>.
383 public TmfTraceElement
getElementUnderTraceFolder() {
385 // If trace is under an experiment, return original trace from the
387 if (getParent() instanceof TmfExperimentElement
) {
388 for (TmfTraceElement aTrace
: getProject().getTracesFolder().getTraces()) {
389 if (aTrace
.getElementPath().equals(getElementPath())) {
398 public String
getTypeName() {
399 return Messages
.TmfTraceElement_TypeName
;
402 // ------------------------------------------------------------------------
404 // ------------------------------------------------------------------------
407 public boolean testAttribute(Object target
, String name
, String value
) {
408 if (name
.equals(IS_LINKED
)) {
409 boolean isLinked
= getResource().isLinked();
410 return Boolean
.toString(isLinked
).equals(value
);
415 // ------------------------------------------------------------------------
417 // ------------------------------------------------------------------------
420 public Object
getEditableValue() {
425 * Get the trace properties of this traceElement if the corresponding trace
426 * is opened in an editor
428 * @return a map with the names and values of the trace properties
429 * respectively as keys and values
431 private Map
<String
, String
> getTraceProperties() {
432 for (ITmfTrace openedTrace
: TmfTraceManager
.getInstance().getOpenedTraces()) {
433 for (ITmfTrace singleTrace
: TmfTraceManager
.getTraceSet(openedTrace
)) {
434 if (getElementUnderTraceFolder().getResource().equals(singleTrace
.getResource())) {
435 if (singleTrace
instanceof ITmfTraceProperties
) {
436 ITmfTraceProperties traceProperties
= (ITmfTraceProperties
) singleTrace
;
437 return traceProperties
.getTraceProperties();
442 return new HashMap
<>();
446 public IPropertyDescriptor
[] getPropertyDescriptors() {
447 Map
<String
, String
> traceProperties
= getTraceProperties();
448 if (!traceProperties
.isEmpty()) {
449 IPropertyDescriptor
[] propertyDescriptorArray
= new IPropertyDescriptor
[traceProperties
.size() + sfDescriptors
.length
];
451 for (Map
.Entry
<String
, String
> varName
: traceProperties
.entrySet()) {
452 ReadOnlyTextPropertyDescriptor descriptor
= new ReadOnlyTextPropertyDescriptor(this.getName() + "_" + varName
.getKey(), varName
.getKey()); //$NON-NLS-1$
453 descriptor
.setCategory(sfTracePropertiesCategory
);
454 propertyDescriptorArray
[index
] = descriptor
;
457 for (int i
= 0; i
< sfDescriptors
.length
; i
++) {
458 propertyDescriptorArray
[index
] = sfDescriptors
[i
];
461 return propertyDescriptorArray
;
463 return Arrays
.copyOf(sfDescriptors
, sfDescriptors
.length
);
467 public Object
getPropertyValue(Object id
) {
469 if (sfName
.equals(id
)) {
473 if (sfPath
.equals(id
)) {
474 return getPath().toString();
477 if (sfLocation
.equals(id
)) {
478 return URIUtil
.toUnencodedString(getLocation());
481 if (sfIsLinked
.equals(id
)) {
482 return Boolean
.valueOf(getResource().isLinked()).toString();
485 if (sfSourceLocation
.equals(id
)) {
487 String sourceLocation
= getElementUnderTraceFolder().getResource().getPersistentProperty(TmfCommonConstants
.SOURCE_LOCATION
);
488 if (sourceLocation
!= null) {
489 return sourceLocation
;
491 } catch (CoreException e
) {
493 return ""; //$NON-NLS-1$
496 if (sfLastModified
.equals(id
)) {
497 FileInfo fileInfo
= getFileInfo();
498 if (fileInfo
== null) {
499 return ""; //$NON-NLS-1$
501 long date
= fileInfo
.lastModified
;
502 DateFormat format
= DateFormat
.getDateTimeInstance(DateFormat
.LONG
, DateFormat
.MEDIUM
);
503 return format
.format(new Date(date
));
506 if (sfSize
.equals(id
)) {
507 FileInfo fileInfo
= getFileInfo();
508 if (fileInfo
== null) {
509 return ""; //$NON-NLS-1$
511 if (getResource() instanceof IFolder
) {
512 if (fileInfo
.count
<= FOLDER_MAX_COUNT
) {
513 return NLS
.bind(Messages
.TmfTraceElement_FolderSizeString
,
514 NumberFormat
.getInstance().format(fileInfo
.size
), fileInfo
.count
);
516 return NLS
.bind(Messages
.TmfTraceElement_FolderSizeOverflowString
,
517 NumberFormat
.getInstance().format(fileInfo
.size
), FOLDER_MAX_COUNT
);
519 return NLS
.bind(Messages
.TmfTraceElement_FileSizeString
, NumberFormat
.getInstance().format(fileInfo
.size
));
522 if (sfTraceType
.equals(id
)) {
523 if (getTraceType() != null) {
524 TraceTypeHelper helper
= TmfTraceType
.getTraceType(getTraceType());
525 if (helper
!= null) {
526 return helper
.getLabel();
529 return ""; //$NON-NLS-1$
532 if (sfTimeOffset
.equals(id
)) {
533 long offset
= TimestampTransformFactory
.getTimestampTransform(getElementUnderTraceFolder().getResource()).transform(0);
535 return OFFSET_FORMAT
.format(offset
);
537 return ""; //$NON-NLS-1$
540 Map
<String
, String
> traceProperties
= getTraceProperties();
541 if (id
!= null && !traceProperties
.isEmpty()) {
542 String key
= (String
) id
;
543 key
= key
.substring(this.getName().length() + 1); // remove name_
544 String value
= traceProperties
.get(key
);
551 private FileInfo
getFileInfo() {
552 /* FileInfo is needed for both 'last modified' and 'size' properties.
553 * It is freshly computed for one, and reused for the other, then
554 * cleared so that the information can be refreshed the next time.
557 if (fFileInfo
== null) {
559 fileInfo
= computeFileInfo(new FileInfo(), getResource());
560 } catch (CoreException e
) {
563 fFileInfo
= fileInfo
;
565 fileInfo
= fFileInfo
;
571 private FileInfo
computeFileInfo(FileInfo fileInfo
, IResource resource
) throws CoreException
{
572 if (fileInfo
== null || fileInfo
.count
> FOLDER_MAX_COUNT
) {
575 if (resource
instanceof IFolder
) {
576 IFolder folder
= (IFolder
) resource
;
577 for (IResource member
: folder
.members()) {
578 computeFileInfo(fileInfo
, member
);
582 IFileInfo info
= EFS
.getStore(resource
.getLocationURI()).fetchInfo();
583 fileInfo
.lastModified
= Math
.max(fileInfo
.lastModified
, info
.getLastModified());
584 fileInfo
.size
+= info
.getLength();
590 public void resetPropertyValue(Object id
) {
594 public void setPropertyValue(Object id
, Object value
) {
598 public boolean isPropertyResettable(Object id
) {
603 public boolean isPropertySet(Object id
) {
608 * Copy this trace in the trace folder. No other parameters are mentioned so
609 * the trace is copied in this element's project trace folder
613 * @return the new Resource object
616 public TmfTraceElement
copy(String newName
) {
617 TmfTraceFolder folder
= (TmfTraceFolder
) getParent();
618 IResource res
= super.copy(newName
, false);
619 for (TmfTraceElement trace
: folder
.getTraces()) {
620 if (trace
.getResource().equals(res
)) {
628 * Close opened editors associated with this trace.
633 public void closeEditors() {
634 super.closeEditors();
636 // Close experiments that contain the trace if open
637 if (getParent() instanceof TmfTraceFolder
) {
638 TmfExperimentFolder experimentsFolder
= getProject().getExperimentsFolder();
639 for (TmfExperimentElement experiment
: experimentsFolder
.getExperiments()) {
640 for (TmfTraceElement trace
: experiment
.getTraces()) {
641 if (trace
.getElementPath().equals(getElementPath())) {
642 experiment
.closeEditors();
647 } else if (getParent() instanceof TmfExperimentElement
) {
648 TmfExperimentElement experiment
= (TmfExperimentElement
) getParent();
649 experiment
.closeEditors();
654 * Delete the trace resource, remove it from experiments and delete its
655 * supplementary files
657 * @param progressMonitor
658 * a progress monitor, or null if progress reporting is not
661 * @throws CoreException
662 * thrown when IResource.delete fails
665 public void delete(IProgressMonitor progressMonitor
) throws CoreException
{
666 // Close editors in UI Thread
667 Display
.getDefault().syncExec(new Runnable() {
674 IPath path
= fResource
.getLocation();
676 if (getParent() instanceof TmfTraceFolder
) {
677 TmfExperimentFolder experimentFolder
= getProject().getExperimentsFolder();
679 // Propagate the removal to traces
680 for (TmfExperimentElement experiment
: experimentFolder
.getExperiments()) {
681 List
<TmfTraceElement
> toRemove
= new LinkedList
<>();
682 for (TmfTraceElement trace
: experiment
.getTraces()) {
683 if (trace
.getElementPath().equals(getElementPath())) {
687 for (TmfTraceElement child
: toRemove
) {
688 experiment
.removeTrace(child
);
692 // Delete supplementary files
693 deleteSupplementaryFolder();
695 } else if (getParent() instanceof TmfExperimentElement
) {
696 TmfExperimentElement experimentElement
= (TmfExperimentElement
) getParent();
697 experimentElement
.removeTrace(this);
701 // Finally, delete the trace
702 fResource
.delete(true, progressMonitor
);