diff --git a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java index d81d02e8f2..87b0dc8699 100644 --- a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java +++ b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java @@ -64,6 +64,7 @@ public class DataProviderManagerTest { private static TmfExperiment fExperiment; private static final Set EXPECTED_KERNEL_DP_DESCRIPTORS = new HashSet<>(); private static final Set EXPECTED_UST_DP_DESCRIPTORS = new HashSet<>(); + private static final Set EXPECTED_EXPERIMENT_SET = new HashSet<>(); private static final String SEGMENTSTORE_SCATTER_FUTEX_DP_ID = "org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:lttng.analysis.futex"; private static final String PATH = "/tmp/my-test.xml"; @@ -109,30 +110,12 @@ public class DataProviderManagerTest { .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreTableDataProvider:lttng.analysis.futex"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); - builder.setName("Futex Contention Analysis - Function Density") - .setDescription("Show function density provided by Analysis module: Futex Contention Analysis") - .setProviderType(ProviderType.TREE_TIME_XY) - .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.SegmentStoreDensityDataProvider:lttng.analysis.futex"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("Futex Contention Analysis - Latency vs Time") .setDescription("Show latencies provided by Analysis module: Futex Contention Analysis") .setProviderType(ProviderType.TREE_TIME_XY) .setId(SEGMENTSTORE_SCATTER_FUTEX_DP_ID); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); - builder.setName("Futex Contention Analysis - Priority/Thread name Statistics Table") - .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: Futex Contention Analysis") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:lttng.analysis.futex"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); - builder.setName("Futex Contention Analysis - Priority Statistics Table") - .setDescription("Show Priority Statistics Table provided by Analysis module: Futex Contention Analysis") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:lttng.analysis.futex"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("Histogram") .setDescription("Show a histogram of number of events to time for a trace") .setProviderType(ProviderType.TREE_TIME_XY) @@ -151,30 +134,12 @@ public class DataProviderManagerTest { .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreTableDataProvider:lttng.analysis.irq"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); - builder.setName("IRQ Analysis - Function Density") - .setDescription("Show function density provided by Analysis module: IRQ Analysis") - .setProviderType(ProviderType.TREE_TIME_XY) - .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.SegmentStoreDensityDataProvider:lttng.analysis.irq"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("IRQ Analysis - Latency vs Time") .setDescription("Show latencies provided by Analysis module: IRQ Analysis") .setProviderType(ProviderType.TREE_TIME_XY) .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:lttng.analysis.irq"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); - builder.setName("IRQ Analysis - Priority/Thread name Statistics Table") - .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: IRQ Analysis") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:lttng.analysis.irq"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); - builder.setName("IRQ Analysis - Priority Statistics Table") - .setDescription("Show Priority Statistics Table provided by Analysis module: IRQ Analysis") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:lttng.analysis.irq"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("Memory Usage") .setDescription("Show the relative memory usage in the Linux kernel by process, can be filtered to show only the processes which were active on a time range") .setProviderType(ProviderType.TREE_TIME_XY) @@ -199,30 +164,12 @@ public class DataProviderManagerTest { .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreTableDataProvider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); - builder.setName("System Call Latency - Function Density") - .setDescription("Show function density provided by Analysis module: System Call Latency") - .setProviderType(ProviderType.TREE_TIME_XY) - .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.SegmentStoreDensityDataProvider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("System Call Latency - Latency vs Time") .setDescription("Show latencies provided by Analysis module: System Call Latency") .setProviderType(ProviderType.TREE_TIME_XY) .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); - builder.setName("System Call Latency - Priority/Thread name Statistics Table") - .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: System Call Latency") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); - builder.setName("System Call Latency - Priority Statistics Table") - .setDescription("Show Priority Statistics Table provided by Analysis module: System Call Latency") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall"); - EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("Thread Status") .setDescription("Show the hierarchy of Linux threads and their status (RUNNING, SYSCALL, IRQ, IDLE)") .setProviderType(ProviderType.TIME_GRAPH) @@ -258,6 +205,12 @@ public class DataProviderManagerTest { .setProviderType(ProviderType.DATA_TREE) .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); + builder.setName("State System Explorer") + .setDescription("Displays the states of state system attributes over time") + .setProviderType(ProviderType.TIME_GRAPH) + .setId("org.eclipse.tracecompass.internal.tmf.core.statesystem.provider.StateSystemDataProvider"); + EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); // UST Trace builder = new DataProviderDescriptor.Builder(); @@ -302,31 +255,12 @@ public class DataProviderManagerTest { .setProviderType(ProviderType.TABLE) .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreTableDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack"); EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); - builder.setName("LTTng-UST CallStack - Function Density") - .setDescription("Show function density provided by Analysis module: LTTng-UST CallStack") - .setProviderType(ProviderType.TREE_TIME_XY) - .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.SegmentStoreDensityDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack"); - EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("LTTng-UST CallStack - Latency vs Time") .setDescription("Show latencies provided by Analysis module: LTTng-UST CallStack") .setProviderType(ProviderType.TREE_TIME_XY) .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack"); EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); - builder.setName("LTTng-UST CallStack - Priority/Thread name Statistics Table") - .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: LTTng-UST CallStack") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack"); - EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); - builder.setName("LTTng-UST CallStack - Priority Statistics Table") - .setDescription("Show Priority Statistics Table provided by Analysis module: LTTng-UST CallStack") - .setProviderType(ProviderType.DATA_TREE) - .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack"); - EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); - builder = new DataProviderDescriptor.Builder(); builder.setName("LTTng-UST CallStack (new) - Flame Chart") .setDescription("Show Flame Chart provided by Analysis module: LTTng-UST CallStack (new)") .setProviderType(ProviderType.TIME_GRAPH) @@ -352,6 +286,35 @@ public class DataProviderManagerTest { .setProviderType(ProviderType.GANTT_CHART) .setId("org.eclipse.tracecompass.analysis.profiling.core.flamegraph:org.eclipse.tracecompass.lttng2.ust.core.analysis.callstack"); EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); + builder.setName("State System Explorer") + .setDescription("Displays the states of state system attributes over time") + .setProviderType(ProviderType.TIME_GRAPH) + .setId("org.eclipse.tracecompass.internal.tmf.core.statesystem.provider.StateSystemDataProvider"); + EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); + + EXPECTED_EXPERIMENT_SET.addAll(EXPECTED_UST_DP_DESCRIPTORS); + EXPECTED_EXPERIMENT_SET.addAll(EXPECTED_KERNEL_DP_DESCRIPTORS); + // Additional Experiment Traces + builder = new DataProviderDescriptor.Builder(); + builder.setName("Event Matching Latency - Latency vs Time") + .setDescription("Show latencies provided by Analysis module: Event Matching Latency") + .setProviderType(ProviderType.TREE_TIME_XY) + .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.tracecompass.internal.analysis.timing.core.event.matching"); + EXPECTED_EXPERIMENT_SET.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); + builder.setName("Event Matching Latency - Latency Table") + .setDescription("Show latency table provided by Analysis module: Event Matching Latency") + .setProviderType(ProviderType.TABLE) + .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreTableDataProvider:org.eclipse.tracecompass.internal.analysis.timing.core.event.matching"); + EXPECTED_EXPERIMENT_SET.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); + builder.setName("Event Matching Latency - Latency Statistics") + .setDescription("Show latency statistics provided by Analysis module: Event Matching Latency") + .setProviderType(ProviderType.DATA_TREE) + .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreStatisticsDataProvider:org.eclipse.tracecompass.internal.analysis.timing.core.event.matching"); + EXPECTED_EXPERIMENT_SET.add(builder.build()); + } /** @@ -403,19 +366,16 @@ public static void tearDown() { @Test public void test() { List kernelDescriptors = DataProviderManager.getInstance().getAvailableProviders(fKernelTrace); + Set kernelDescriptorSet = new HashSet<>(kernelDescriptors); List ustDescriptors = DataProviderManager.getInstance().getAvailableProviders(fUstTrace); + Set ustDescriptorsSet = new HashSet<>(ustDescriptors); List expDescriptors = DataProviderManager.getInstance().getAvailableProviders(fExperiment); + Set expDescriptorsSet = new HashSet<>(expDescriptors); + + assertTrue(kernelDescriptorSet.equals(EXPECTED_KERNEL_DP_DESCRIPTORS)); + assertTrue(ustDescriptorsSet.equals(EXPECTED_UST_DP_DESCRIPTORS)); + assertTrue(expDescriptorsSet.equals(EXPECTED_EXPERIMENT_SET)); - // Verify kernel data provider descriptors - for (IDataProviderDescriptor descriptor : kernelDescriptors) { - assertTrue(expDescriptors.contains(descriptor)); - assertTrue(descriptor.getName(), EXPECTED_KERNEL_DP_DESCRIPTORS.contains(descriptor)); - } - // Verify UST data provider descriptors - for (IDataProviderDescriptor descriptor : ustDescriptors) { - assertTrue(expDescriptors.contains(descriptor)); - assertTrue(descriptor.getName(), EXPECTED_UST_DP_DESCRIPTORS.contains(descriptor)); - } } /** @@ -470,24 +430,24 @@ public void testGetterNew() { /** * Test different factory get methods */ - @Test - public void testFactoryMethods() { - ITmfTrace trace = fKernelTrace; - assertNotNull(trace); - Collection factories = DataProviderManager.getInstance().getFactories(); - assertNotNull(factories); - for (IDataProviderFactory factory : factories) { - Collection descs = factory.getDescriptors(trace); - for (IDataProviderDescriptor descriptor : descs) { - assertTrue(descriptor.getName(), EXPECTED_KERNEL_DP_DESCRIPTORS.contains(descriptor)); - } - } - IDataProviderFactory factory = DataProviderManager.getInstance().getFactory(SEGMENTSTORE_SCATTER_FUTEX_DP_ID); - assertNotNull(factory); - Collection descs = factory.getDescriptors(trace); - long count = descs.stream().filter(desc -> desc.getId().equals(SEGMENTSTORE_SCATTER_FUTEX_DP_ID)).count(); - assertEquals(1, count); - } + @Test + public void testFactoryMethods() { + ITmfTrace trace = fKernelTrace; + assertNotNull(trace); + Collection factories = DataProviderManager.getInstance().getFactories(); + assertNotNull(factories); + for (IDataProviderFactory factory : factories) { + Collection descs = factory.getDescriptors(trace); + for (IDataProviderDescriptor descriptor : descs) { + assertTrue(descriptor.getName(), EXPECTED_KERNEL_DP_DESCRIPTORS.contains(descriptor)); + } + } + IDataProviderFactory factory = DataProviderManager.getInstance().getFactory(SEGMENTSTORE_SCATTER_FUTEX_DP_ID); + assertNotNull(factory); + Collection descs = factory.getDescriptors(trace); + long count = descs.stream().filter(desc -> desc.getId().equals(SEGMENTSTORE_SCATTER_FUTEX_DP_ID)).count(); + assertEquals(1, count); + } /** * Test different factory add/remove methods @@ -515,34 +475,34 @@ public void testAddRemoveFactoryMethods() { /** * Test different data provider add/remove methods */ - @SuppressWarnings("unchecked") - @Test - public void testRemoveDataProviderMethods() { - String myId = "my-id"; - IDataProviderFactory testFactory = createCustomFactory(myId); - ITmfTrace trace = fKernelTrace; - assertNotNull(trace); - DataProviderManager.getInstance().addDataProviderFactory(myId, testFactory); - - ITimeGraphDataProvider dp = DataProviderManager.getInstance().getOrCreateDataProvider(trace, myId, ITimeGraphDataProvider.class); - assertNotNull(dp); - - List configDescriptors = DataProviderManager.getInstance().getAvailableProviders(trace, sfCconfig); - assertEquals(1, configDescriptors.size()); - assertEquals(myId, configDescriptors.get(0).getId()); - - // test remove by ID - DataProviderManager.getInstance().removeDataProvider(trace, myId); - assertNull(DataProviderManager.getInstance().getExistingDataProvider(trace, myId, ITimeGraphDataProvider.class)); - - // test remove by dp instance - dp = DataProviderManager.getInstance().getOrCreateDataProvider(trace, myId, ITimeGraphDataProvider.class); - assertNotNull(dp); - - assertTrue(DataProviderManager.getInstance().removeDataProvider(trace, dp)); - assertNull(DataProviderManager.getInstance().getExistingDataProvider(trace, myId, ITimeGraphDataProvider.class)); - DataProviderManager.getInstance().removeDataProviderFactory(myId); - } + @SuppressWarnings("unchecked") + @Test + public void testRemoveDataProviderMethods() { + String myId = "my-id"; + IDataProviderFactory testFactory = createCustomFactory(myId); + ITmfTrace trace = fKernelTrace; + assertNotNull(trace); + DataProviderManager.getInstance().addDataProviderFactory(myId, testFactory); + + ITimeGraphDataProvider dp = DataProviderManager.getInstance().getOrCreateDataProvider(trace, myId, ITimeGraphDataProvider.class); + assertNotNull(dp); + + List configDescriptors = DataProviderManager.getInstance().getAvailableProviders(trace, sfCconfig); + assertEquals(1, configDescriptors.size()); + assertEquals(myId, configDescriptors.get(0).getId()); + + // test remove by ID + DataProviderManager.getInstance().removeDataProvider(trace, myId); + assertNull(DataProviderManager.getInstance().getExistingDataProvider(trace, myId, ITimeGraphDataProvider.class)); + + // test remove by dp instance + dp = DataProviderManager.getInstance().getOrCreateDataProvider(trace, myId, ITimeGraphDataProvider.class); + assertNotNull(dp); + + assertTrue(DataProviderManager.getInstance().removeDataProvider(trace, dp)); + assertNull(DataProviderManager.getInstance().getExistingDataProvider(trace, myId, ITimeGraphDataProvider.class)); + DataProviderManager.getInstance().removeDataProviderFactory(myId); + } private static IDataProviderFactory createCustomFactory(@NonNull String myId) { return new IDataProviderFactory() { diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/Messages.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/Messages.java index dea830f1b6..723715b66c 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/Messages.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/Messages.java @@ -45,6 +45,12 @@ public class Messages extends NLS { /** Label for the "attribute path" column */ public static @Nullable String AttributePathColumnLabel; + /** Data Provider factory title */ + public static @Nullable String StateSystemDataProviderFactory_title; + + /** Data Provider factory help text */ + public static @Nullable String StateSystemDataProviderFactory_descriptionText; + static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProvider.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProvider.java index 7df702ada3..7110bbdd3c 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProvider.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProvider.java @@ -13,6 +13,7 @@ import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -26,7 +27,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Predicate; - +import com.google.common.collect.ImmutableMap; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -36,10 +37,16 @@ import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; +import org.eclipse.tracecompass.tmf.core.dataprovider.X11ColorUtils; import org.eclipse.tracecompass.tmf.core.model.AbstractTmfTraceDataProvider; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; +import org.eclipse.tracecompass.tmf.core.model.IOutputStyleProvider; +import org.eclipse.tracecompass.tmf.core.model.OutputElementStyle; +import org.eclipse.tracecompass.tmf.core.model.OutputStyleModel; +import org.eclipse.tracecompass.tmf.core.model.StyleProperties; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; +import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; @@ -47,12 +54,17 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; +import org.eclipse.tracecompass.tmf.core.presentation.IPaletteProvider; +import org.eclipse.tracecompass.tmf.core.presentation.RGBAColor; +import org.eclipse.tracecompass.tmf.core.presentation.RotatingPaletteProvider; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status; +import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.signal.TmfStartAnalysisSignal; import org.eclipse.tracecompass.tmf.core.statesystem.ITmfAnalysisModuleWithStateSystems; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment; import org.eclipse.tracecompass.tmf.core.util.Pair; import com.google.common.collect.HashBasedTable; @@ -70,8 +82,7 @@ * @author Loic Prieur-Drevon * */ -public class StateSystemDataProvider extends AbstractTmfTraceDataProvider implements ITimeGraphDataProvider<@NonNull TimeGraphEntryModel> { - +public class StateSystemDataProvider extends AbstractTmfTraceDataProvider implements ITimeGraphDataProvider<@NonNull TimeGraphEntryModel>, IOutputStyleProvider { /** * Extension point ID. */ @@ -107,6 +118,55 @@ public class StateSystemDataProvider extends AbstractTmfTraceDataProvider implem */ private final Set fStartedAnalysis = Objects.requireNonNull(ConcurrentHashMap.newKeySet()); + private static final String UNKNOWN = "Unknown"; //$NON-NLS-1$ + private static final String TRANSPARENT = "Transparent"; //$NON-NLS-1$ + + /** Number of colors used for State system time events */ + private static final int NUM_COLORS = 9; + + private static final String COLOR_UNKNOWN = X11ColorUtils.toHexColor(192, 192, 192); + + private static final @NonNull Map<@NonNull String, @NonNull OutputElementStyle> STYLE_MAP; + + static { + ImmutableMap.Builder<@NonNull String, @NonNull OutputElementStyle> builder = new ImmutableMap.Builder<>(); + IPaletteProvider palette = new RotatingPaletteProvider.Builder().setNbColors(NUM_COLORS).build(); + List colors = palette.get(); + for (int i = 0; i < colors.size(); i++) { + RGBAColor rgbaColor = colors.get(i); + String hexColor = X11ColorUtils.toHexColor(rgbaColor.getRed(), rgbaColor.getGreen(), rgbaColor.getBlue()); + Map map = ImmutableMap.of( + StyleProperties.BACKGROUND_COLOR, hexColor); + String key = Integer.toString(i); + OutputElementStyle outputStyle = new OutputElementStyle(null, map); + builder.put(key, outputStyle); + } + + builder.put(UNKNOWN, new OutputElementStyle(null, ImmutableMap.of(StyleProperties.BACKGROUND_COLOR, COLOR_UNKNOWN))); + builder.put(TRANSPARENT, new OutputElementStyle(null, ImmutableMap.of(StyleProperties.OPACITY, 0.0f))); + STYLE_MAP = builder.build(); + } + + private static final Comparator NAME_COMPARATOR = (a, b) -> { + if (a instanceof TraceEntryModel && b instanceof TraceEntryModel) { + ITmfTrace ta = ((TraceEntryModel) a).getTrace(); + ITmfTrace tb = ((TraceEntryModel) b).getTrace(); + // Puts the experiment entries at the top of the list + if (ta instanceof TmfExperiment && !(tb instanceof TmfExperiment)) { + return -1; + } else if (!(ta instanceof TmfExperiment) && (tb instanceof TmfExperiment)) { + return 1; + } + } + + try { + return Long.compare(Long.parseLong(a.getName()), Long.parseLong(b.getName())); + } catch (NumberFormatException e) { + // fall through to string compare + } + return a.getName().compareTo(b.getName()); + }; + /** * Constructor * @@ -184,7 +244,7 @@ private static String getQuarkValue(Map fetchParameters, ITmfSta return NonNullUtils.nullToEmptyString(valueString); } - private abstract static class EntryModelBuilder { + private abstract static class EntryModelBuilder { private final long fId; private final long fParentId; private final String fName; @@ -430,7 +490,7 @@ public AttributeEntryModel build() { * Quark */ protected AttributeEntryModel(long id, long parentId, String name, long start, long end, int quark) { - super(id, parentId, name, start, end, true); + super(id, parentId, Arrays.asList(name, Integer.toString(quark)), start, end, true); fQuark = quark; } @@ -455,11 +515,15 @@ public int getQuark() { return new TmfModelResponse<>(null, Status.CANCELLED, CommonStatusMessage.TASK_CANCELLED); } } - List entryList = buildEntryList(monitor); + List entryList = buildEntryList(monitor); + entryList.sort(NAME_COMPARATOR); Status status = fetchTreeIsComplete ? Status.COMPLETED : Status.RUNNING; String msg = fetchTreeIsComplete ? CommonStatusMessage.COMPLETED : CommonStatusMessage.RUNNING; - return new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), entryList), status, msg); + TmfTreeModel treeModel = new TmfTreeModel<>(new ArrayList<>(Arrays.asList(Messages.TreeNodeColumnLabel, Messages.QuarkColumnLabel)), entryList); + treeModel.setAutoExpandLevel(1); + + return new TmfModelResponse<>(treeModel, status, msg); } private boolean addTrace(@Nullable IProgressMonitor monitor) { @@ -708,7 +772,7 @@ private void waitForInitialization(ITmfTrace trace, ITmfAnalysisModuleWithStateS if (ssId != null && selectedItems.contains(ssId)) { TimeGraphRowModel ssRow = new TimeGraphRowModel(ssId, new ArrayList<>()); List<@NonNull ITimeGraphState> states = ssRow.getStates(); - states.add(new TimeGraphState(ss.getStartTime(), ss.getCurrentEndTime() - ss.getStartTime(), Integer.MAX_VALUE)); + states.add(new TimeGraphState(ss.getStartTime(), ss.getCurrentEndTime() - ss.getStartTime(), Integer.MAX_VALUE, null, new OutputElementStyle(TRANSPARENT))); rows.add(ssRow); } } @@ -722,6 +786,7 @@ private void waitForInitialization(ITmfTrace trace, ITmfAnalysisModuleWithStateS } } } + if (monitor != null && monitor.isCanceled()) { return new TmfModelResponse<>(null, Status.CANCELLED, CommonStatusMessage.TASK_CANCELLED); } @@ -734,7 +799,7 @@ private void waitForInitialization(ITmfTrace trace, ITmfAnalysisModuleWithStateS private static ITimeGraphRowModel getModuleRowModels(ModuleEntryModel module) { TimeGraphRowModel moduleRow = new TimeGraphRowModel(module.getId(), new ArrayList<>()); List<@NonNull ITimeGraphState> states = moduleRow.getStates(); - states.add(new TimeGraphState(module.getStartTime(), module.getEndTime() - module.getStartTime(), Integer.MAX_VALUE)); + states.add(new TimeGraphState(module.getStartTime(), module.getEndTime() - module.getStartTime(), Integer.MAX_VALUE, null, new OutputElementStyle(TRANSPARENT))); return moduleRow; } @@ -788,17 +853,22 @@ private static TimeGraphState getStateFromInterval(ITmfStateInterval statusInter long time = statusInterval.getStartTime(); long duration = Math.min(statusInterval.getEndTime(), currentEndTime - 1) + 1 - time; Object o = statusInterval.getValue(); + // Set style for States w/ or w/o labels + OutputElementStyle style = (o != null) + ? new OutputElementStyle(Integer.toString(Math.floorMod(String.valueOf(o).hashCode(), NUM_COLORS))) + : new OutputElementStyle(UNKNOWN); + if (o instanceof Integer) { - return new TimeGraphState(time, duration, ((Integer) o).intValue(), String.valueOf(o)); + return new TimeGraphState(time, duration, ((Integer) o).intValue(), String.valueOf(o), style); } else if (o instanceof Long) { long l = (long) o; - return new TimeGraphState(time, duration, (int) l, "0x" + Long.toHexString(l)); //$NON-NLS-1$ + return new TimeGraphState(time, duration, (int) l, "0x" + Long.toHexString(l), style); //$NON-NLS-1$ } else if (o instanceof String) { - return new TimeGraphState(time, duration, Integer.MIN_VALUE, (String) o); + return new TimeGraphState(time, duration, Integer.MIN_VALUE, (String) o, style); } else if (o instanceof Double) { - return new TimeGraphState(time, duration, ((Double) o).intValue()); + return new TimeGraphState(time, duration, ((Double) o).intValue(), null, style); } - return new TimeGraphState(time, duration, Integer.MIN_VALUE); + return new TimeGraphState(time, duration, Integer.MIN_VALUE, null, style); } /** @@ -815,4 +885,9 @@ public void startedAnalysisSignalHandler(ITmfAnalysisModuleWithStateSystems modu } } + @Override + public TmfModelResponse fetchStyle(Map fetchParameters, @Nullable IProgressMonitor monitor) { + return new TmfModelResponse<>(new OutputStyleModel(STYLE_MAP), ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + } + } \ No newline at end of file diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProviderFactory.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProviderFactory.java index c9e259de18..7e574ba5d8 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProviderFactory.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/StateSystemDataProviderFactory.java @@ -11,12 +11,22 @@ package org.eclipse.tracecompass.internal.tmf.core.statesystem.provider; +import java.util.Collection; +import java.util.Collections; +import java.util.Objects; + import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor; import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderFactory; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType; +import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TmfTimeGraphCompositeDataProvider; import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel; import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; +import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment; /** * Extension point factory for the {@link StateSystemDataProvider} @@ -25,9 +35,24 @@ */ public class StateSystemDataProviderFactory implements IDataProviderFactory { + private static final IDataProviderDescriptor DESCRIPTOR = new DataProviderDescriptor.Builder() + .setId(StateSystemDataProvider.ID) + .setName(Objects.requireNonNull(Messages.StateSystemDataProviderFactory_title)) + .setDescription(Objects.requireNonNull(Messages.StateSystemDataProviderFactory_descriptionText)) + .setProviderType(ProviderType.TIME_GRAPH) + .build(); + @Override public @Nullable ITmfTreeDataProvider createProvider(@NonNull ITmfTrace trace) { + if (trace instanceof TmfExperiment) { + return TmfTimeGraphCompositeDataProvider.create(TmfTraceManager.getTraceSet(trace), StateSystemDataProvider.ID); + } + return new StateSystemDataProvider(trace); } + @Override + public Collection getDescriptors(@NonNull ITmfTrace trace) { + return Collections.singletonList(DESCRIPTOR); + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/messages.properties b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/messages.properties index da664c28c1..c617cc81f2 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/messages.properties +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/statesystem/provider/messages.properties @@ -9,6 +9,8 @@ # SPDX-License-Identifier: EPL-2.0 ############################################################################### # Column names +StateSystemDataProviderFactory_title=State System Explorer +StateSystemDataProviderFactory_descriptionText=Displays the states of state system attributes over time TreeNodeColumnLabel=State System / Attribute QuarkColumnLabel=Quark ValueColumnLabel=Value