TMF: Add supplementary folder to experiments
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / project / model / TmfTraceElement.java
1 /*******************************************************************************
2 * Copyright (c) 2010, 2011, 2012 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 * 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 *******************************************************************************/
14
15 package org.eclipse.linuxtools.tmf.ui.project.model;
16
17 import java.io.ByteArrayInputStream;
18 import java.io.InputStream;
19 import java.util.Arrays;
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import org.eclipse.core.resources.IFile;
24 import org.eclipse.core.resources.IFolder;
25 import org.eclipse.core.resources.IResource;
26 import org.eclipse.core.runtime.CoreException;
27 import org.eclipse.core.runtime.IConfigurationElement;
28 import org.eclipse.core.runtime.Platform;
29 import org.eclipse.linuxtools.internal.tmf.ui.Activator;
30 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtEvent;
31 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTrace;
32 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTraceDefinition;
33 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlEvent;
34 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTrace;
35 import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTraceDefinition;
36 import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
37 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
38 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
39 import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
40 import org.eclipse.linuxtools.tmf.ui.editors.TmfEventsEditor;
41 import org.eclipse.ui.IActionFilter;
42 import org.eclipse.ui.views.properties.IPropertyDescriptor;
43 import org.eclipse.ui.views.properties.IPropertySource2;
44 import org.eclipse.ui.views.properties.TextPropertyDescriptor;
45
46 /**
47 * Implementation of trace model element representing a trace. It provides methods to instantiate
48 * <code>ITmfTrace</code> and <code>ITmfEvent</code> as well as editor ID from the trace type
49 * extension definition.
50 *
51 * @version 1.0
52 * @author Francois Chouinard
53 */
54 public class TmfTraceElement extends TmfWithFolderElement implements IActionFilter, IPropertySource2 {
55
56 // ------------------------------------------------------------------------
57 // Constants
58 // ------------------------------------------------------------------------
59
60 // Other attributes
61 /**
62 * Bundle attribute name
63 */
64 public static final String BUNDLE = "bundle"; //$NON-NLS-1$
65 /**
66 * IsLinked attribute name.
67 */
68 public static final String IS_LINKED = "isLinked"; //$NON-NLS-1$
69
70 // Property View stuff
71 private static final String sfInfoCategory = "Info"; //$NON-NLS-1$
72 private static final String sfName = "name"; //$NON-NLS-1$
73 private static final String sfPath = "path"; //$NON-NLS-1$
74 private static final String sfLocation = "location"; //$NON-NLS-1$
75 private static final String sfEventType = "type"; //$NON-NLS-1$
76 private static final String sfIsLinked = "linked"; //$NON-NLS-1$
77
78 private static final TextPropertyDescriptor sfNameDescriptor = new TextPropertyDescriptor(sfName, sfName);
79 private static final TextPropertyDescriptor sfPathDescriptor = new TextPropertyDescriptor(sfPath, sfPath);
80 private static final TextPropertyDescriptor sfLocationDescriptor = new TextPropertyDescriptor(sfLocation, sfLocation);
81 private static final TextPropertyDescriptor sfTypeDescriptor = new TextPropertyDescriptor(sfEventType, sfEventType);
82 private static final TextPropertyDescriptor sfIsLinkedDescriptor = new TextPropertyDescriptor(sfIsLinked, sfIsLinked);
83
84 private static final IPropertyDescriptor[] sfDescriptors = { sfNameDescriptor, sfPathDescriptor, sfLocationDescriptor,
85 sfTypeDescriptor, sfIsLinkedDescriptor };
86
87 static {
88 sfNameDescriptor.setCategory(sfInfoCategory);
89 sfPathDescriptor.setCategory(sfInfoCategory);
90 sfLocationDescriptor.setCategory(sfInfoCategory);
91 sfTypeDescriptor.setCategory(sfInfoCategory);
92 sfIsLinkedDescriptor.setCategory(sfInfoCategory);
93 }
94
95 private static final String BOOKMARKS_HIDDEN_FILE = ".bookmarks"; //$NON-NLS-1$
96
97 // ------------------------------------------------------------------------
98 // Attributes
99 // ------------------------------------------------------------------------
100
101 // This trace type ID as defined in plugin.xml
102 private String fTraceTypeId = null;
103
104 // ------------------------------------------------------------------------
105 // Static initialization
106 // ------------------------------------------------------------------------
107
108 // The mapping of available trace type IDs to their corresponding configuration element
109 private static final Map<String, IConfigurationElement> sfTraceTypeAttributes = new HashMap<String, IConfigurationElement>();
110 private static final Map<String, IConfigurationElement> sfTraceCategories = new HashMap<String, IConfigurationElement>();
111
112 /**
113 * Initialize statically at startup by getting extensions from the platform extension registry.
114 */
115 public static void init() {
116 IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(TmfTraceType.TMF_TRACE_TYPE_ID);
117 for (IConfigurationElement ce : config) {
118 String elementName = ce.getName();
119 if (elementName.equals(TmfTraceType.TYPE_ELEM)) {
120 String traceTypeId = ce.getAttribute(TmfTraceType.ID_ATTR);
121 sfTraceTypeAttributes.put(traceTypeId, ce);
122 } else if (elementName.equals(TmfTraceType.CATEGORY_ELEM)) {
123 String categoryId = ce.getAttribute(TmfTraceType.ID_ATTR);
124 sfTraceCategories.put(categoryId, ce);
125 }
126 }
127 }
128
129 // ------------------------------------------------------------------------
130 // Constructors
131 // ------------------------------------------------------------------------
132 /**
133 * Constructor.
134 * Creates trace model element under the trace folder.
135 * @param name The name of trace
136 * @param trace The trace resource.
137 * @param parent The parent element (trace folder)
138 */
139 public TmfTraceElement(String name, IResource trace, TmfTraceFolder parent) {
140 this(name, trace, (TmfProjectModelElement) parent);
141 }
142 /**
143 * Constructor.
144 * Creates trace model element under the experiment folder.
145 * @param name The name of trace
146 * @param trace The trace resource.
147 * @param parent The parent element (experiment folder)
148 */
149 public TmfTraceElement(String name, IResource trace, TmfExperimentElement parent) {
150 this(name, trace, (TmfProjectModelElement) parent);
151 }
152
153 private TmfTraceElement(String name, IResource trace, TmfProjectModelElement parent) {
154 super(name, trace, parent);
155 parent.addChild(this);
156 refreshTraceType();
157 }
158
159 // ------------------------------------------------------------------------
160 // Operations
161 // ------------------------------------------------------------------------
162 /**
163 * Returns the trace type ID.
164 * @return trace type ID.
165 */
166 public String getTraceType() {
167 return fTraceTypeId;
168 }
169
170 /**
171 * Refreshes the trace type filed by reading the trace type persistent property of the resource
172 * referenece.
173 */
174 public void refreshTraceType() {
175 try {
176 fTraceTypeId = getResource().getPersistentProperty(TmfCommonConstants.TRACETYPE);
177 } catch (CoreException e) {
178 Activator.getDefault().logError("Error refreshing trace type pesistent property for trace " + getName(), e); //$NON-NLS-1$
179 }
180 }
181
182 /**
183 * Instantiate a <code>ITmfTrace</code> object based on the trace type and the corresponding extension.
184 *
185 * @return the <code>ITmfTrace</code> or <code>null</code> for an error
186 */
187 public ITmfTrace instantiateTrace() {
188 try {
189
190 // make sure that supplementary folder exists
191 refreshSupplementaryFolder();
192
193 if (fTraceTypeId != null) {
194 if (fTraceTypeId.startsWith(CustomTxtTrace.class.getCanonicalName())) {
195 for (CustomTxtTraceDefinition def : CustomTxtTraceDefinition.loadAll()) {
196 if (fTraceTypeId.equals(CustomTxtTrace.class.getCanonicalName() + ":" + def.definitionName)) { //$NON-NLS-1$
197 return new CustomTxtTrace(def);
198 }
199 }
200 }
201 if (fTraceTypeId.startsWith(CustomXmlTrace.class.getCanonicalName())) {
202 for (CustomXmlTraceDefinition def : CustomXmlTraceDefinition.loadAll()) {
203 if (fTraceTypeId.equals(CustomXmlTrace.class.getCanonicalName() + ":" + def.definitionName)) { //$NON-NLS-1$
204 return new CustomXmlTrace(def);
205 }
206 }
207 }
208 IConfigurationElement ce = sfTraceTypeAttributes.get(fTraceTypeId);
209 ITmfTrace trace = (ITmfTrace) ce.createExecutableExtension(TmfTraceType.TRACE_TYPE_ATTR);
210 return trace;
211 }
212 } catch (CoreException e) {
213 Activator.getDefault().logError("Error instantiating ITmfTrace object for trace " + getName(), e); //$NON-NLS-1$
214 }
215 return null;
216 }
217
218 /**
219 * Instantiate a <code>ITmfEvent</code> object based on the trace type and the corresponding extension.
220 *
221 * @return the <code>ITmfEvent</code> or <code>null</code> for an error
222 */
223 public ITmfEvent instantiateEvent() {
224 try {
225 if (fTraceTypeId != null) {
226 if (fTraceTypeId.startsWith(CustomTxtTrace.class.getCanonicalName())) {
227 for (CustomTxtTraceDefinition def : CustomTxtTraceDefinition.loadAll()) {
228 if (fTraceTypeId.equals(CustomTxtTrace.class.getCanonicalName() + ":" + def.definitionName)) { //$NON-NLS-1$
229 return new CustomTxtEvent(def);
230 }
231 }
232 }
233 if (fTraceTypeId.startsWith(CustomXmlTrace.class.getCanonicalName())) {
234 for (CustomXmlTraceDefinition def : CustomXmlTraceDefinition.loadAll()) {
235 if (fTraceTypeId.equals(CustomXmlTrace.class.getCanonicalName() + ":" + def.definitionName)) { //$NON-NLS-1$
236 return new CustomXmlEvent(def);
237 }
238 }
239 }
240 IConfigurationElement ce = sfTraceTypeAttributes.get(fTraceTypeId);
241 ITmfEvent event = (ITmfEvent) ce.createExecutableExtension(TmfTraceType.EVENT_TYPE_ATTR);
242 return event;
243 }
244 } catch (CoreException e) {
245 Activator.getDefault().logError("Error instantiating ITmfEvent object for trace " + getName(), e); //$NON-NLS-1$
246 }
247 return null;
248 }
249
250 /**
251 * Returns the optional editor ID from the trace type extension.
252 * @return the editor ID or <code>null</code> if not defined.
253 */
254 public String getEditorId() {
255 if (fTraceTypeId != null) {
256 if (fTraceTypeId.startsWith(CustomTxtTrace.class.getCanonicalName())) {
257 return TmfEventsEditor.ID;
258 }
259 if (fTraceTypeId.startsWith(CustomXmlTrace.class.getCanonicalName())) {
260 return TmfEventsEditor.ID;
261 }
262 IConfigurationElement ce = sfTraceTypeAttributes.get(fTraceTypeId);
263 IConfigurationElement[] defaultEditorCE = ce.getChildren(TmfTraceType.DEFAULT_EDITOR_ELEM);
264 if (defaultEditorCE.length == 1) {
265 return defaultEditorCE[0].getAttribute(TmfTraceType.ID_ATTR);
266 }
267 }
268 return null;
269 }
270
271 /**
272 * Returns the file resource used to store bookmarks after creating it if necessary.
273 * If the trace resource is a file, it is returned directly.
274 * If the trace resource is a folder, a linked file is returned.
275 * The file will be created if it does not exist.
276 * @return the bookmarks file
277 * @throws CoreException if the bookmarks file cannot be created
278 * @since 2.0
279 */
280 public IFile createBookmarksFile() throws CoreException {
281 IFile file = getBookmarksFile();
282 if (fResource instanceof IFolder) {
283 if (!file.exists()) {
284 final IFile bookmarksFile = getProject().getTracesFolder().getResource().getFile(BOOKMARKS_HIDDEN_FILE);
285 if (!bookmarksFile.exists()) {
286 final InputStream source = new ByteArrayInputStream(new byte[0]);
287 bookmarksFile.create(source, true, null);
288 }
289 bookmarksFile.setHidden(true);
290 file.createLink(bookmarksFile.getLocation(), IResource.REPLACE, null);
291 file.setHidden(true);
292 file.setPersistentProperty(TmfCommonConstants.TRACETYPE, TmfTrace.class.getCanonicalName());
293 }
294 }
295 return file;
296 }
297
298 /**
299 * Returns the file resource used to store bookmarks.
300 * The file may not exist.
301 * @return the bookmarks file
302 * @since 2.0
303 */
304 public IFile getBookmarksFile() {
305 IFile file = null;
306 if (fResource instanceof IFile) {
307 file = (IFile) fResource;
308 } else if (fResource instanceof IFolder) {
309 final IFolder folder = (IFolder) fResource;
310 file = folder.getFile(getName() + '_');
311 }
312 return file;
313 }
314
315 /**
316 * Returns the <code>TmfTraceElement</code> located under the <code>TmfTracesFolder</code>.
317 *
318 * @return <code>this</code> if this element is under the <code>TmfTracesFolder</code>
319 * else the corresponding <code>TmfTraceElement</code> if this element is under
320 * <code>TmfExperimentElement</code>.
321 */
322 public TmfTraceElement getElementUnderTraceFolder() {
323
324 // If trace is under an experiment, return original trace from the traces folder
325 if (getParent() instanceof TmfExperimentElement) {
326 for (TmfTraceElement aTrace : getProject().getTracesFolder().getTraces()) {
327 if (aTrace.getName().equals(getName())) {
328 return aTrace;
329 }
330 }
331 }
332 return this;
333 }
334
335 // ------------------------------------------------------------------------
336 // IActionFilter
337 // ------------------------------------------------------------------------
338
339 @Override
340 public boolean testAttribute(Object target, String name, String value) {
341 if (name.equals(IS_LINKED)) {
342 boolean isLinked = getResource().isLinked();
343 return Boolean.toString(isLinked).equals(value);
344 }
345 return false;
346 }
347
348 // ------------------------------------------------------------------------
349 // TmfTraceElement
350 // ------------------------------------------------------------------------
351 /*
352 * (non-Javadoc)
353 * @see org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement#getProject()
354 */
355 @Override
356 public TmfProjectElement getProject() {
357 if (getParent() instanceof TmfTraceFolder) {
358 TmfTraceFolder folder = (TmfTraceFolder) getParent();
359 TmfProjectElement project = (TmfProjectElement) folder.getParent();
360 return project;
361 }
362 if (getParent() instanceof TmfExperimentElement) {
363 TmfExperimentElement experiment = (TmfExperimentElement) getParent();
364 TmfExperimentFolder folder = (TmfExperimentFolder) experiment.getParent();
365 TmfProjectElement project = (TmfProjectElement) folder.getParent();
366 return project;
367 }
368 return null;
369 }
370
371 // ------------------------------------------------------------------------
372 // IPropertySource2
373 // ------------------------------------------------------------------------
374
375 /*
376 * (non-Javadoc)
377 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
378 */
379 @Override
380 public Object getEditableValue() {
381 return null;
382 }
383
384 /*
385 * (non-Javadoc)
386 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
387 */
388 @Override
389 public IPropertyDescriptor[] getPropertyDescriptors() {
390 return Arrays.copyOf(sfDescriptors, sfDescriptors.length);
391 }
392
393 /*
394 * (non-Javadoc)
395 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
396 */
397 @Override
398 public Object getPropertyValue(Object id) {
399
400 if (sfName.equals(id)) {
401 return getName();
402 }
403
404 if (sfPath.equals(id)) {
405 return getPath().toString();
406 }
407
408 if (sfLocation.equals(id)) {
409 return getLocation().toString();
410 }
411
412 if (sfIsLinked.equals(id)) {
413 return Boolean.valueOf(getResource().isLinked()).toString();
414 }
415
416 if (sfEventType.equals(id)) {
417 if (fTraceTypeId != null) {
418 IConfigurationElement ce = sfTraceTypeAttributes.get(fTraceTypeId);
419 return (ce != null) ? (getCategory(ce) + " : " + ce.getAttribute(TmfTraceType.NAME_ATTR)) : ""; //$NON-NLS-1$ //$NON-NLS-2$
420 }
421 }
422
423 return null;
424 }
425
426 private static String getCategory(IConfigurationElement ce) {
427 String categoryId = ce.getAttribute(TmfTraceType.CATEGORY_ATTR);
428 if (categoryId != null) {
429 IConfigurationElement category = sfTraceCategories.get(categoryId);
430 if (category != null) {
431 return category.getAttribute(TmfTraceType.NAME_ATTR);
432 }
433 }
434 return "[no category]"; //$NON-NLS-1$
435 }
436
437 /*
438 * (non-Javadoc)
439 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
440 */
441 @Override
442 public void resetPropertyValue(Object id) {
443 }
444
445 /*
446 * (non-Javadoc)
447 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
448 */
449 @Override
450 public void setPropertyValue(Object id, Object value) {
451 }
452
453 /*
454 * (non-Javadoc)
455 * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertyResettable(java.lang.Object)
456 */
457 @Override
458 public boolean isPropertyResettable(Object id) {
459 return false;
460 }
461
462 /*
463 * (non-Javadoc)
464 * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertySet(java.lang.Object)
465 */
466 @Override
467 public boolean isPropertySet(Object id) {
468 return false;
469 }
470
471 }
This page took 0.05803 seconds and 5 git commands to generate.