From 0bc1699102e3c302e3b0b6cf5b0a2d5950a6d5c1 Mon Sep 17 00:00:00 2001 From: Marc-Andre Laperle Date: Fri, 25 Sep 2015 19:52:27 -0400 Subject: [PATCH] tmf: Add command to manually refresh traces At the moment, only the events table will be refreshed. Change-Id: I7b9933d8e52e7e7fc821a3b41f1e688bf4c81d09 Signed-off-by: Marc-Andre Laperle Reviewed-on: https://git.eclipse.org/r/57137 Reviewed-by: Hudson CI Reviewed-by: Matthew Khouzam --- .../tracecompass/btf/core/trace/BtfTrace.java | 39 ++++++++++ .../core/parsers/custom/CustomTxtTrace.java | 29 +++++++ .../core/parsers/custom/CustomXmlTrace.java | 29 +++++++ .../tmf/core/trace/text/TextTrace.java | 29 +++++++ .../plugin.properties | 1 + .../plugin.xml | 64 ++++++++++++++++ .../handlers/RefreshTraceContentHandler.java | 76 +++++++++++++++++++ .../tmf/ui/editors/TmfEventsEditor.java | 8 ++ .../tmf/ui/viewers/events/TmfEventsTable.java | 20 +++++ 9 files changed, 295 insertions(+) create mode 100644 tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/handlers/RefreshTraceContentHandler.java diff --git a/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java b/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java index 1dc22f6f4e..ef796b9320 100644 --- a/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java +++ b/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java @@ -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); + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java index cf57aa41ff..b8f46052b4 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java @@ -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 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); + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java index bf3aa66822..8df4b1b105 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java @@ -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 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); + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java index 1e41e06688..bfd4a812d0 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java @@ -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 extends TmfTrace imple @Override public void initTrace(IResource resource, String path, Class 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 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 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); + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/plugin.properties b/tmf/org.eclipse.tracecompass.tmf.ui/plugin.properties index 4105a52c73..dc3acfa459 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/plugin.properties +++ b/tmf/org.eclipse.tracecompass.tmf.ui/plugin.properties @@ -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 diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/plugin.xml b/tmf/org.eclipse.tracecompass.tmf.ui/plugin.xml index 1328aa295a..b45d65a141 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/plugin.xml +++ b/tmf/org.eclipse.tracecompass.tmf.ui/plugin.xml @@ -961,6 +961,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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); + } + +} diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/editors/TmfEventsEditor.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/editors/TmfEventsEditor.java index c18248c945..fba8ceb4e3 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/editors/TmfEventsEditor.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/editors/TmfEventsEditor.java @@ -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); diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTable.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTable.java index 23aabf2ef8..7786c3ff54 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTable.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTable.java @@ -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. * -- 2.34.1