Skip to content

Commit 47b356a

Browse files
committed
tmf.core: Introduce base data provider ITmfDataProvider interface
Add methods in IDataProviderFactory to create provider returning only this new ITmfDataProvider interface. Deprecate existing createDataProvider methods in IDataProviderFactory. Add new methods to fetch and create data providers implementing ITmfDataProvider interface. Deprecate existing get and create methods for data providers in DataProviderManager. [Added] base data provider ITmfDataProvider interface [Added] IDataProviderFactory.create(ITmfTrace) [Added] IDataProviderFactory.create(ITmfTrace, String) [Added] DataProviderManager.fetchExistingDataProvider(ITmfTrace, String, Class) [Added] DataProviderManager.fetchOrCreateDataProvider(ITmfTrace, String, Class) [Deprecated] IDataProviderFactory.createProvider(ITmfTrace) [Deprecated] IDataProviderFactory.createProvider(ITmfTrace, String) [Deprecated] DataProviderManager.getExistingDataProvider(ITmfTrace, String, Class) [Deprecated] DataProviderManager.getOrCreateDataProvider(ITmfTrace, String, Class) Signed-off-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
1 parent 212fcef commit 47b356a

File tree

5 files changed

+121
-91
lines changed

5 files changed

+121
-91
lines changed

releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -415,17 +415,45 @@ public void test() {
415415
public void testGetter() {
416416
ITmfTrace trace = fKernelTrace;
417417
assertNotNull(trace);
418-
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp = DataProviderManager.getInstance().getExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
419-
assertNull(dp);
420-
dp = DataProviderManager.getInstance().getOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
421-
assertNotNull(dp);
422-
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp2 = DataProviderManager.getInstance().getExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
423-
assertNotNull(dp2);
424-
assertTrue(dp == dp2);
425-
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp3 = DataProviderManager.getInstance().getOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
426-
assertNotNull(dp3);
427-
assertTrue(dp == dp3);
428-
assertTrue(dp == dp2);
418+
try {
419+
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp = DataProviderManager.getInstance().getExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
420+
assertNull(dp);
421+
dp = DataProviderManager.getInstance().getOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
422+
assertNotNull(dp);
423+
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp2 = DataProviderManager.getInstance().getExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
424+
assertNotNull(dp2);
425+
assertTrue(dp == dp2);
426+
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp3 = DataProviderManager.getInstance().getOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
427+
assertNotNull(dp3);
428+
assertTrue(dp == dp3);
429+
assertTrue(dp == dp2);
430+
} finally {
431+
DataProviderManager.getInstance().removeDataProvider(trace, CPU_USAGE_DP_ID);
432+
}
433+
}
434+
435+
/**
436+
* Test different get methods
437+
*/
438+
@Test
439+
public void testGetterNew() {
440+
ITmfTrace trace = fKernelTrace;
441+
assertNotNull(trace);
442+
try {
443+
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp = DataProviderManager.getInstance().fetchExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
444+
assertNull(dp);
445+
dp = DataProviderManager.getInstance().fetchOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
446+
assertNotNull(dp);
447+
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp2 = DataProviderManager.getInstance().fetchExistingDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
448+
assertNotNull(dp2);
449+
assertTrue(dp == dp2);
450+
ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> dp3 = DataProviderManager.getInstance().fetchOrCreateDataProvider(trace, CPU_USAGE_DP_ID, ITmfTreeXYDataProvider.class);
451+
assertNotNull(dp3);
452+
assertTrue(dp == dp3);
453+
assertTrue(dp == dp2);
454+
} finally {
455+
DataProviderManager.getInstance().removeDataProvider(trace, CPU_USAGE_DP_ID);
456+
}
429457
}
430458

431459
/**

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/DataProviderManager.java

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -220,33 +220,12 @@ private void loadHiddenDataProviders() {
220220
* @return the data provider or null if no data provider is found for the
221221
* input parameter.
222222
* @since 8.0
223+
*
224+
* @deprecated As of version 9.7, use {@link #fetchOrCreateDataProvider(ITmfTrace, String, Class)} instead
223225
*/
226+
@Deprecated(since = "9.7", forRemoval = true)
224227
public synchronized @Nullable <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> T getOrCreateDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
225-
ITmfDataProvider dataProvider = getExistingDataProvider(trace, id, dataProviderClass);
226-
if (dataProvider != null) {
227-
return dataProviderClass.cast(dataProvider);
228-
}
229-
if (isHidden(id, trace)) {
230-
return null;
231-
}
232-
String[] ids = id.split(DataProviderConstants.ID_SEPARATOR, 2);
233-
for (ITmfTrace opened : TmfTraceManager.getInstance().getOpenedTraces()) {
234-
if (TmfTraceManager.getTraceSetWithExperiment(opened).contains(trace)) {
235-
/*
236-
* if this trace or an experiment containing it is opened
237-
*/
238-
IDataProviderFactory providerFactory = fDataProviderFactories.get(ids[0]);
239-
if (providerFactory != null) {
240-
dataProvider = ids.length > 1 ? providerFactory.createProvider(trace, String.valueOf(ids[1])) : providerFactory.createProvider2(trace);
241-
if (dataProvider != null && id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass())) {
242-
fInstances.put(trace, dataProvider);
243-
return dataProviderClass.cast(dataProvider);
244-
}
245-
}
246-
return null;
247-
}
248-
}
249-
return null;
228+
return fetchOrCreateDataProvider(trace, id, dataProviderClass);
250229
}
251230

