-
Notifications
You must be signed in to change notification settings - Fork 10
/
ScriptingDataProviderManager.java
172 lines (156 loc) · 6.17 KB
/
ScriptingDataProviderManager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*******************************************************************************
* Copyright (c) 2019, 2022 École Polytechnique de Montréal and others
*
* 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.incubator.internal.scripting.core.data.provider;
import java.util.Collection;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.tmf.core.component.DataProviderConstants;
import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
/**
* A class to manage the data providers create via scripts for traces. The data
* providers will be created by the scripting modules and registered to this
* manager.
*
* @author Geneviève Bastien
*/
public class ScriptingDataProviderManager {
/**
* ID shared by all scripting data providers
*/
public static final String PROVIDER_ID = "org.eclipse.tracecompass.incubator.scripting.dataprovider"; //$NON-NLS-1$
private static @Nullable ScriptingDataProviderManager INSTANCE;
private final Multimap<ITmfTrace, ITmfTreeDataProvider<? extends ITmfTreeDataModel>> fInstances = HashMultimap.create();
/**
* Get the instance of the manager
*
* @return the singleton instance
*/
public synchronized static ScriptingDataProviderManager getInstance() {
ScriptingDataProviderManager instance = INSTANCE;
if (instance == null) {
instance = new ScriptingDataProviderManager();
INSTANCE = instance;
}
return instance;
}
/**
* Dispose the singleton instance if it exists
*/
public static synchronized void dispose() {
ScriptingDataProviderManager manager = INSTANCE;
if (manager != null) {
TmfSignalManager.deregister(manager);
manager.fInstances.clear();
INSTANCE = null;
}
}
/**
* Private constructor.
*/
public ScriptingDataProviderManager() {
TmfSignalManager.register(this);
}
/**
* Get a data provider with ID for trace
*
* @param trace
* The trace to get the provider for
* @param id
* The ID of the data provider
* @return The data provider, or <code>null</code> if none has been created
* for the trace
*/
public @Nullable ITmfTreeDataProvider<? extends ITmfTreeDataModel> getProvider(ITmfTrace trace, String id) {
Collection<ITmfTreeDataProvider<? extends ITmfTreeDataModel>> dps = fInstances.get(trace);
for (ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider : dps) {
if (dataProvider.getId().equals(PROVIDER_ID + DataProviderConstants.ID_SEPARATOR + id)) {
return dataProvider;
}
}
return null;
}
/**
* Register a data provider that was created by a script
*
* @param trace
* The trace this data provider is for
* @param provider
* The data provider
*/
public void registerDataProvider(ITmfTrace trace, ITmfTreeDataProvider<? extends ITmfTreeDataModel> provider) {
// Remove previous data providers of the same name
Collection<ITmfTreeDataProvider<? extends ITmfTreeDataModel>> dataProviders = fInstances.get(trace);
ITmfTreeDataProvider<? extends ITmfTreeDataModel> previous = null;
for (ITmfTreeDataProvider<? extends ITmfTreeDataModel> dataProvider: dataProviders) {
if (provider.getId().equals(dataProvider.getId())) {
previous = dataProvider;
break;
}
}
if (previous != null) {
fInstances.remove(trace, previous);
DataProviderManager.getInstance().removeDataProvider(trace, previous);
}
fInstances.put(trace, provider);
}
/**
* Signal handler for the traceClosed signal.
*
* @param signal
* The incoming signal
*/
@TmfSignalHandler
public void traceClosed(final TmfTraceClosedSignal signal) {
new Thread(() -> {
synchronized (ScriptingDataProviderManager.this) {
for (ITmfTrace trace : TmfTraceManager.getTraceSetWithExperiment(signal.getTrace())) {
fInstances.removeAll(trace).forEach(ITmfTreeDataProvider::dispose);
}
}
}).start();
}
/**
* Constructs a scripted data provider ID from the provider name:
* "PROVIDER_ID:dpName"
*
* @param providerName
* the secondary ID string
* @return scripted data provider ID
*/
public static String createProviderId(String providerName) {
return PROVIDER_ID + DataProviderConstants.ID_SEPARATOR + providerName;
}
/**
* This method extracts the data provider name from provider IDs.
*
* Scripted data provider have the data provider name encoded in the
* data provider ID: "PROVIDER_ID:dpName".
*
* @param providerId the input data provider ID
*
* @return the data provider secondary name or null
*/
public static @Nullable String extractProviderName(String providerId) {
int index = providerId.indexOf(DataProviderConstants.ID_SEPARATOR);
if ((index > 0) && index < providerId.length() - 1) {
return providerId.substring(index + 1);
}
return null;
}
}