tmf: Add command to manually refresh traces
authorMarc-Andre Laperle <marc-andre.laperle@ericsson.com>
Fri, 25 Sep 2015 23:52:27 +0000 (19:52 -0400)
committerMarc-Andre Laperle <marc-andre.laperle@ericsson.com>
Thu, 1 Oct 2015 22:01:55 +0000 (18:01 -0400)
At the moment, only the events table will be refreshed.

Change-Id: I7b9933d8e52e7e7fc821a3b41f1e688bf4c81d09
Signed-off-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/57137
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java
tmf/org.eclipse.tracecompass.tmf.ui/plugin.properties
tmf/org.eclipse.tracecompass.tmf.ui/plugin.xml
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/RefreshTraceContentHandler.java [new file with mode: 0644]
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/editors/TmfEventsEditor.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTable.java

index 1dc22f6f4e24bec4f8d620ef0364170c9f13f4c4..ef796b9320429e4ea240fa142595bdd3eba6387f 100644 (file)
@@ -38,6 +38,8 @@ import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
 import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtTraceContext;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTraceProperties;
@@ -218,6 +220,26 @@ public class BtfTrace extends TmfTrace implements ITmfPersistentlyIndexable, ITm
 
     }
 
+    private void initFile() throws TmfTraceException {
+        closeFile();
+        try {
+            fFileInput = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
+        } catch (IOException e) {
+            throw new TmfTraceException(e.getMessage(), e);
+        }
+    }
+
+    private void closeFile() {
+        if (fFileInput != null) {
+            try {
+                fFileInput.close();
+            } catch (IOException e) {
+            } finally {
+                fFileInput = null;
+            }
+        }
+    }
+
     @Override
     public IStatus validate(IProject project, String path) {
         File file = new File(path);
@@ -470,4 +492,21 @@ public class BtfTrace extends TmfTrace implements ITmfPersistentlyIndexable, ITm
         super.dispose();
     }
 
+    @TmfSignalHandler
+    @Override
+    public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+        if (signal.getTrace() == this) {
+            try {
+                synchronized (this) {
+                    // Reset the file handle in case it has reached the end of the
+                    // file already. Otherwise, it will not be able to read new data
+                    // pass the previous end.
+                    initFile();
+                }
+            } catch (TmfTraceException e) {
+                Activator.logError(e.getLocalizedMessage(), e);
+            }
+        }
+        super.traceRangeUpdated(signal);
+    }
 }
index cf57aa41ff10bc1f18a8f8f04a3fa25ef8fddc9c..b8f46052b4029a220204a2cfac0c3fb9e5f60368 100644 (file)
@@ -35,6 +35,8 @@ import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
 import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtTraceDefinition.InputLine;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
 import org.eclipse.tracecompass.tmf.core.trace.TmfContext;