252231
/**
@@ -262,14 +241,16 @@ private void loadHiddenDataProviders() {
262241
* Id of the data provider. This ID can be the concatenation of a
263242
* provider ID + ':' + a secondary ID used to differentiate
264243
* multiple instances of a same provider.
244+
* @param dataProviderClass
245+
* Returned data provider must extend this class
265246
* @return the data provider or null if no data provider is found for the
266247
* input parameter.
267-
* @since 9.5
248+
* @since 9.7
268249
*/
269-
public synchronized @Nullable ITmfDataProvider getOrCreateDataProvider(@NonNull ITmfTrace trace, String id) {
270-
ITmfDataProvider dataProvider = getExistingDataProvider(trace, id);
250+
public synchronized @Nullable <T extends ITmfDataProvider> T fetchOrCreateDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
251+
ITmfDataProvider dataProvider = fetchExistingDataProvider(trace, id, dataProviderClass);
271252
if (dataProvider != null) {
272-
return dataProvider;
253+
return dataProviderClass.cast(dataProvider);
273254
}
274255
String[] ids = id.split(DataProviderConstants.ID_SEPARATOR, 2);
275256
for (ITmfTrace opened : TmfTraceManager.getInstance().getOpenedTraces()) {
@@ -279,10 +260,10 @@ private void loadHiddenDataProviders() {
279260
*/
280261
IDataProviderFactory providerFactory = fDataProviderFactories.get(ids[0]);
281262
if (providerFactory != null) {
282-
dataProvider = ids.length > 1 ? providerFactory.createProvider(trace, String.valueOf(ids[1])) : providerFactory.createProvider2(trace);
283-
if (dataProvider != null && id.equals(dataProvider.getId())) {
263+
dataProvider = ids.length > 1 ? providerFactory.createDataProvider(trace, String.valueOf(ids[1])) : providerFactory.createDataProvider(trace);
264+
if (dataProvider != null && id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass())) {
284265
fInstances.put(trace, dataProvider);
285-
return dataProvider;
266+
return dataProviderClass.cast(dataProvider);
286267
}
287268
}
288269
return null;
@@ -291,7 +272,6 @@ private void loadHiddenDataProviders() {
291272
return null;
292273
}
293274

294-
295275
/**
296276
* Get a data provider for the given trace if it already exists due to
297277
* calling {@link #getOrCreateDataProvider(ITmfTrace, String, Class)}
@@ -312,19 +292,16 @@ private void loadHiddenDataProviders() {
312292
* Returned data provider must extend this class
313293
* @return the data provider or null
314294
* @since 8.0
295+
* @deprecated As of version 9.7, use {@link #fetchExistingDataProvider(ITmfTrace, String, Class)} instead
315296
*/
297+
@Deprecated(since = "9.7", forRemoval = true)
316298
public synchronized @Nullable <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> T getExistingDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
317-
for (ITmfDataProvider dataProvider : fInstances.get(trace)) {
318-
if (id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass()) && !isHidden(id, trace)) {
319-
return dataProviderClass.cast(dataProvider);
320-
}
321-
}
322-
return null;
299+
return fetchExistingDataProvider(trace, id, dataProviderClass);
323300
}
324301

325302
/**
326303
* Get a data provider for the given trace if it already exists due to
327-
* calling {@link #getOrCreateDataProvider(ITmfTrace, String)}
304+
* calling {@link #fetchOrCreateDataProvider(ITmfTrace, String, Class)}
328305
* before.
329306
*
330307
* <p>
@@ -338,13 +315,15 @@ private void loadHiddenDataProviders() {
338315
* Id of the data provider. This ID can be the concatenation of a
339316
* provider ID + ':' + a secondary ID used to differentiate
340317
* multiple instances of a same provider.
318+
* @param dataProviderClass
319+
* Returned data provider must extend this class
341320
* @return the data provider or null
342-
* @since 9.5
321+
* @since 9.7
343322
*/
344-
public synchronized @Nullable ITmfDataProvider getExistingDataProvider(@NonNull ITmfTrace trace, String id) {
323+
public synchronized @Nullable <T extends ITmfDataProvider> T fetchExistingDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
345324
for (ITmfDataProvider dataProvider : fInstances.get(trace)) {
346-
if (id.equals(dataProvider.getId())) {
347-
return dataProvider;
325+
if (id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass()) && !isHidden(id, trace)) {
326+
return dataProviderClass.cast(dataProvider);
348327
}
349328
}
350329
return null;

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderFactory.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2017 Ericsson
2+
* Copyright (c) 2017, 2025 Ericsson
33
*
44
* All rights reserved. This program and the accompanying materials are made
55
* available under the terms of the Eclipse Public License 2.0 which
@@ -41,26 +41,28 @@ public interface IDataProviderFactory extends IAdaptable {
4141
* A trace
4242
* @return {@link ITmfTreeDataProvider} that can be use for the given trace
4343
* @since 4.0
44+
* @deprecated As of version 9.7, use {@link #createDataProvider(ITmfTrace)} instead
4445
*/
45-
@Nullable default ITmfTreeDataProvider<? extends ITmfTreeDataModel> createProvider(@NonNull ITmfTrace trace){
46+
@Deprecated(since = "9.7", forRemoval = true)
47+
@Nullable default ITmfTreeDataProvider<? extends ITmfTreeDataModel> createProvider(@NonNull ITmfTrace trace) {
4648
return null;
4749
}
4850

4951
/**
50-
* Create a {@link ITmfDataProvider} for the given trace. If this factory
52+
* Create a {@link ITmfDataProvider} for the given trace. If this factory
5153
* does not know how to handle the given trace it will return null
5254
*
5355
* @param trace
5456
* A trace
5557
* @return {@link ITmfDataProvider} that can be use for the given trace
56-
* @since 9.5
58+
* @since 9.7
5759
*/
58-
@Nullable default ITmfDataProvider createProvider2(@NonNull ITmfTrace trace) {
59-
return null;
60+
@Nullable default ITmfDataProvider createDataProvider(@NonNull ITmfTrace trace) {
61+
return createProvider(trace);
6062
}
6163

6264
/**
63-
* Create a {@link ITmfTreeDataProvider} for the given trace. If this factory
65+
D * Create a {@link ITmfTreeDataProvider} for the given trace. If this factory
6466
* does not know how to handle the given trace it will return null. The
6567
* resulting provider should have an ID that is an aggregate of the provider's
6668
* own ID and the secondaryId as such: <provider ID>:<secondaryId>
@@ -75,7 +77,9 @@ public interface IDataProviderFactory extends IAdaptable {
7577
* ID <provider ID>:<secondaryId>, or <code>null</code> if no provider
7678
* is available for this trace and ID
7779
* @since 4.0
80+
* @deprecated As of version 9.7, use {@link #createDataProvider(ITmfTrace)} instead
7881
*/
82+
@Deprecated(since = "9.7", forRemoval = true)
7983
default @Nullable ITmfTreeDataProvider<? extends ITmfTreeDataModel> createProvider(@NonNull ITmfTrace trace, @NonNull String secondaryId) {
8084
return createProvider(trace);
8185
}
@@ -95,10 +99,10 @@ public interface IDataProviderFactory extends IAdaptable {
9599
* @return {@link ITmfDataProvider} that can be use for the given trace with
96100
* ID <provider ID>:<secondaryId>, or <code>null</code> if no provider
97101
* is available for this trace and ID
98-
* @since 9.5
102+
* @since 9.7
99103
*/
100-
default @Nullable ITmfDataProvider createProvider2(@NonNull ITmfTrace trace, @NonNull String secondaryId) {
101-
return createProvider2(trace);
104+
default @Nullable ITmfDataProvider createDataProvider(@NonNull ITmfTrace trace, @NonNull String secondaryId) {
105+
return createProvider(trace, secondaryId);
102106
}
103107

104108
/**

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/ITmfDataProvider.java

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,52 @@
1111

1212
package org.eclipse.tracecompass.tmf.core.model;
1313

14-
import java.util.Map;
15-
16-
import org.eclipse.core.runtime.IProgressMonitor;
17-
import org.eclipse.jdt.annotation.Nullable;
18-
import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
19-
2014
/**
21-
* Provider for arbitrary data
15+
* Base interface that each data provider has to implement.
16+
*
17+
* Each data provider needs to provide at least one fetch method, that is
18+
* typical for this data provider type and which returns @link TmfModelResponse}
19+
* with a defined serializable model.
20+
*
21+
* <p>
22+
* Example interface:
23+
* <pre>{@code
24+
* public ICustomDataProvider implements ITmfDataProvider {
25+
* TmfModelResponse<CustomModel> fetchCustomData(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor);
26+
* }
27+
* }</pre>
28+
* </p>
29+
* Example implementation:
30+
* <pre>{@code
31+
* public class CustomModel {
32+
* private final String fValue = value;
33+
* public CustomModel(String value) {
34+
* fValue = value;
35+
* }
36+
* String getValue() {
37+
* return fValue;
38+
* }
39+
* }
40+
*
41+
* public class CustomDataProvider implements ICustomDataProvider {
42+
* // ITmfDataProvider
43+
* public String getId() {
44+
* return "customId";
45+
* }
46+
* public void dispose() {}
47+
*
48+
* // ICustomDataProvider
49+
* TmfModelResponse<CustomModel> fetchCustomData(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
50+
* CustomModel model = new CustomModel("my data");
51+
* return new TmfModelResponse<>(model, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
52+
* }
53+
* }
54+
* }</pre>
55+
*
56+
*
57+
* @since 9.7
58+
* @author Matthew Khouzam
59+
* @auther Bernd Hufmann
2260
*
2361
*/
2462
public interface ITmfDataProvider {
@@ -29,20 +67,6 @@ public interface ITmfDataProvider {
2967
*/
3068
String getId();
3169

32-
/*
33-
* Do stuff, sometimes. Then, it returns a {@link TmfModelResponse} that
34-
* contains the model. Tree model will be used by tree viewer to show
35-
* entries as a tree or flat hierarchy
36-
*
37-
* @param fetchParameters A query filter that contains an array of time.
38-
* Times are used for requesting data.
39-
*
40-
* @param monitor A ProgressMonitor to cancel task
41-
*
42-
* @return A {@link TmfModelResponse} instance
43-
*/
44-
TmfModelResponse<?> fetchData(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor);
45-
4670
/**
4771
* Dispose of the provider to avoid resource leakage.
4872
*/

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/tree/ITmfTreeDataProvider.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ public interface ITmfTreeDataProvider<T extends ITmfTreeDataModel> extends ITmfD
4343
* @since 5.0
4444
*/
4545
TmfModelResponse<TmfTreeModel<T>> fetchTree(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor);
46-
47-
@Override
48-
default TmfModelResponse<?> fetchData(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
49-
return fetchTree(fetchParameters, monitor);
50-
}
5146
}
5247

5348

0 commit comments

Comments
 (0)