blob: 97aee317e3c7ea24ab39008e251462197e7b3bb1 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2019 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
**********************************************************************/
package org.eclipse.tracecompass.incubator.internal.ros.core.analysis.messageflow;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.model.messageflow.IRosMessageFlowModel;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderFactory;
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.TmfStartAnalysisSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
/**
* {@link RosMessageFlowDataProvider} factory
*
* @author Christophe Bedard
*/
public class RosMessageFlowDataProviderFactory implements IDataProviderFactory {
private final Map<ITmfTrace, RosMessageFlowAnalysis> fMap = new HashMap<>();
/**
* Constructor, registers the module with the {@link TmfSignalManager}
*/
public RosMessageFlowDataProviderFactory() {
TmfSignalManager.register(this);
}
@Override
public @Nullable ITmfTreeDataProvider<? extends ITmfTreeDataModel> createProvider(@NonNull ITmfTrace trace) {
RosMessageFlowAnalysis module = fMap.remove(trace);
if (module == null) {
return null;
}
IRosMessageFlowModel model = module.getModel();
if (model == null) {
return null;
}
return new RosMessageFlowDataProvider(trace, model);
}
/**
* {@link TmfSignalHandler} for when {@link RosMessageFlowAnalysis} is
* started, as the analysis is not registered with the trace, we use this to
* know to associate a {@link RosMessageFlowAnalysis} to a trace.
*
* @param startAnalysisSignal
* analysis started signal
*/
@TmfSignalHandler
public synchronized void analysisStarted(TmfStartAnalysisSignal startAnalysisSignal) {
IAnalysisModule module = startAnalysisSignal.getAnalysisModule();
if (module instanceof RosMessageFlowAnalysis) {
RosMessageFlowAnalysis analysis = (RosMessageFlowAnalysis) module;
fMap.put(analysis.getTrace(), analysis);
}
}
/**
* Remove the closed trace's analysis to avoid resource leaks
*
* @param traceClosedSignal
* the TMF trace closed signal
*/
@TmfSignalHandler
public synchronized void traceClosed(TmfTraceClosedSignal traceClosedSignal) {
fMap.remove(traceClosedSignal.getTrace());
}
}