Skip to content

Commit

Permalink
Bug 579175: tmf: Add API to get existing DP from DataProviderManager
Browse files Browse the repository at this point in the history
[Added] DataProviderManager#getOrCreateDataProvider()
[Added] DataProviderManager#getExistingDataProvider()
[Deprecated] DataProviderManager#getDataProvider()

Change-Id: I69eedd3769795a7f3c4d8bf6bbdeafd411182405
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/c/tracecompass/org.eclipse.tracecompass/+/191750
Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org>
Tested-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-by: Emmanouil Liolis <emmanouil.liolis@ericsson.com>
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
  • Loading branch information
bhufmann committed Mar 15, 2022
1 parent aa0fae6 commit cee48a6
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.builder.annotationPath.allLocations=disabled
org.eclipse.jdt.core.codeComplete.argumentPrefixes=
org.eclipse.jdt.core.codeComplete.argumentSuffixes=
org.eclipse.jdt.core.codeComplete.fieldPrefixes=f
Expand Down Expand Up @@ -27,6 +28,8 @@ org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
org.eclipse.jdt.core.compiler.problem.APILeak=warning
org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=error
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
Expand Down Expand Up @@ -101,11 +104,13 @@ org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=error
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=error
Expand All @@ -115,6 +120,7 @@ org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=disabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,15 @@

package org.eclipse.tracecompass.integration.core.tests.dataproviders;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.internal.tmf.core.model.DataProviderDescriptor;
import org.eclipse.tracecompass.lttng2.kernel.core.trace.LttngKernelTrace;
import org.eclipse.tracecompass.lttng2.lttng.kernel.core.tests.shared.LttngKernelTestTraceUtils;
Expand All @@ -27,6 +30,8 @@
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor;
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
import org.eclipse.tracecompass.tmf.core.model.xy.ITmfTreeXYDataProvider;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
Expand All @@ -47,13 +52,15 @@ public class DataProviderManagerTest {
private static final Set<IDataProviderDescriptor> EXPECTED_KERNEL_DP_DESCRIPTORS = new HashSet<>();
private static final Set<IDataProviderDescriptor> EXPECTED_UST_DP_DESCRIPTORS = new HashSet<>();

private static final String CPU_USAGE_DP_ID = "org.eclipse.tracecompass.analysis.os.linux.core.cpuusage.CpuUsageDataProvider";

static {
// Kernel Trace
DataProviderDescriptor.Builder builder = new DataProviderDescriptor.Builder();
builder.setName("CPU Usage")
.setDescription("Show the CPU usage of a Linux kernel trace, returns the CPU usage per process and can be filtered by CPU core")
.setProviderType(ProviderType.TREE_TIME_XY)
.setId("org.eclipse.tracecompass.analysis.os.linux.core.cpuusage.CpuUsageDataProvider");
.setId(CPU_USAGE_DP_ID);
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("Disk I/O View")
Expand Down Expand Up @@ -226,4 +233,24 @@ public void test() {
}
}

/**
* Test different get methods
*/
@SuppressWarnings("unchecked")
@Test
public void testGetter() {
ITmfTrace trace = fKernelTrace;
assertNotNull(trace);
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp = DataProviderManager.getInstance().getExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
assertNull(dp);
dp = DataProviderManager.getInstance().getOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
assertNotNull(dp);
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp2 = DataProviderManager.getInstance().getExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
assertNotNull(dp2);
assertTrue(dp == dp2);
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp3 = DataProviderManager.getInstance().getOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
assertNotNull(dp3);
assertTrue(dp == dp3);
assertTrue(dp == dp2);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,34 +115,57 @@ private void loadDataProviders() {
}

/**
* Get the data provider for the given trace.
* Get or creates the data provider for the given trace.
* <p>
* This method should never be called from within a {@link TmfSignalHandler}.
*
* @param trace
* The trace
* An instance of {@link ITmfTrace}.
* Note, that trace can be an instance of TmfExperiment, too.
* @param id
* Id of the data provider. This ID can be the concatenation of a
* provider ID + ':' + a secondary ID used to differentiate multiple
* instances of a same provider.
* @param dataProviderClass
* Returned data provider must extend this class
* @return Data provider
* @return the data provider or null if no data provider is found for the input parameter.
* @since 4.0
* @deprecated use {@link #getOrCreateDataProvider(ITmfTrace, String, Class)} instead
*/
@Deprecated
public synchronized @Nullable <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> T getDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
for (ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider : fInstances.get(trace)) {
if (id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass())) {
return dataProviderClass.cast(dataProvider);
}
return getOrCreateDataProvider(trace, id, dataProviderClass);
}

/**
* Gets or creates the data provider for the given trace.
* <p>
* This method should never be called from within a {@link TmfSignalHandler}.
*
* @param trace
* An instance of {@link ITmfTrace}.
* Note, that trace can be an instance of TmfExperiment, too.
* @param id
* Id of the data provider. This ID can be the concatenation of a
* provider ID + ':' + a secondary ID used to differentiate multiple
* instances of a same provider.
* @param dataProviderClass
* Returned data provider must extend this class
* @return the data provider or null if no data provider is found for the input parameter.
* @since 7.2
*/
public synchronized @Nullable <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> T getOrCreateDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider = getExistingDataProvider(trace, id, dataProviderClass);
if (dataProvider != null) {
return dataProviderClass.cast(dataProvider);
}
String[] ids = id.split(DataProviderConstants.ID_SEPARATOR, 2);
for (ITmfTrace opened : TmfTraceManager.getInstance().getOpenedTraces()) {
if (TmfTraceManager.getTraceSetWithExperiment(opened).contains(trace)) {
/* if this trace or an experiment containing this trace is opened */
IDataProviderFactory providerFactory = fDataProviderFactories.get(ids[0]);
if (providerFactory != null) {
ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider = ids.length > 1 ? providerFactory.createProvider(trace, String.valueOf(ids[1])) : providerFactory.createProvider(trace);
dataProvider = ids.length > 1 ? providerFactory.createProvider(trace, String.valueOf(ids[1])) : providerFactory.createProvider(trace);
if (dataProvider != null && id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass())) {
fInstances.put(trace, dataProvider);
return dataProviderClass.cast(dataProvider);
Expand All @@ -154,6 +177,34 @@ private void loadDataProviders() {
return null;
}

/**
* Get a data provider for the given trace if it already exists due to
* calling {@link #getOrCreateDataProvider(ITmfTrace, String, Class)} before.
*
* <p>
* This method should never be called from within a {@link TmfSignalHandler}.
*
* @param trace
* An instance of {@link ITmfTrace}.
* Note, that trace can be an instance of TmfExperiment, too.
* @param id
* Id of the data provider. This ID can be the concatenation of a
* provider ID + ':' + a secondary ID used to differentiate multiple
* instances of a same provider.
* @param dataProviderClass
* Returned data provider must extend this class
* @return the data provider or null
* @since 7.2
*/
public synchronized @Nullable <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> T getExistingDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
for (ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider : fInstances.get(trace)) {
if (id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass())) {
return dataProviderClass.cast(dataProvider);
}
}
return null;
}

/**
* Signal handler for the traceClosed signal.
*
Expand Down

0 comments on commit cee48a6

Please sign in to comment.