@@ -109,6 +111,11 @@ public class CustomTxtTrace extends TmfTrace implements ITmfPersistentlyIndexabl
     @Override
     public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType) throws TmfTraceException {
         super.initTrace(resource, path, eventType);
+        initFile();
+    }
+
+    private void initFile() throws TmfTraceException {
+        closeFile();
         try {
             fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
         } catch (IOException e) {
@@ -119,6 +126,10 @@ public class CustomTxtTrace extends TmfTrace implements ITmfPersistentlyIndexabl
     @Override
     public synchronized void dispose() {
         super.dispose();
+        closeFile();
+    }
+
+    private void closeFile() {
         if (fFile != null) {
             try {
                 fFile.close();
@@ -549,4 +560,22 @@ public class CustomTxtTrace extends TmfTrace implements ITmfPersistentlyIndexabl
         }
         return traceTypeId;
     }
+
+    @TmfSignalHandler
+    @Override
+    public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+        if (signal.getTrace() == this) {
+            try {
+                synchronized (this) {
+                    // Reset the file handle in case it has reached the end of the
+                    // file already. Otherwise, it will not be able to read new data
+                    // pass the previous end.
+                    initFile();
+                }
+            } catch (TmfTraceException e) {
+                Activator.logError(e.getLocalizedMessage(), e);
+            }
+        }
+        super.traceRangeUpdated(signal);
+    }
 }
index bf3aa668220985c041fd830aa8e8778376f2c8ca..8df4b1b105953db9d4d81fbbb62732403dbfc931 100644 (file)
@@ -34,6 +34,8 @@ import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
 import org.eclipse.tracecompass.tmf.core.trace.TmfContext;
@@ -119,6 +121,11 @@ public class CustomXmlTrace extends TmfTrace implements ITmfPersistentlyIndexabl
     @Override
     public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType) throws TmfTraceException {
         super.initTrace(resource, path, eventType);
+        initFile();
+    }
+
+    private void initFile() throws TmfTraceException {
+        closeFile();
         try {
             fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
         } catch (IOException e) {
@@ -129,6 +136,10 @@ public class CustomXmlTrace extends TmfTrace implements ITmfPersistentlyIndexabl
     @Override
     public synchronized void dispose() {
         super.dispose();
+        closeFile();
+    }
+
+    private void closeFile() {
         if (fFile != null) {
             try {
                 fFile.close();
@@ -669,4 +680,22 @@ public class CustomXmlTrace extends TmfTrace implements ITmfPersistentlyIndexabl
         }
         return traceTypeId;
     }
+
+    @TmfSignalHandler
+    @Override
+    public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+        if (signal.getTrace() == this) {
+            try {
+                synchronized (this) {
+                    // Reset the file handle in case it has reached the end of the
+                    // file already. Otherwise, it will not be able to read new data
+                    // pass the previous end.
+                    initFile();
+                }
+            } catch (TmfTraceException e) {
+                Activator.logError(e.getLocalizedMessage(), e);
+            }
+        }
+        super.traceRangeUpdated(signal);
+    }
 }
index 1e41e06688bdd2046a61725b852d39a2468db6a4..bfd4a812d0cbef657d72ea32151d1a8f257de322 100644 (file)
@@ -30,6 +30,8 @@ import org.eclipse.tracecompass.internal.tmf.core.Activator;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
@@ -125,6 +127,11 @@ public abstract class TextTrace<T extends TextTraceEvent> extends TmfTrace imple
     @Override
     public void initTrace(IResource resource, String path, Class<? extends ITmfEvent> type) throws TmfTraceException {
         super.initTrace(resource, path, type);
+        initFile();
+    }
+
+    private void initFile() throws TmfTraceException {
+        closeFile();
         try {
             fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
         } catch (IOException e) {
@@ -135,6 +142,10 @@ public abstract class TextTrace<T extends TextTraceEvent> extends TmfTrace imple
     @Override
     public synchronized void dispose() {
         super.dispose();
+        closeFile();
+    }
+
+    private void closeFile() {
         if (fFile != null) {
             try {
                 fFile.close();
@@ -401,4 +412,22 @@ public abstract class TextTrace<T extends TextTraceEvent> extends TmfTrace imple
     public ITmfLocation restoreLocation(ByteBuffer bufferIn) {
         return new TmfLongLocation(bufferIn);
     }
+
+    @TmfSignalHandler
+    @Override
+    public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+        if (signal.getTrace() == this) {
+            try {
+                synchronized (this) {
+                    // Reset the file handle in case it has reached the end of the
+                    // file already. Otherwise, it will not be able to read new data
+                    // pass the previous end.
+                    initFile();
+                }
+            } catch (TmfTraceException e) {
+                Activator.logError(e.getLocalizedMessage(), e);
+            }
+        }
+        super.traceRangeUpdated(signal);
+    }
 }
index 4105a52c73390f7e84b0ed29a5ffe4c609e6a278..dc3acfa4598d6c3e62bb8a05d014b5753545df59 100644 (file)
@@ -211,3 +211,4 @@ commands.uml2sd.showend.description = Show the node end
 commands.uml2sd.showstart = Show node start 
 commands.uml2sd.showstart.description = Show the node start
 
+commands.sync.refresh.tracecontent = Refresh
index 1328aa295a15356e12d16f565f0cc4178b52bd30..b45d65a141e2304aaac05ddfd2b23e50d9caf43e 100644 (file)
                </with>
             </visibleWhen>
          </command>
+         <command
+              commandId="org.eclipse.ui.file.refresh"
+              label="%commands.sync.refresh.tracecontent"
+              style="push">
+           <visibleWhen
+                 checkEnabled="false">
+               <or>
+                  <iterate
+                        ifEmpty="false"
+                        operator="and">
+                     <or>
+                        <and>
+                           <instanceof
+                                 value="org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement">
+                           </instanceof>
+                           <not>
+                              <test
+                                    forcePluginActivation="true"
+                                    property="org.eclipse.linuxtools.tmf.ui.isExperimentTrace">
+                              </test>
+                           </not>
+                        </and>
+                     </or>
+                  </iterate>
+                  <with
+                      variable="activePart">
+                     <instanceof
+                           value="org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor">
+                     </instanceof>
+                  </with>
+               </or>
+           </visibleWhen>
+        </command>
       </menuContribution>
       <menuContribution
             allPopups="false"
             </with>
          </activeWhen>
       </handler>
+      <handler
+            class="org.eclipse.tracecompass.internal.tmf.ui.project.handlers.RefreshTraceContentHandler"
+            commandId="org.eclipse.ui.file.refresh">
+         <activeWhen>
+            <or>
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <or>
+                     <and>
+                        <instanceof
+                              value="org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement">
+                        </instanceof>
+                        <not>
+                           <test
+                                 forcePluginActivation="true"
+                                 property="org.eclipse.linuxtools.tmf.ui.isExperimentTrace">
+                           </test>
+                        </not>
+                     </and>
+                  </or>
+               </iterate>
+               <with
+                   variable="activePart">
+                  <instanceof
+                        value="org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor">
+                  </instanceof>
+               </with>
+            </or>
+         </activeWhen>
+      </handler>
    </extension>
    <extension point="org.eclipse.ui.bindings">
       <key
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/RefreshTraceContentHandler.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/RefreshTraceContentHandler.java
new file mode 100644 (file)
index 0000000..d0725f9
--- /dev/null
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Ericsson
+ *
+ * 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:
+ *   Marc-Andre Laperle - Initial API and implementation.
+ *******************************************************************************/
+package org.eclipse.tracecompass.internal.tmf.ui.project.handlers;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
+import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
+import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Refresh the content of a trace in order to see new events.
+ */
+public class RefreshTraceContentHandler extends AbstractHandler {
+
+    @Override
+    public Object execute(ExecutionEvent event) throws ExecutionException {
+
+        // Get the selection
+        ISelection selection = HandlerUtil.getCurrentSelection(event);
+        if (!(selection instanceof IStructuredSelection)) {
+            return null;
+        }
+        final Iterator<Object> iterator = ((IStructuredSelection) selection).iterator();
+
+        while (iterator.hasNext()) {
+            Object element = iterator.next();
+            if (element instanceof TmfTraceElement) {
+                TmfTraceElement trace = (TmfTraceElement) element;
+                refreshTrace(trace);
+
+            } else if (element instanceof TmfTraceFolder) {
+                TmfTraceFolder tmfTraceFolder = (TmfTraceFolder) element;
+                for (TmfTraceElement e : tmfTraceFolder.getTraces()) {
+                    refreshTrace(e);
+                }
+            } else if (element instanceof ITmfEvent) {
+                ITmfEvent iTmfEvent = (ITmfEvent) element;
+                refreshTrace(iTmfEvent.getTrace());
+            }
+        }
+        return null;
+    }
+
+    private static void refreshTrace(TmfTraceElement t) {
+        final TmfTraceElement traceElement = t.getElementUnderTraceFolder();
+        ITmfTrace trace = traceElement.getTrace();
+        refreshTrace(trace);
+    }
+
+    private static void refreshTrace(ITmfTrace trace) {
+        TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BIG_BANG, TmfTimestamp.BIG_CRUNCH);
+        TmfTraceRangeUpdatedSignal signal = new TmfTraceRangeUpdatedSignal(trace, trace, range);
+        trace.broadcastAsync(signal);
+    }
+
+}
index c18248c945ea499f8223e9d2c79214467bd60441..fba8ceb4e3e0f602357ca894cb6df8fd15c9478a 100644 (file)
@@ -69,6 +69,7 @@ import org.eclipse.ui.IPropertyListener;
 import org.eclipse.ui.IReusableEditor;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.ide.IGotoMarker;
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.views.properties.IPropertySheetPage;
@@ -207,6 +208,12 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
             /* change the input to a FileEditorInput to allow open handlers to find this editor */
             super.setInput(new FileEditorInput(fFile));
             createAndInitializeTable();
+            // The table was swapped for a new one, make sure it gets focus if
+            // the editor is active. Otherwise, the new table will not get focus
+            // because the editor already had focus.
+            if (!PlatformUI.getWorkbench().isClosing() && PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart() == getSite().getPart()) {
+                fEventsTable.setFocus();
+            }
             fParent.layout();
         }
     }
@@ -228,6 +235,7 @@ public class TmfEventsEditor extends TmfEditor implements ITmfTraceEditor, IReus
         if (fTrace != null) {
             setPartName(fTrace.getName());
             fEventsTable = createEventsTable(fParent, fTrace.getCacheSize());
+            fEventsTable.registerContextMenus(getSite());
             fEventsTable.setColumnOrder(TmfTraceColumnManager.loadColumnOrder(fTrace.getTraceTypeId()));
             fEventsTable.addSelectionChangedListener(this);
             fEventsTable.setTrace(fTrace, true);
index 23aabf2ef88ec54e01f9fd234617b2522c9051e3..7786c3ff543cca39dce83e26bf68f0c0a8be9b04 100644 (file)
@@ -160,7 +160,9 @@ import org.eclipse.tracecompass.tmf.ui.views.colors.IColorSettingsListener;
 import org.eclipse.tracecompass.tmf.ui.views.filter.FilterManager;
 import org.eclipse.tracecompass.tmf.ui.widgets.rawviewer.TmfRawEventViewer;
 import org.eclipse.tracecompass.tmf.ui.widgets.virtualtable.TmfVirtualTable;
+import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartSite;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.commands.ICommandService;
 import org.eclipse.ui.dialogs.ListDialog;
@@ -2527,6 +2529,24 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorS
         fTable.setFocus();
     }
 
+    /**
+     * Registers context menus with a site for extension. This method can be
+     * called for part sites so that context menu contributions can be added.
+     *
+     * @param site
+     *            the site that the context menus will be registered for
+     *
+     * @since 2.0
+     */
+    public void registerContextMenus(IWorkbenchPartSite site) {
+        if (site instanceof IEditorSite) {
+            IEditorSite editorSite = (IEditorSite) site;
+            // Don't use the editor input when adding contributions, otherwise
+            // we get too many unwanted things.
+            editorSite.registerContextMenu(fTablePopupMenuManager, this, false);
+        }
+    }
+
     /**
      * Assign a new trace to this event table.
      *
This page took 0.031971 seconds and 5 git commands to generate.