Skip to content

Commit 212fcef

Browse files
tmf.core: Introduce arbitrary/abstract data provider
This is a base class introducing the getData wit no generics. Serializability is done by contract, it is not enforced in the code. [Added] Abstract Data Provider Change-Id: I5b37b5c509818cd59a72daa23899d63d2352301f Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
1 parent df23f23 commit 212fcef

4 files changed

Lines changed: 178 additions & 24 deletions

File tree

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

Lines changed: 81 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.eclipse.tracecompass.internal.tmf.core.Activator;
4646
import org.eclipse.tracecompass.tmf.core.component.DataProviderConstants;
4747
import org.eclipse.tracecompass.tmf.core.config.ITmfConfiguration;
48+
import org.eclipse.tracecompass.tmf.core.model.ITmfDataProvider;
4849
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
4950
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider;
5051
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
@@ -88,7 +89,7 @@ public class DataProviderManager {
8889
private Multimap<String, Pattern> fHideDataProviders = HashMultimap.create();
8990
private Multimap<String, Pattern> fShowDataProviders = HashMultimap.create();
9091

91-
private final Multimap<ITmfTrace, ITmfTreeDataProvider<? extends ITmfTreeDataModel>> fInstances = LinkedHashMultimap.create();
92+
private final Multimap<ITmfTrace, ITmfDataProvider> fInstances = LinkedHashMultimap.create();
9293

9394
/**
9495
* Get the instance of the manager
@@ -221,7 +222,7 @@ private void loadHiddenDataProviders() {
221222
* @since 8.0
222223
*/
223224
public synchronized @Nullable <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> T getOrCreateDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
224-
ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider = getExistingDataProvider(trace, id, dataProviderClass);
225+
ITmfDataProvider dataProvider = getExistingDataProvider(trace, id, dataProviderClass);
225226
if (dataProvider != null) {
226227
return dataProviderClass.cast(dataProvider);
227228
}
@@ -236,7 +237,7 @@ private void loadHiddenDataProviders() {
236237
*/
237238
IDataProviderFactory providerFactory = fDataProviderFactories.get(ids[0]);
238239
if (providerFactory != null) {
239-
dataProvider = ids.length > 1 ? providerFactory.createProvider(trace, String.valueOf(ids[1])) : providerFactory.createProvider(trace);
240+
dataProvider = ids.length > 1 ? providerFactory.createProvider(trace, String.valueOf(ids[1])) : providerFactory.createProvider2(trace);
240241
if (dataProvider != null && id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass())) {
241242
fInstances.put(trace, dataProvider);
242243
return dataProviderClass.cast(dataProvider);
@@ -248,6 +249,49 @@ private void loadHiddenDataProviders() {
248249
return null;
249250
}
250251

252+
/**
253+
* Gets or creates the data provider for the given trace.
254+
* <p>
255+
* This method should never be called from within a
256+
* {@link TmfSignalHandler}.
257+
*
258+
* @param trace
259+
* An instance of {@link ITmfTrace}. Note, that trace can be an
260+
* instance of TmfExperiment, too.
261+
* @param id
262+
* Id of the data provider. This ID can be the concatenation of a
263+
* provider ID + ':' + a secondary ID used to differentiate
264+
* multiple instances of a same provider.
265+
* @return the data provider or null if no data provider is found for the
266+
* input parameter.
267+
* @since 9.5
268+
*/
269+
public synchronized @Nullable ITmfDataProvider getOrCreateDataProvider(@NonNull ITmfTrace trace, String id) {
270+
ITmfDataProvider dataProvider = getExistingDataProvider(trace, id);
271+
if (dataProvider != null) {
272+
return dataProvider;
273+
}
274+
String[] ids = id.split(DataProviderConstants.ID_SEPARATOR, 2);
275+
for (ITmfTrace opened : TmfTraceManager.getInstance().getOpenedTraces()) {
276+
if (TmfTraceManager.getTraceSetWithExperiment(opened).contains(trace)) {
277+
/*
278+
* if this trace or an experiment containing it is opened
279+
*/
280+
IDataProviderFactory providerFactory = fDataProviderFactories.get(ids[0]);
281+
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())) {
284+
fInstances.put(trace, dataProvider);
285+
return dataProvider;
286+
}
287+
}
288+
return null;
289+
}
290+
}
291+
return null;
292+
}
293+
294+
251295
/**
252296
* Get a data provider for the given trace if it already exists due to
253297
* calling {@link #getOrCreateDataProvider(ITmfTrace, String, Class)}
@@ -270,14 +314,42 @@ private void loadHiddenDataProviders() {
270314
* @since 8.0
271315
*/
272316
public synchronized @Nullable <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> T getExistingDataProvider(@NonNull ITmfTrace trace, String id, Class<T> dataProviderClass) {
273-
for (ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider : fInstances.get(trace)) {
317+
for (ITmfDataProvider dataProvider : fInstances.get(trace)) {
274318
if (id.equals(dataProvider.getId()) && dataProviderClass.isAssignableFrom(dataProvider.getClass()) && !isHidden(id, trace)) {
275319
return dataProviderClass.cast(dataProvider);
276320
}
277321
}
278322
return null;
279323
}
280324

325+
/**
326+
* Get a data provider for the given trace if it already exists due to
327+
* calling {@link #getOrCreateDataProvider(ITmfTrace, String)}
328+
* before.
329+
*
330+
* <p>
331+
* This method should never be called from within a
332+
* {@link TmfSignalHandler}.
333+
*
334+
* @param trace
335+
* An instance of {@link ITmfTrace}. Note, that trace can be an
336+
* instance of TmfExperiment, too.
337+
* @param id
338+
* Id of the data provider. This ID can be the concatenation of a
339+
* provider ID + ':' + a secondary ID used to differentiate
340+
* multiple instances of a same provider.
341+
* @return the data provider or null
342+
* @since 9.5
343+
*/
344+
public synchronized @Nullable ITmfDataProvider getExistingDataProvider(@NonNull ITmfTrace trace, String id) {
345+
for (ITmfDataProvider dataProvider : fInstances.get(trace)) {
346+
if (id.equals(dataProvider.getId())) {
347+
return dataProvider;
348+
}
349+
}
350+
return null;
351+
}
352+
281353
/**
282354
* Signal handler for the traceClosed signal.
283355
*
@@ -290,7 +362,7 @@ public void traceClosed(final TmfTraceClosedSignal signal) {
290362
new Thread(() -> {
291363
synchronized (DataProviderManager.this) {
292364
for (ITmfTrace trace : TmfTraceManager.getTraceSetWithExperiment(signal.getTrace())) {
293-
fInstances.removeAll(trace).forEach(ITmfTreeDataProvider::dispose);
365+
fInstances.removeAll(trace).forEach(ITmfDataProvider::dispose);
294366
}
295367
}
296368
}).start();
@@ -402,9 +474,9 @@ public <T extends ITmfTreeDataProvider<? extends ITmfTreeDataModel>> boolean rem
402474
* @since 9.7
403475
*/
404476
public void removeDataProvider(ITmfTrace trace, String id) {
405-
Iterator<ITmfTreeDataProvider<? extends ITmfTreeDataModel>> iter = fInstances.get(trace).iterator();
477+
Iterator<ITmfDataProvider> iter = fInstances.get(trace).iterator();
406478
while (iter.hasNext()) {
407-
ITmfTreeDataProvider<? extends ITmfTreeDataModel> dp = iter.next();
479+
ITmfDataProvider dp = iter.next();
408480
if (dp.getId().equals(id)) {
409481
dp.dispose();
410482
iter.remove();
@@ -487,9 +559,9 @@ public synchronized void removeDataProviderFactory(String id) {
487559
private void removeExistingDataProviders(IDataProviderFactory factory, String passedFactoryId) {
488560
if (factory != null) {
489561
for (ITmfTrace trace : fInstances.keySet()) {
490-
Iterator<ITmfTreeDataProvider<? extends ITmfTreeDataModel>> iter = fInstances.get(trace).iterator();
562+
Iterator<ITmfDataProvider> iter = fInstances.get(trace).iterator();
491563
while (iter.hasNext()) {
492-
ITmfTreeDataProvider<? extends ITmfTreeDataModel> dp = iter.next();
564+
ITmfDataProvider dp = iter.next();
493565
String factoryId = extractFactoryId(dp.getId());
494566
if (passedFactoryId.equals(factoryId)) {
495567
dp.dispose();

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

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.eclipse.jdt.annotation.NonNull;
1919
import org.eclipse.jdt.annotation.Nullable;
2020
import org.eclipse.tracecompass.tmf.core.config.ITmfDataProviderConfigurator;
21+
import org.eclipse.tracecompass.tmf.core.model.ITmfDataProvider;
2122
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
2223
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider;
2324
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
@@ -41,7 +42,22 @@ public interface IDataProviderFactory extends IAdaptable {
4142
* @return {@link ITmfTreeDataProvider} that can be use for the given trace
4243
* @since 4.0
4344
*/
44-
@Nullable ITmfTreeDataProvider<? extends ITmfTreeDataModel> createProvider(@NonNull ITmfTrace trace);
45+
@Nullable default ITmfTreeDataProvider<? extends ITmfTreeDataModel> createProvider(@NonNull ITmfTrace trace){
46+
return null;
47+
}
48+
49+
/**
50+
* Create a {@link ITmfDataProvider} for the given trace. If this factory
51+
* does not know how to handle the given trace it will return null
52+
*
53+
* @param trace
54+
* A trace
55+
* @return {@link ITmfDataProvider} that can be use for the given trace
56+
* @since 9.5
57+
*/
58+
@Nullable default ITmfDataProvider createProvider2(@NonNull ITmfTrace trace) {
59+
return null;
60+
}
4561

4662
/**
4763
* Create a {@link ITmfTreeDataProvider} for the given trace. If this factory
@@ -64,6 +80,27 @@ public interface IDataProviderFactory extends IAdaptable {
6480
return createProvider(trace);
6581
}
6682

83+
/**
84+
* Create a {@link ITmfDataProvider} for the given trace. If this factory
85+
* does not know how to handle the given trace it will return null. The
86+
* resulting provider should have an ID that is an aggregate of the provider's
87+
* own ID and the secondaryId as such: <provider ID>:<secondaryId>
88+
*
89+
* @param trace
90+
* A trace
91+
* @param secondaryId
92+
* Additional ID to identify different instances of the same
93+
* provider, for instance, when the same provider can be used for
94+
* different analysis modules
95+
* @return {@link ITmfDataProvider} that can be use for the given trace with
96+
* ID <provider ID>:<secondaryId>, or <code>null</code> if no provider
97+
* is available for this trace and ID
98+
* @since 9.5
99+
*/
100+
default @Nullable ITmfDataProvider createProvider2(@NonNull ITmfTrace trace, @NonNull String secondaryId) {
101+
return createProvider2(trace);
102+
}
103+
67104
/**
68105
* Gets the collection of data provider descriptors for this trace that this
69106
* data provider factory can create, if the trace supports it, else
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**********************************************************************
2+
* Copyright (c) 2025 Ericsson
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License 2.0 which
6+
* accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
**********************************************************************/
11+
12+
package org.eclipse.tracecompass.tmf.core.model;
13+
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+
20+
/**
21+
* Provider for arbitrary data
22+
*
23+
*/
24+
public interface ITmfDataProvider {
25+
/**
26+
* This method return the extension point ID of this provider
27+
*
28+
* @return The ID
29+
*/
30+
String getId();
31+
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+
46+
/**
47+
* Dispose of the provider to avoid resource leakage.
48+
*/
49+
public default void dispose() {
50+
// Do nothing for now
51+
}
52+
}

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

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import org.eclipse.core.runtime.IProgressMonitor;
1717
import org.eclipse.jdt.annotation.Nullable;
18+
import org.eclipse.tracecompass.tmf.core.model.ITmfDataProvider;
1819
import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
1920

2021
/**
@@ -26,7 +27,7 @@
2627
* Tree model extending {@link ITmfTreeDataModel}
2728
* @since 4.0
2829
*/
29-
public interface ITmfTreeDataProvider<T extends ITmfTreeDataModel> {
30+
public interface ITmfTreeDataProvider<T extends ITmfTreeDataModel> extends ITmfDataProvider{
3031

3132
/**
3233
* This methods computes a tree model. Then, it returns a
@@ -43,18 +44,10 @@ public interface ITmfTreeDataProvider<T extends ITmfTreeDataModel> {
4344
*/
4445
TmfModelResponse<TmfTreeModel<T>> fetchTree(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor);
4546

46-
/**
47-
* This method return the extension point ID of this provider
48-
*
49-
* @return The ID
50-
*/
51-
String getId();
52-
53-
/**
54-
* Dispose of the provider to avoid resource leakage.
55-
*
56-
* @since 4.0
57-
*/
58-
public default void dispose() {
47+
@Override
48+
default TmfModelResponse<?> fetchData(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
49+
return fetchTree(fetchParameters, monitor);
5950
}
6051
}
52+
53+

0 commit comments

Comments
 (0)