blob: 9a0469397a48c65c59f855d4a30a9f196fab30a3 [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 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.internal.tmf.analysis.xml.core.fsm.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.runtime.DataDrivenRuntimeData;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.module.IAnalysisDataContainer;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
/**
* The class responsible to handle events for pattern event handler
*
* @author Geneviève Bastien
* @author Jean-Christian Kouamé
*/
public class DataDrivenPatternEventHandler implements IDataDrivenRuntimeObject {
private final Collection<DataDrivenFsm> fFsms;
private final Collection<DataDrivenFsm> fInitials;
private final Set<DataDrivenFsm> fActiveFsmList = new HashSet<>();
/**
* Constructor
*
* @param fsms
* The finite state machines in this handler
* @param initials
* The finite state machines to start at the beginning of the
* analysis
*/
public DataDrivenPatternEventHandler(Collection<DataDrivenFsm> fsms, Collection<DataDrivenFsm> initials) {
fFsms = fsms;
fInitials = initials;
}
/**
* Dispose of this fsm
*
* @param executionData
* The runtime data
*/
public void dispose(DataDrivenRuntimeData executionData) {
for (DataDrivenFsm fsm : fFsms) {
fsm.dispose(executionData);
}
}
/**
* Handle the event
*
* @param event
* Event to handle
* @param container
* The analysis container
* @param runtimeData
* The runtime data for the current analysis execution
*/
public void handleEvent(ITmfEvent event, IAnalysisDataContainer container, DataDrivenRuntimeData runtimeData) {
final Set<DataDrivenFsm> activeFsmList = fActiveFsmList;
if (activeFsmList.isEmpty()) {
Collection<DataDrivenFsm> fsms = fInitials;
if (fInitials.isEmpty()) {
// No initial fsm specified: Add all FSMs to the list to create scenarios
fsms = fFsms;
}
for (DataDrivenFsm fsm : fsms) {
fActiveFsmList.add(fsm);
fsm.createScenario(event, true, runtimeData, container);
}
} else {
List<DataDrivenFsm> fsmToStart = new ArrayList<>();
for (DataDrivenFsm fsm : fFsms) {
if (fsm.isNewScenarioAllowed(runtimeData.getRuntimeForFsm(fsm))) {
fsmToStart.add(fsm);
}
}
for (DataDrivenFsm fsm : fsmToStart) {
fActiveFsmList.add(fsm);
fsm.createScenario(event, false, runtimeData, container);
}
}
for (DataDrivenFsm fsm : activeFsmList) {
fsm.handleEvent(event, runtimeData, container);
}
}
}