X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=org.eclipse.linuxtools.tmf.ui%2Fsrc%2Forg%2Feclipse%2Flinuxtools%2Ftmf%2Fui%2Fproject%2Fmodel%2FTmfTraceElement.java;h=2a81f93472c5ccb4e72a8766ebf4044bb86a6344;hb=080600d9018f188e488a634be6e25bf91d3f692b;hp=682b58358dc1a29765cbccbd053f37f1b3cd3e50;hpb=d34665f9e79d9ef520611eff3eda19c76e29f8dd;p=deliverable%2Ftracecompass.git diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java index 682b58358d..2a81f93472 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java @@ -1,58 +1,79 @@ /******************************************************************************* - * Copyright (c) 2010, 2011 Ericsson - * + * Copyright (c) 2010, 2013 Ericsson, École Polytechnique de Montréal + * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html - * + * * Contributors: * Francois Chouinard - Initial API and implementation + * Bernd Hufmann - Added supplementary files handling + * Geneviève Bastien - Moved supplementary files handling to parent class, + * added code to copy trace + * Patrick Tasse - Close editors to release resources *******************************************************************************/ package org.eclipse.linuxtools.tmf.ui.project.model; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.QualifiedName; -import org.eclipse.linuxtools.internal.tmf.core.util.TmfTraceType; +import org.eclipse.linuxtools.internal.tmf.ui.Activator; import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtEvent; import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTrace; import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTraceDefinition; import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlEvent; import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTrace; import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomXmlTraceDefinition; -import org.eclipse.linuxtools.tmf.core.event.TmfEvent; +import org.eclipse.linuxtools.tmf.core.TmfCommonConstants; +import org.eclipse.linuxtools.tmf.core.event.ITmfEvent; import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace; +import org.eclipse.linuxtools.tmf.core.trace.TmfTrace; import org.eclipse.linuxtools.tmf.ui.editors.TmfEventsEditor; +import org.eclipse.linuxtools.tmf.ui.properties.ReadOnlyTextPropertyDescriptor; import org.eclipse.ui.IActionFilter; +import org.eclipse.ui.IEditorReference; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource2; -import org.eclipse.ui.views.properties.TextPropertyDescriptor; /** - * TmfTraceElement - *

+ * Implementation of trace model element representing a trace. It provides + * methods to instantiate ITmfTrace and ITmfEvent as + * well as editor ID from the trace type extension definition. + * + * @version 1.0 + * @author Francois Chouinard */ -public class TmfTraceElement extends TmfProjectModelElement implements IActionFilter, IPropertySource2 { +public class TmfTraceElement extends TmfWithFolderElement implements IActionFilter, IPropertySource2 { // ------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------ - // Property keys - public static final QualifiedName TRACEBUNDLE = new QualifiedName("org.eclipse.linuxtools.tmf", "tracetype.bundle"); //$NON-NLS-1$//$NON-NLS-2$ - public static final QualifiedName TRACETYPE = new QualifiedName("org.eclipse.linuxtools.tmf", "tracetype.id"); //$NON-NLS-1$//$NON-NLS-2$ - public static final QualifiedName TRACEICON = new QualifiedName("org.eclipse.linuxtools.tmf", "tracetype.icon"); //$NON-NLS-1$//$NON-NLS-2$ - // Other attributes + /** + * Bundle attribute name + */ public static final String BUNDLE = "bundle"; //$NON-NLS-1$ + /** + * IsLinked attribute name. + */ public static final String IS_LINKED = "isLinked"; //$NON-NLS-1$ // Property View stuff @@ -63,11 +84,11 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi private static final String sfEventType = "type"; //$NON-NLS-1$ private static final String sfIsLinked = "linked"; //$NON-NLS-1$ - private static final TextPropertyDescriptor sfNameDescriptor = new TextPropertyDescriptor(sfName, sfName); - private static final TextPropertyDescriptor sfPathDescriptor = new TextPropertyDescriptor(sfPath, sfPath); - private static final TextPropertyDescriptor sfLocationDescriptor = new TextPropertyDescriptor(sfLocation, sfLocation); - private static final TextPropertyDescriptor sfTypeDescriptor = new TextPropertyDescriptor(sfEventType, sfEventType); - private static final TextPropertyDescriptor sfIsLinkedDescriptor = new TextPropertyDescriptor(sfIsLinked, sfIsLinked); + private static final ReadOnlyTextPropertyDescriptor sfNameDescriptor = new ReadOnlyTextPropertyDescriptor(sfName, sfName); + private static final ReadOnlyTextPropertyDescriptor sfPathDescriptor = new ReadOnlyTextPropertyDescriptor(sfPath, sfPath); + private static final ReadOnlyTextPropertyDescriptor sfLocationDescriptor = new ReadOnlyTextPropertyDescriptor(sfLocation, sfLocation); + private static final ReadOnlyTextPropertyDescriptor sfTypeDescriptor = new ReadOnlyTextPropertyDescriptor(sfEventType, sfEventType); + private static final ReadOnlyTextPropertyDescriptor sfIsLinkedDescriptor = new ReadOnlyTextPropertyDescriptor(sfIsLinked, sfIsLinked); private static final IPropertyDescriptor[] sfDescriptors = { sfNameDescriptor, sfPathDescriptor, sfLocationDescriptor, sfTypeDescriptor, sfIsLinkedDescriptor }; @@ -80,6 +101,8 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi sfIsLinkedDescriptor.setCategory(sfInfoCategory); } + private static final String BOOKMARKS_HIDDEN_FILE = ".bookmarks"; //$NON-NLS-1$ + // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ @@ -91,11 +114,15 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi // Static initialization // ------------------------------------------------------------------------ - // The mapping of available trace type IDs to their corresponding configuration element + // The mapping of available trace type IDs to their corresponding + // configuration element private static final Map sfTraceTypeAttributes = new HashMap(); private static final Map sfTraceCategories = new HashMap(); - // Initialize statically at startup + /** + * Initialize statically at startup by getting extensions from the platform + * extension registry. + */ public static void init() { IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(TmfTraceType.TMF_TRACE_TYPE_ID); for (IConfigurationElement ce : config) { @@ -113,11 +140,30 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ - + /** + * Constructor. Creates trace model element under the trace folder. + * + * @param name + * The name of trace + * @param trace + * The trace resource. + * @param parent + * The parent element (trace folder) + */ public TmfTraceElement(String name, IResource trace, TmfTraceFolder parent) { this(name, trace, (TmfProjectModelElement) parent); } + /** + * Constructor. Creates trace model element under the experiment folder. + * + * @param name + * The name of trace + * @param trace + * The trace resource. + * @param parent + * The parent element (experiment folder) + */ public TmfTraceElement(String name, IResource trace, TmfExperimentElement parent) { this(name, trace, (TmfProjectModelElement) parent); } @@ -131,21 +177,39 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ - + /** + * Returns the trace type ID. + * + * @return trace type ID. + */ public String getTraceType() { return fTraceTypeId; } + /** + * Refreshes the trace type filed by reading the trace type persistent + * property of the resource referenece. + */ public void refreshTraceType() { try { - fTraceTypeId = getResource().getPersistentProperty(TRACETYPE); + fTraceTypeId = getResource().getPersistentProperty(TmfCommonConstants.TRACETYPE); } catch (CoreException e) { - e.printStackTrace(); + Activator.getDefault().logError("Error refreshing trace type pesistent property for trace " + getName(), e); //$NON-NLS-1$ } } - public ITmfTrace instantiateTrace() { + /** + * Instantiate a ITmfTrace object based on the trace type and + * the corresponding extension. + * + * @return the ITmfTrace or null for an error + */ + public ITmfTrace instantiateTrace() { try { + + // make sure that supplementary folder exists + refreshSupplementaryFolder(); + if (fTraceTypeId != null) { if (fTraceTypeId.startsWith(CustomTxtTrace.class.getCanonicalName())) { for (CustomTxtTraceDefinition def : CustomTxtTraceDefinition.loadAll()) { @@ -162,16 +226,25 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi } } IConfigurationElement ce = sfTraceTypeAttributes.get(fTraceTypeId); - ITmfTrace trace = (ITmfTrace) ce.createExecutableExtension(TmfTraceType.TRACE_TYPE_ATTR); + if (ce == null) { + return null; + } + ITmfTrace trace = (ITmfTrace) ce.createExecutableExtension(TmfTraceType.TRACE_TYPE_ATTR); return trace; } } catch (CoreException e) { - e.printStackTrace(); + Activator.getDefault().logError("Error instantiating ITmfTrace object for trace " + getName(), e); //$NON-NLS-1$ } return null; } - public TmfEvent instantiateEvent() { + /** + * Instantiate a ITmfEvent object based on the trace type and + * the corresponding extension. + * + * @return the ITmfEvent or null for an error + */ + public ITmfEvent instantiateEvent() { try { if (fTraceTypeId != null) { if (fTraceTypeId.startsWith(CustomTxtTrace.class.getCanonicalName())) { @@ -189,15 +262,23 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi } } IConfigurationElement ce = sfTraceTypeAttributes.get(fTraceTypeId); - TmfEvent event = (TmfEvent) ce.createExecutableExtension(TmfTraceType.EVENT_TYPE_ATTR); + if (ce == null) { + return null; + } + ITmfEvent event = (ITmfEvent) ce.createExecutableExtension(TmfTraceType.EVENT_TYPE_ATTR); return event; } } catch (CoreException e) { - e.printStackTrace(); + Activator.getDefault().logError("Error instantiating ITmfEvent object for trace " + getName(), e); //$NON-NLS-1$ } return null; } + /** + * Returns the optional editor ID from the trace type extension. + * + * @return the editor ID or null if not defined. + */ public String getEditorId() { if (fTraceTypeId != null) { if (fTraceTypeId.startsWith(CustomTxtTrace.class.getCanonicalName())) { @@ -215,6 +296,76 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi return null; } + /** + * Returns the file resource used to store bookmarks after creating it if + * necessary. If the trace resource is a file, it is returned directly. If + * the trace resource is a folder, a linked file is returned. The file will + * be created if it does not exist. + * + * @return the bookmarks file + * @throws CoreException + * if the bookmarks file cannot be created + * @since 2.0 + */ + public IFile createBookmarksFile() throws CoreException { + IFile file = getBookmarksFile(); + if (fResource instanceof IFolder) { + if (!file.exists()) { + final IFile bookmarksFile = getProject().getTracesFolder().getResource().getFile(BOOKMARKS_HIDDEN_FILE); + if (!bookmarksFile.exists()) { + final InputStream source = new ByteArrayInputStream(new byte[0]); + bookmarksFile.create(source, true, null); + } + bookmarksFile.setHidden(true); + file.createLink(bookmarksFile.getLocation(), IResource.REPLACE, null); + file.setHidden(true); + file.setPersistentProperty(TmfCommonConstants.TRACETYPE, TmfTrace.class.getCanonicalName()); + } + } + return file; + } + + /** + * Returns the file resource used to store bookmarks. The file may not + * exist. + * + * @return the bookmarks file + * @since 2.0 + */ + public IFile getBookmarksFile() { + IFile file = null; + if (fResource instanceof IFile) { + file = (IFile) fResource; + } else if (fResource instanceof IFolder) { + final IFolder folder = (IFolder) fResource; + file = folder.getFile(getName() + '_'); + } + return file; + } + + /** + * Returns the TmfTraceElement located under the + * TmfTracesFolder. + * + * @return this if this element is under the + * TmfTracesFolder else the corresponding + * TmfTraceElement if this element is under + * TmfExperimentElement. + */ + public TmfTraceElement getElementUnderTraceFolder() { + + // If trace is under an experiment, return original trace from the + // traces folder + if (getParent() instanceof TmfExperimentElement) { + for (TmfTraceElement aTrace : getProject().getTracesFolder().getTraces()) { + if (aTrace.getName().equals(getName())) { + return aTrace; + } + } + } + return this; + } + // ------------------------------------------------------------------------ // IActionFilter // ------------------------------------------------------------------------ @@ -259,23 +410,27 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi @Override public IPropertyDescriptor[] getPropertyDescriptors() { - return (sfDescriptors != null) ? Arrays.copyOf(sfDescriptors, sfDescriptors.length) : null; + return Arrays.copyOf(sfDescriptors, sfDescriptors.length); } @Override public Object getPropertyValue(Object id) { - if (sfName.equals(id)) + if (sfName.equals(id)) { return getName(); + } - if (sfPath.equals(id)) + if (sfPath.equals(id)) { return getPath().toString(); + } - if (sfLocation.equals(id)) + if (sfLocation.equals(id)) { return getLocation().toString(); + } - if (sfIsLinked.equals(id)) + if (sfIsLinked.equals(id)) { return Boolean.valueOf(getResource().isLinked()).toString(); + } if (sfEventType.equals(id)) { if (fTraceTypeId != null) { @@ -287,7 +442,7 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi return null; } - private String getCategory(IConfigurationElement ce) { + private static String getCategory(IConfigurationElement ce) { String categoryId = ce.getAttribute(TmfTraceType.CATEGORY_ATTR); if (categoryId != null) { IConfigurationElement category = sfTraceCategories.get(categoryId); @@ -316,4 +471,58 @@ public class TmfTraceElement extends TmfProjectModelElement implements IActionFi return false; } + /** + * Copy this trace in the trace folder. No other parameters are mentioned so + * the trace is copied in this element's project trace folder + * + * @param string + * The new trace name + * @return the new Resource object + * @since 2.0 + */ + public TmfTraceElement copy(String string) { + TmfTraceFolder folder = this.getProject().getTracesFolder(); + IResource res = super.copy(string, false); + return new TmfTraceElement(string, res, folder); + } + + /** + * Close opened editors associated with this trace. + * @since 2.0 + */ + public void closeEditors() { + // Close the trace if open + IFile file = getBookmarksFile(); + FileEditorInput input = new FileEditorInput(file); + IWorkbench wb = PlatformUI.getWorkbench(); + for (IWorkbenchWindow wbWindow : wb.getWorkbenchWindows()) { + for (IWorkbenchPage wbPage : wbWindow.getPages()) { + for (IEditorReference editorReference : wbPage.getEditorReferences()) { + try { + if (editorReference.getEditorInput().equals(input)) { + wbPage.closeEditor(editorReference.getEditor(false), false); + } + } catch (PartInitException e) { + Activator.getDefault().logError("Error closing editor for trace " + getName(), e); //$NON-NLS-1$ + } + } + } + } + + // Close experiments that contain the trace if open + if (getParent() instanceof TmfTraceFolder) { + TmfExperimentFolder experimentFolder = getProject().getExperimentsFolder(); + for (ITmfProjectModelElement experiment : experimentFolder.getChildren()) { + for (ITmfProjectModelElement child : experiment.getChildren()) { + if (child.getName().equals(getName())) { + ((TmfExperimentElement) experiment).closeEditors(); + break; + } + } + } + } else if (getParent() instanceof TmfExperimentElement) { + TmfExperimentElement experiment = (TmfExperimentElement) getParent(); + experiment.closeEditors(); + } + } }