From b8585c7c525d47181d576c604b4a785ac8b37954 Mon Sep 17 00:00:00 2001 From: Alexandre Montplaisir Date: Thu, 27 Nov 2014 17:50:20 -0500 Subject: [PATCH] tmf: Add a TmfTraceUtils class for advanced getter methods For instance, the various getModuleFromClass() methods should not be part of the base interface, the trace should only expose a basic getter. The more fancy functions can however be implemented in a separate utility class. Change-Id: I8d957971abfbcc7e3afe81f5db2dba43cbebe84d Signed-off-by: Alexandre Montplaisir Reviewed-on: https://git.eclipse.org/r/37218 Tested-by: Hudson CI --- .../viewers/histogram/NewHistogramViewer.java | 3 +- .../cpuusage/LttngKernelCpuUsageAnalysis.java | 9 +- .../ui/views/cpuusage/CpuUsageComposite.java | 3 +- .../ui/views/cpuusage/CpuUsageXYViewer.java | 3 +- .../ui/views/memusage/MemoryUsageViewer.java | 3 +- .../xml/ui/views/xychart/XmlXYViewer.java | 5 +- .../ui/views/timegraph/XmlTimeGraphView.java | 5 +- .../tmf/core/tests/trace/AllTests.java | 3 +- .../core/tests/trace/TmfExperimentTest.java | 3 +- .../tmf/core/tests/trace/TmfTraceTest.java | 16 ++- .../core/tests/trace/TmfTraceUtilsTest.java | 114 ++++++++++++++++++ .../TmfStateSystemAnalysisModule.java | 3 +- .../tmf/core/trace/ITmfTrace.java | 35 +----- .../tracecompass/tmf/core/trace/TmfTrace.java | 31 ----- .../tmf/core/trace/TmfTraceUtils.java | 75 ++++++++++++ .../trace/experiment/TmfExperimentUtils.java | 3 +- .../tmf/pcap/ui/stream/StreamListView.java | 5 +- .../statistics/TmfStatisticsViewer.java | 3 +- .../tmf/ui/views/callstack/CallStackView.java | 3 +- .../statesystem/TmfStateSystemViewer.java | 3 +- 20 files changed, 238 insertions(+), 90 deletions(-) create mode 100644 org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceUtilsTest.java create mode 100644 org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java diff --git a/org.eclipse.tracecompass.examples/src/org/eclipse/tracecompass/examples/ui/viewers/histogram/NewHistogramViewer.java b/org.eclipse.tracecompass.examples/src/org/eclipse/tracecompass/examples/ui/viewers/histogram/NewHistogramViewer.java index aa4d0e37ca..61d0ba3e29 100644 --- a/org.eclipse.tracecompass.examples/src/org/eclipse/tracecompass/examples/ui/viewers/histogram/NewHistogramViewer.java +++ b/org.eclipse.tracecompass.examples/src/org/eclipse/tracecompass/examples/ui/viewers/histogram/NewHistogramViewer.java @@ -22,6 +22,7 @@ import org.eclipse.tracecompass.tmf.core.statistics.ITmfStatistics; import org.eclipse.tracecompass.tmf.core.statistics.TmfStatisticsModule; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.barcharts.TmfBarChartViewer; import org.swtchart.Chart; import org.swtchart.IAxis; @@ -75,7 +76,7 @@ public class NewHistogramViewer extends TmfBarChartViewer { for (ITmfTrace trace : TmfTraceManager.getTraceSet(getTrace())) { /* Retrieve the statistics object */ final TmfStatisticsModule statsMod = - trace.getAnalysisModuleOfClass(TmfStatisticsModule.class, TmfStatisticsModule.ID); + TmfTraceUtils.getAnalysisModuleOfClass(trace, TmfStatisticsModule.class, TmfStatisticsModule.ID); if (statsMod == null) { /* No statistics module available for this trace */ continue; diff --git a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/cpuusage/LttngKernelCpuUsageAnalysis.java b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/cpuusage/LttngKernelCpuUsageAnalysis.java index bc20ad202d..569b0fe71a 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/cpuusage/LttngKernelCpuUsageAnalysis.java +++ b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/cpuusage/LttngKernelCpuUsageAnalysis.java @@ -35,6 +35,7 @@ import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule; import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider; import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; /** * This analysis module computes the CPU usage of a system from a kernel trace. @@ -87,9 +88,11 @@ public class LttngKernelCpuUsageAnalysis extends TmfStateSystemAnalysisModule { * This analysis depends on the LTTng kernel analysis, so it's added to * dependent modules. */ - Iterable kernelModules = trace.getAnalysisModulesOfClass(LttngKernelAnalysis.class); - if (kernelModules.iterator().hasNext()) { - modules.add(kernelModules.iterator().next()); + Iterable kernelModules = TmfTraceUtils.getAnalysisModulesOfClass(trace, LttngKernelAnalysis.class); + for (LttngKernelAnalysis kernelModule : kernelModules) { + /* Only add the first one we find, if there is one */ + modules.add(kernelModule); + break; } return modules; } diff --git a/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java b/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java index c7dbf7252e..182e3c6e2a 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java +++ b/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java @@ -35,6 +35,7 @@ import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue; import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractTmfTreeViewer; import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider; import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeViewerEntry; @@ -194,7 +195,7 @@ public class CpuUsageComposite extends AbstractTmfTreeViewer { @Override public void initializeDataSource() { - fModule = getTrace().getAnalysisModuleOfClass(LttngKernelCpuUsageAnalysis.class, LttngKernelCpuUsageAnalysis.ID); + fModule = TmfTraceUtils.getAnalysisModuleOfClass(getTrace(), LttngKernelCpuUsageAnalysis.class, LttngKernelCpuUsageAnalysis.ID); if (fModule == null) { return; } diff --git a/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java b/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java index cf2ee31763..9b273a7d34 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java +++ b/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageXYViewer.java @@ -24,6 +24,7 @@ import org.eclipse.tracecompass.internal.lttng2.kernel.ui.Activator; import org.eclipse.tracecompass.lttng2.kernel.core.analysis.cpuusage.LttngKernelCpuUsageAnalysis; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXLineChartViewer; /** @@ -63,7 +64,7 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer { @Override protected void initializeDataSource() { if (getTrace() != null) { - fModule = getTrace().getAnalysisModuleOfClass(LttngKernelCpuUsageAnalysis.class, LttngKernelCpuUsageAnalysis.ID); + fModule = TmfTraceUtils.getAnalysisModuleOfClass(getTrace(), LttngKernelCpuUsageAnalysis.class, LttngKernelCpuUsageAnalysis.ID); if (fModule == null) { return; } diff --git a/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/views/memusage/MemoryUsageViewer.java b/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/views/memusage/MemoryUsageViewer.java index cf8a76bb69..3a51cd6357 100644 --- a/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/views/memusage/MemoryUsageViewer.java +++ b/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/views/memusage/MemoryUsageViewer.java @@ -29,6 +29,7 @@ import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeExcept import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException; import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue; import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXLineChartViewer; /** @@ -63,7 +64,7 @@ public class MemoryUsageViewer extends TmfCommonXLineChartViewer { @Override protected void initializeDataSource() { if (getTrace() != null) { - fModule = getTrace().getAnalysisModuleOfClass(TmfStateSystemAnalysisModule.class, UstMemoryAnalysisModule.ID); + fModule = TmfTraceUtils.getAnalysisModuleOfClass(getTrace(), TmfStateSystemAnalysisModule.class, UstMemoryAnalysisModule.ID); if (fModule == null) { return; } diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlXYViewer.java b/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlXYViewer.java index c69c722ab0..b102158df0 100644 --- a/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlXYViewer.java +++ b/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlXYViewer.java @@ -43,6 +43,7 @@ import org.eclipse.tracecompass.tmf.analysis.xml.core.stateprovider.TmfXmlString import org.eclipse.tracecompass.tmf.core.statesystem.ITmfAnalysisModuleWithStateSystems; import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXLineChartViewer; import org.w3c.dom.Element; @@ -337,12 +338,12 @@ public class XmlXYViewer extends TmfCommonXLineChartViewer { /* * No analysis specified, take all state system analysis modules */ - for (ITmfAnalysisModuleWithStateSystems module : trace.getAnalysisModulesOfClass(ITmfAnalysisModuleWithStateSystems.class)) { + for (ITmfAnalysisModuleWithStateSystems module : TmfTraceUtils.getAnalysisModulesOfClass(trace, ITmfAnalysisModuleWithStateSystems.class)) { stateSystemModules.add(module); } } else { for (String moduleId : analysisIds) { - ITmfAnalysisModuleWithStateSystems module = trace.getAnalysisModuleOfClass(ITmfAnalysisModuleWithStateSystems.class, moduleId); + ITmfAnalysisModuleWithStateSystems module = TmfTraceUtils.getAnalysisModuleOfClass(trace, ITmfAnalysisModuleWithStateSystems.class, moduleId); if (module != null) { stateSystemModules.add(module); } diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/tmf/analysis/xml/ui/views/timegraph/XmlTimeGraphView.java b/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/tmf/analysis/xml/ui/views/timegraph/XmlTimeGraphView.java index 2b99035d65..c11c40731f 100644 --- a/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/tmf/analysis/xml/ui/views/timegraph/XmlTimeGraphView.java +++ b/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/tmf/analysis/xml/ui/views/timegraph/XmlTimeGraphView.java @@ -50,6 +50,7 @@ import org.eclipse.tracecompass.tmf.core.statesystem.ITmfAnalysisModuleWithState import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractTimeGraphView; import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider2; import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ILinkEvent; @@ -253,12 +254,12 @@ public class XmlTimeGraphView extends AbstractTimeGraphView { /* * No analysis specified, take all state system analysis modules */ - for (ITmfAnalysisModuleWithStateSystems module : aTrace.getAnalysisModulesOfClass(ITmfAnalysisModuleWithStateSystems.class)) { + for (ITmfAnalysisModuleWithStateSystems module : TmfTraceUtils.getAnalysisModulesOfClass(aTrace, ITmfAnalysisModuleWithStateSystems.class)) { stateSystemModules.add(module); } } else { for (String moduleId : analysisIds) { - ITmfAnalysisModuleWithStateSystems module = aTrace.getAnalysisModuleOfClass(ITmfAnalysisModuleWithStateSystems.class, moduleId); + ITmfAnalysisModuleWithStateSystems module = TmfTraceUtils.getAnalysisModuleOfClass(aTrace, ITmfAnalysisModuleWithStateSystems.class, moduleId); if (module != null) { stateSystemModules.add(module); } diff --git a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/AllTests.java b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/AllTests.java index abc62de792..454f8a60e7 100644 --- a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/AllTests.java +++ b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/AllTests.java @@ -26,6 +26,7 @@ import org.junit.runners.Suite; TmfExperimentTest.class, TmfExperimentUtilsTest.class, TmfMultiTraceExperimentTest.class, - TmfTraceTest.class + TmfTraceTest.class, + TmfTraceUtilsTest.class }) public class AllTests {} \ No newline at end of file diff --git a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfExperimentTest.java b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfExperimentTest.java index 4b05e658d4..af6a2d3e52 100644 --- a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfExperimentTest.java +++ b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfExperimentTest.java @@ -44,6 +44,7 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment; import org.eclipse.tracecompass.tmf.core.trace.location.ITmfLocation; import org.eclipse.tracecompass.tmf.core.trace.location.TmfLongLocation; @@ -201,7 +202,7 @@ public class TmfExperimentTest { /* Open the experiment, the modules should be populated */ fExperiment.traceOpened(new TmfTraceOpenedSignal(this, fExperiment, null)); modules = fExperiment.getAnalysisModules(); - Iterable testModules = fExperiment.getAnalysisModulesOfClass(TestExperimentAnalysis.class); + Iterable testModules = TmfTraceUtils.getAnalysisModulesOfClass(fExperiment, TestExperimentAnalysis.class); assertTrue(modules.iterator().hasNext()); assertTrue(testModules.iterator().hasNext()); } diff --git a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceTest.java b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceTest.java index f81471baa7..c9ca107af4 100644 --- a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceTest.java +++ b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceTest.java @@ -34,8 +34,8 @@ import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule; import org.eclipse.tracecompass.tmf.core.component.ITmfEventProvider; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; -import org.eclipse.tracecompass.tmf.core.request.TmfEventRequest; import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType; +import org.eclipse.tracecompass.tmf.core.request.TmfEventRequest; import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal; import org.eclipse.tracecompass.tmf.core.tests.TmfCoreTestPlugin; @@ -439,7 +439,7 @@ public class TmfTraceTest { // ------------------------------------------------------------------------ @Test - public void testGetModulesByClass() { + public void testGetModules() { /* There should not be any modules at this point */ Iterable modules = fTrace.getAnalysisModules(); assertFalse(modules.iterator().hasNext()); @@ -448,22 +448,26 @@ public class TmfTraceTest { fTrace.traceOpened(new TmfTraceOpenedSignal(this, fTrace, null)); modules = fTrace.getAnalysisModules(); - Iterable testModules = fTrace.getAnalysisModulesOfClass(TestAnalysis.class); assertTrue(modules.iterator().hasNext()); - assertTrue(testModules.iterator().hasNext()); /* * Make sure all modules of type TestAnalysis are returned in the second * call */ + int count = 0; for (IAnalysisModule module : modules) { if (module instanceof TestAnalysis) { + count++; IAnalysisModule otherModule = fTrace.getAnalysisModule(module.getId()); assertNotNull(otherModule); - assertTrue(otherModule.equals(module)); + assertEquals(otherModule, module); } } - + /* + * FIXME: The exact count depends on the context the test is run (full + * test suite or this file only), but there must be at least 2 modules + */ + assertTrue(count >= 2); } // ------------------------------------------------------------------------ diff --git a/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceUtilsTest.java b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceUtilsTest.java new file mode 100644 index 0000000000..cf051a7692 --- /dev/null +++ b/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/trace/TmfTraceUtilsTest.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2014 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: + * Alexandre Montplaisir - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.tracecompass.tmf.core.tests.trace; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule; +import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; +import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager; +import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal; +import org.eclipse.tracecompass.tmf.core.tests.TmfCoreTestPlugin; +import org.eclipse.tracecompass.tmf.core.tests.analysis.AnalysisManagerTest; +import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestTrace; +import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; +import org.eclipse.tracecompass.tmf.tests.stubs.analysis.TestAnalysis; +import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test suite for {@link TmfTraceUtils} + */ +public class TmfTraceUtilsTest { + + private static final TmfTestTrace TEST_TRACE = TmfTestTrace.A_TEST_10K; + + private TmfTrace fTrace; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * Test setup + */ + @Before + public void setUp() { + try { + final URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(TEST_TRACE.getFullPath()), null); + final File test = new File(FileLocator.toFileURL(location).toURI()); + fTrace = new TmfTraceStub(test.toURI().getPath(), ITmfTrace.DEFAULT_TRACE_CACHE_SIZE, false, null); + TmfSignalManager.deregister(fTrace); + fTrace.indexTrace(true); + } catch (final TmfTraceException | URISyntaxException | IOException e) { + fail(e.getMessage()); + } + } + + /** + * Test cleanup + */ + @After + public void tearDown() { + fTrace.dispose(); + fTrace = null; + } + + // ------------------------------------------------------------------------ + // Test methods + // ------------------------------------------------------------------------ + + /** + * Test the {@link TmfTraceUtils#getAnalysisModuleOfClass} method. + */ + @Test + public void testGetModulesByClass() { + /* Open the trace, the modules should be populated */ + fTrace.traceOpened(new TmfTraceOpenedSignal(this, fTrace, null)); + + Iterable testModules = TmfTraceUtils.getAnalysisModulesOfClass(fTrace, TestAnalysis.class); + assertTrue(testModules.iterator().hasNext()); + + int count = 0; + for (TestAnalysis module : testModules) { + assertNotNull(module); + count++; + } + /* + * FIXME: The exact count depends on the context the test is run (full + * test suite or this file only), but there must be at least 2 modules + */ + assertTrue(count >= 2); + + TestAnalysis module = TmfTraceUtils.getAnalysisModuleOfClass(fTrace, TestAnalysis.class, AnalysisManagerTest.MODULE_PARAM); + assertNotNull(module); + IAnalysisModule traceModule = fTrace.getAnalysisModule(AnalysisManagerTest.MODULE_PARAM); + assertNotNull(traceModule); + assertEquals(module, traceModule); + + } +} diff --git a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/statesystem/TmfStateSystemAnalysisModule.java b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/statesystem/TmfStateSystemAnalysisModule.java index 28f04a1306..4bc675f859 100644 --- a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/statesystem/TmfStateSystemAnalysisModule.java +++ b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/statesystem/TmfStateSystemAnalysisModule.java @@ -45,6 +45,7 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.ITmfTraceCompleteness; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment; /** @@ -109,7 +110,7 @@ public abstract class TmfStateSystemAnalysisModule extends TmfAbstractAnalysisMo */ public static @Nullable ITmfStateSystem getStateSystem(ITmfTrace trace, String moduleId) { TmfStateSystemAnalysisModule module = - trace.getAnalysisModuleOfClass(TmfStateSystemAnalysisModule.class, moduleId); + TmfTraceUtils.getAnalysisModuleOfClass(trace, TmfStateSystemAnalysisModule.class, moduleId); if (module != null) { IStatus status = module.schedule(); if (status.isOK()) { diff --git a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/ITmfTrace.java b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/ITmfTrace.java index 15b491e1f3..aede3ca57d 100644 --- a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/ITmfTrace.java +++ b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/ITmfTrace.java @@ -243,46 +243,15 @@ public interface ITmfTrace extends ITmfEventProvider { * The analysis module ID * @return The {@link IAnalysisModule} object, or null if an analysis with * the given ID does no exist. - * @since 3.0 */ - @Nullable - IAnalysisModule getAnalysisModule(String id); + @Nullable IAnalysisModule getAnalysisModule(String id); /** * Get a list of all analysis modules currently available for this trace. * * @return An iterable view of the analysis modules - * @since 3.0 - */ - @NonNull - Iterable getAnalysisModules(); - - /** - * Get an analysis module belonging to this trace, with the specified ID and - * class. - * - * @param moduleClass - * Returned modules must extend this class - * @param id - * The ID of the analysis module - * @return The analysis module with specified class and ID, or null if no - * such module exists. - * @since 3.0 - */ - @Nullable - T getAnalysisModuleOfClass(Class moduleClass, String id); - - /** - * Return the analysis modules that are of a given class. Module are already - * casted to the requested class. - * - * @param moduleClass - * Returned modules must extend this class - * @return List of modules of class moduleClass - * @since 3.0 */ - @NonNull - Iterable getAnalysisModulesOfClass(Class moduleClass); + @NonNull Iterable getAnalysisModules(); // ------------------------------------------------------------------------ // Aspect getters diff --git a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTrace.java b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTrace.java index fd3b748114..07cc7d348e 100644 --- a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTrace.java +++ b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTrace.java @@ -22,7 +22,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import org.eclipse.core.resources.IResource; @@ -339,36 +338,6 @@ public abstract class TmfTrace extends TmfEventProvider implements ITmfTrace, IT } } - /** - * @since 3.0 - */ - @Override - public T getAnalysisModuleOfClass(Class moduleClass, String id) { - Iterable modules = getAnalysisModulesOfClass(moduleClass); - for (T module : modules) { - if (id.equals(module.getId())) { - return module; - } - } - return null; - } - - /** - * @since 3.0 - */ - @Override - public Iterable getAnalysisModulesOfClass(Class moduleClass) { - Set modules = new HashSet<>(); - synchronized (fAnalysisModules) { - for (Entry entry : fAnalysisModules.entrySet()) { - if (moduleClass.isAssignableFrom(entry.getValue().getClass())) { - modules.add(moduleClass.cast(entry.getValue())); - } - } - } - return modules; - } - @Override public Iterable getEventAspects() { /* By default we provide only the base aspects valid for all trace types */ diff --git a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java new file mode 100644 index 0000000000..e82bc76581 --- /dev/null +++ b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2014 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: + * Alexandre Montplaisir - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.tracecompass.tmf.core.trace; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule; + +/** + * Utility methods for ITmfTrace's. + * + * @author Alexandre Montplaisir + */ +public final class TmfTraceUtils { + + private TmfTraceUtils() {} + + /** + * Get an analysis module belonging to this trace, with the specified ID and + * class. + * + * @param trace + * The trace for which you want the modules + * @param moduleClass + * Returned modules must extend this class + * @param id + * The ID of the analysis module + * @return The analysis module with specified class and ID, or null if no + * such module exists. + */ + public static @Nullable T getAnalysisModuleOfClass(ITmfTrace trace, + Class moduleClass, String id) { + Iterable modules = getAnalysisModulesOfClass(trace, moduleClass); + for (T module : modules) { + if (id.equals(module.getId())) { + return module; + } + } + return null; + } + + /** + * Return the analysis modules that are of a given class. Module will be + * casted to the requested class. + * + * @param trace + * The trace for which you want the modules + * @param moduleClass + * Returned modules must extend this class + * @return List of modules of class moduleClass + */ + public static @NonNull Iterable getAnalysisModulesOfClass(ITmfTrace trace, Class moduleClass) { + Iterable analysisModules = trace.getAnalysisModules(); + Set modules = new HashSet<>(); + for (IAnalysisModule module : analysisModules) { + if (moduleClass.isAssignableFrom(module.getClass())) { + modules.add(moduleClass.cast(module)); + } + } + return modules; + } +} diff --git a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/experiment/TmfExperimentUtils.java b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/experiment/TmfExperimentUtils.java index 1695ad1032..74b8d0ee80 100644 --- a/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/experiment/TmfExperimentUtils.java +++ b/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/experiment/TmfExperimentUtils.java @@ -19,6 +19,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; /** * This utility class contains some utility methods to retrieve specific traces @@ -86,7 +87,7 @@ public final class TmfExperimentUtils { */ public static @Nullable T getAnalysisModuleOfClassForHost(TmfExperiment experiment, String hostId, Class moduleClass) { for (ITmfTrace trace : getTracesFromHost(experiment, hostId)) { - for (T module : trace.getAnalysisModulesOfClass(moduleClass)) { + for (T module : TmfTraceUtils.getAnalysisModulesOfClass(trace, moduleClass)) { return module; } } diff --git a/org.eclipse.tracecompass.tmf.pcap.ui/src/org/eclipse/tracecompass/internal/tmf/pcap/ui/stream/StreamListView.java b/org.eclipse.tracecompass.tmf.pcap.ui/src/org/eclipse/tracecompass/internal/tmf/pcap/ui/stream/StreamListView.java index 7c49d15406..7fed461c00 100644 --- a/org.eclipse.tracecompass.tmf.pcap.ui/src/org/eclipse/tracecompass/internal/tmf/pcap/ui/stream/StreamListView.java +++ b/org.eclipse.tracecompass.tmf.pcap.ui/src/org/eclipse/tracecompass/internal/tmf/pcap/ui/stream/StreamListView.java @@ -53,6 +53,7 @@ import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.project.model.TraceUtils; import org.eclipse.tracecompass.tmf.ui.views.TmfView; import org.eclipse.tracecompass.tmf.ui.views.filter.FilterManager; @@ -189,7 +190,7 @@ public class StreamListView extends TmfView { if (trace == null || (!(trace instanceof PcapTrace))) { return; } - StreamListAnalysis analysis = trace.getAnalysisModuleOfClass(StreamListAnalysis.class, StreamListAnalysis.ID); + StreamListAnalysis analysis = TmfTraceUtils.getAnalysisModuleOfClass(trace, StreamListAnalysis.class, StreamListAnalysis.ID); if (analysis == null) { return; } @@ -265,7 +266,7 @@ public class StreamListView extends TmfView { return; } - StreamListAnalysis analysis = trace.getAnalysisModuleOfClass(StreamListAnalysis.class, StreamListAnalysis.ID); + StreamListAnalysis analysis = TmfTraceUtils.getAnalysisModuleOfClass(trace, StreamListAnalysis.class, StreamListAnalysis.ID); if (analysis == null) { return; } diff --git a/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/statistics/TmfStatisticsViewer.java b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/statistics/TmfStatisticsViewer.java index 75f0772140..ba9a629954 100644 --- a/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/statistics/TmfStatisticsViewer.java +++ b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/statistics/TmfStatisticsViewer.java @@ -49,6 +49,7 @@ import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment; import org.eclipse.tracecompass.tmf.ui.TmfUiRefreshHandler; import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer; @@ -642,7 +643,7 @@ public class TmfStatisticsViewer extends TmfViewer { } /* Retrieve the statistics object */ - final TmfStatisticsModule statsMod = aTrace.getAnalysisModuleOfClass(TmfStatisticsModule.class, TmfStatisticsModule.ID); + final TmfStatisticsModule statsMod = TmfTraceUtils.getAnalysisModuleOfClass(aTrace, TmfStatisticsModule.class, TmfStatisticsModule.ID); if (statsMod == null) { /* No statistics module available for this trace */ continue; diff --git a/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/callstack/CallStackView.java b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/callstack/CallStackView.java index 3cde0c68b2..503e9a7719 100644 --- a/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/callstack/CallStackView.java +++ b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/callstack/CallStackView.java @@ -84,6 +84,7 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestampDelta; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.editors.ITmfTraceEditor; import org.eclipse.tracecompass.tmf.ui.views.TmfView; import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphContentProvider; @@ -1320,7 +1321,7 @@ public class CallStackView extends TmfView { * will search using the analysis type. */ Iterable modules = - trace.getAnalysisModulesOfClass(AbstractCallStackAnalysis.class); + TmfTraceUtils.getAnalysisModulesOfClass(trace, AbstractCallStackAnalysis.class); Iterator it = modules.iterator(); if (!it.hasNext()) { /* This trace does not provide a call-stack analysis */ diff --git a/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/statesystem/TmfStateSystemViewer.java b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/statesystem/TmfStateSystemViewer.java index 5bcd2718d9..462196d71b 100644 --- a/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/statesystem/TmfStateSystemViewer.java +++ b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/statesystem/TmfStateSystemViewer.java @@ -42,6 +42,7 @@ import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractTmfTreeViewer; import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider; import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeViewerEntry; @@ -206,7 +207,7 @@ public class TmfStateSystemViewer extends AbstractTmfTreeViewer { private static TmfTreeViewerEntry createTraceEntry(ITmfTrace trace) { TmfTreeViewerEntry traceEntry = new TmfTreeViewerEntry(trace.getName()); - Iterable modules = trace.getAnalysisModulesOfClass(ITmfAnalysisModuleWithStateSystems.class); + Iterable modules = TmfTraceUtils.getAnalysisModulesOfClass(trace, ITmfAnalysisModuleWithStateSystems.class); for (ITmfAnalysisModuleWithStateSystems module : modules) { /* Just schedule the module, the data will be filled when available */ module.schedule(); -- 2.34.1