4545import org .eclipse .tracecompass .internal .tmf .core .Activator ;
4646import org .eclipse .tracecompass .tmf .core .component .DataProviderConstants ;
4747import org .eclipse .tracecompass .tmf .core .config .ITmfConfiguration ;
48+ import org .eclipse .tracecompass .tmf .core .model .ITmfDataProvider ;
4849import org .eclipse .tracecompass .tmf .core .model .tree .ITmfTreeDataModel ;
4950import org .eclipse .tracecompass .tmf .core .model .tree .ITmfTreeDataProvider ;
5051import 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 ();
0 commit comments