linux.core: Add priority statistics data provider factory

This commit creates a new data provider for the new priority statistics
analysis by extending the
AbstractSegmentStoreStatisticsDataProviderFactory class. The data
provider has a private class called PriorityStatisticsAnalysis
which specifies that entries for the priority statistics
analysis should be grouped by priority of each segment.

[Added] Data provider factory for priority statistics analysis

Change-Id: Id169d66c67337f653a7b503b456827db994b4f47
Signed-off-by: Hoang Thuan Pham <hoang.pham@calian.ca>
Reviewed-on: https://git.eclipse.org/r/c/tracecompass/org.eclipse.tracecompass/+/204774
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml
index d663007..d890596 100644
--- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml
+++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml
@@ -148,4 +148,11 @@
             id="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider">
       </dataProviderFactory>
    </extension>
+   <extension
+         point="org.eclipse.tracecompass.tmf.core.dataprovider">
+      <dataProviderFactory
+            class="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProviderFactory"
+            id="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider">
+      </dataProviderFactory>
+   </extension>
 </plugin>
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java
index e5e806d..6295531 100644
--- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java
+++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java
@@ -39,6 +39,23 @@
      */
     public static @Nullable String PriorityThreadNameStatisticsAnalysis_segmentType;
 
+    /**
+     * Name of the Priority statistics data provider
+     */
+    public static @Nullable String PriorityStatisticsDataProviderFactory_AnalysisName;
+    /**
+     * Title of the Priority statistics data provider
+     */
+    public static @Nullable String PriorityStatisticsDataProviderFactory_title;
+    /**
+     * Description of the Priority statistics data provider
+     */
+    public static @Nullable String PriorityStatisticsDataProviderFactory_description;
+    /**
+     * The segment type format of the PriorityStatisticsAnalysis
+     */
+    public static @Nullable String PriorityStatisticsAnalysis_segmentType;
+
     static {
         // initialize resource bundle
         NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/PriorityStatisticsDataProviderFactory.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/PriorityStatisticsDataProviderFactory.java
new file mode 100644
index 0000000..b4b8bac
--- /dev/null
+++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/PriorityStatisticsDataProviderFactory.java
@@ -0,0 +1,91 @@
+/**********************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ **********************************************************************/
+
+package org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore;
+
+import java.util.Objects;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.tracecompass.analysis.timing.core.segmentstore.GenericSegmentStatisticsAnalysis;
+import org.eclipse.tracecompass.analysis.timing.core.segmentstore.statistics.AbstractSegmentStatisticsAnalysis;
+import org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.AbstractSegmentStoreStatisticsDataProviderFactory;
+import org.eclipse.tracecompass.segmentstore.core.ISegment;
+import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
+import org.eclipse.tracecompass.tmf.core.component.DataProviderConstants;
+import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType;
+import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor;
+import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor.Builder;
+
+/**
+ * A data provider factory for Priority Statistics analysis.
+ *
+ * @author Hoang Thuan Pham
+ */
+public class PriorityStatisticsDataProviderFactory extends AbstractSegmentStoreStatisticsDataProviderFactory {
+    /**
+     * The data provider ID
+     */
+    public static final String DATA_PROVIDER_ID = "org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider"; //$NON-NLS-1$
+
+    /**
+     * A statistics analysis that groups entries based on the priority of each segment.
+     */
+    private final class PriorityStatisticsAnalysis extends GenericSegmentStatisticsAnalysis {
+        /**
+         * Constructor
+         *
+         * @param secondaryId The ID of the analysis which generates the segment store
+         */
+        private PriorityStatisticsAnalysis(String secondaryId) {
+            super(secondaryId);
+        }
+
+        @Override
+        protected @Nullable String getSegmentType(@NonNull ISegment segment) {
+            if (segment instanceof IPrioritySegment) {
+                // The segment type is the priority of the segment
+                return NLS.bind(Messages.PriorityStatisticsAnalysis_segmentType, ((IPrioritySegment) segment).getPriority());
+            }
+            return null;
+        }
+    }
+
+    @Override
+    protected AbstractSegmentStatisticsAnalysis getAnalysis(String analysisId) {
+        /**
+         * Return the {@link AbstractSegmentStatisticsAnalysis} that has the new
+         * getSegmentType logic to bind it to the data provider.
+         */
+        return new PriorityStatisticsAnalysis(analysisId);
+    }
+
+    @Override
+    protected String getDataProviderId() {
+        return DATA_PROVIDER_ID;
+    }
+
+    @Override
+    protected void setStatisticsAnalysisModuleName(AbstractSegmentStatisticsAnalysis statisticsAnalysisModule, IAnalysisModule baseAnalysisModule) {
+        statisticsAnalysisModule.setName(Objects.requireNonNull(NLS.bind(Messages.PriorityStatisticsDataProviderFactory_AnalysisName, baseAnalysisModule.getName())));
+    }
+
+    @Override
+    protected Builder getDataProviderDescriptor(IAnalysisModule analysis) {
+        DataProviderDescriptor.Builder builder = new DataProviderDescriptor.Builder();
+        builder.setId(DATA_PROVIDER_ID + DataProviderConstants.ID_SEPARATOR + analysis.getId())
+                .setName(Objects.requireNonNull(NLS.bind(Messages.PriorityStatisticsDataProviderFactory_title, analysis.getName())))
+                .setDescription(Objects.requireNonNull(NLS.bind(Messages.PriorityStatisticsDataProviderFactory_description, analysis.getHelpText())))
+                .setProviderType(ProviderType.DATA_TREE);
+        return builder;
+    }
+}
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties
index 1a8fc63..bc0d759 100644
--- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties
+++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties
@@ -13,3 +13,7 @@
 PriorityThreadNameStatisticsDataProviderFactory_title={0} - Priority/Thread name Statistics Table
 PriorityThreadNameStatisticsDataProviderFactory_description=Show Priority/Thread name Statistics Table provided by {0}
 PriorityThreadNameStatisticsAnalysis_segmentType=Prio: {0}; {1}
+PriorityStatisticsDataProviderFactory_AnalysisName=Priority Statistics for {0}
+PriorityStatisticsDataProviderFactory_title={0} - Priority Statistics Table
+PriorityStatisticsDataProviderFactory_description=Show Priority Statistics Table provided by {0}
+PriorityStatisticsAnalysis_segmentType=Prio: {0}
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 fb0fd44..417869c 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
@@ -104,6 +104,12 @@
                 .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)
@@ -140,6 +146,12 @@
                 .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)
@@ -182,6 +194,12 @@
                 .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)
@@ -211,6 +229,13 @@
                 .setProviderType(ProviderType.DATA_TREE)
                 .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws");
         EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
+        builder = new DataProviderDescriptor.Builder();
+        builder.setName("Scheduler Wakeup to Scheduler Switch Latency - Priority Statistics Table")
+                .setDescription("Show Priority Statistics Table provided by Analysis module: Scheduler Wakeup to Scheduler Switch Latency")
+                .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());
+
         // UST Trace
         builder = new DataProviderDescriptor.Builder();
         builder.setName("Events Table")
@@ -266,6 +291,12 @@
                 .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());
     }
 
     /**