blob: dc023d74bf3defd71c7873536dce6b15ab57383d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Ecole Polytechnique de Montreal, Ericsson
*
* 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.runtime;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenFsm;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenFsmState;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.runtime.DataDrivenScenarioHistoryBuilder.ScenarioStatusType;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.module.IAnalysisDataContainer;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
/**
* This Class implements a Scenario in the XML-defined state system
*/
public class DataDrivenScenario {
private final IAnalysisDataContainer fContainer;
private final DataDrivenFsm fFsm;
private DataDrivenScenarioInfo fScenarioInfo;
DataDrivenScenarioHistoryBuilder fHistoryBuilder;
/**
* Constructor
*
* @param event
* The event at which this scenario is created
* @param fsm
* the fsm executed by this scenario
* @param initialState
* The initial state
* @param container
* The state system container this scenario belongs to
* @param executionData
* The runtime execution data
*/
public DataDrivenScenario(ITmfEvent event, DataDrivenFsm fsm, DataDrivenFsmState initialState, IAnalysisDataContainer container, DataDrivenRuntimeData executionData) {
fFsm = fsm;
fContainer = container;
fHistoryBuilder = executionData.getHistoryBuilder();
int quark = fHistoryBuilder.assignScenarioQuark(fContainer, fsm);
int statusQuark = fHistoryBuilder.getScenarioStatusQuark(fContainer, quark);
fScenarioInfo = new DataDrivenScenarioInfo(initialState, ScenarioStatusType.PENDING, quark, statusQuark, fFsm);
fHistoryBuilder.update(fContainer, fScenarioInfo, event);
}
/**
* Get this scenario infos
*
* @return The scenario info
*/
public DataDrivenScenarioInfo getScenarioInfos() {
return fScenarioInfo;
}
/**
* Cancel the execution of this scenario
*/
public void cancel() {
fScenarioInfo.setStatus(ScenarioStatusType.ABANDONED);
if (fScenarioInfo.getStatus() != ScenarioStatusType.PENDING) {
fHistoryBuilder.completeScenario(fContainer, fScenarioInfo, null);
}
}
/**
* Test if the scenario is active or not
*
* @return True if the scenario is active, false otherwise
*/
public boolean isActive() {
return fScenarioInfo.getStatus() == ScenarioStatusType.IN_PROGRESS;
}
/**
* Test if the scenario is pending or not
*
* @return True if the scenario is pending, false otherwise
*/
public boolean isPending() {
return fScenarioInfo.getStatus() == ScenarioStatusType.PENDING;
}
/**
* Handle the ongoing event
*
* @param event
* The ongoing event
* @param container
* The data container
* @return Whether or not the event was consumed by this scenario
*/
public boolean handleEvent(ITmfEvent event, IAnalysisDataContainer container) {
DataDrivenFsmState activeState = fScenarioInfo.getActiveState();
DataDrivenFsmState nextState = activeState.takeTransition(event, fScenarioInfo, container);
if (nextState == null) {
return false;
}
if (fScenarioInfo.getStatus().equals(ScenarioStatusType.PENDING)) {
fScenarioInfo.setStatus(ScenarioStatusType.IN_PROGRESS);
fHistoryBuilder.startScenario(fContainer, fScenarioInfo, event);
}
if (nextState.isFinal()) {
fScenarioInfo.setStatus(ScenarioStatusType.MATCHED);
fHistoryBuilder.completeScenario(fContainer, fScenarioInfo, event);
}
fScenarioInfo.setActiveState(nextState);
fHistoryBuilder.update(fContainer, fScenarioInfo, event);
return true;
}
}