blob: aaf79a60541999ed48bc71bffb739ce1145b3063 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 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 java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.common.core.NonNullUtils;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenFsm;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenFsmSimpleState;
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.statesystem.core.ITmfStateSystem;
import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlStrings;
import org.eclipse.tracecompass.tmf.core.statesystem.TmfAttributePool;
/**
* This class gives basic details about a scenario (quark, scenarioName, ...)
*
* FIXME: The original state provider analysis will use a one-state,
* multiple-transition singleton fsm to reduce the number of potential
* code-path. Fix this class when pattern analyses are ported to the new
* architecture.
*
* @author Jean-Christian Kouame
*/
public class DataDrivenScenarioInfo {
/**
* A temporary dummy scenario
*/
public static final DataDrivenScenarioInfo DUMMY_SCENARIO = new DataDrivenScenarioInfo(DataDrivenFsmSimpleState.createFinalState(StringUtils.EMPTY), ScenarioStatusType.PENDING, -1, -1, null);
/** The string for start time */
private static final String START_TIME = "startTime"; //$NON-NLS-1$
private final int fQuark;
private final int fStatusQuark;
private DataDrivenFsmState fActiveState;
private ScenarioStatusType fStatus;
private final Map<@NonNull TmfAttributePool, Integer> fPoolAttributes = new HashMap<>();
private final @Nullable DataDrivenFsm fFsm;
/**
* Constructor
*
* @param activeState
* The active state
* @param status
* The scenario status
* @param quark
* The scenario quark
* @param statusQuark
* The scenario status quark
* @param fsm
* The state machine this scenario info is for
*/
public DataDrivenScenarioInfo(DataDrivenFsmState activeState, ScenarioStatusType status, int quark, int statusQuark, @Nullable DataDrivenFsm fsm) {
fActiveState = activeState;
fQuark = quark;
fStatus = status;
fStatusQuark = statusQuark;
fFsm = fsm;
}
/**
* Set the active state
*
* @param activeState
* The active state
*/
public void setActiveState(DataDrivenFsmState activeState) {
fActiveState = activeState;
}
/**
* Set the status of this active scenario
*
* @param status
* The scenario status
*/
public void setStatus(ScenarioStatusType status) {
fStatus = status;
}
/**
* Get the scenario quark
*
* @return The quark
*/
public int getQuark() {
return fQuark;
}
/**
* Get the scenario active state
*
* @return The active state
*/
public DataDrivenFsmState getActiveState() {
return fActiveState;
}
/**
* Get the active scenario status
*
* @return The status
*/
public ScenarioStatusType getStatus() {
return fStatus;
}
/**
* Get the scenario status quark
*
* @return The quark
*/
public int getStatusQuark() {
return fStatusQuark;
}
/**
* Get the state system quark of the attribute that was assigned to this
* scenario from the given attribute pool. If no attribute was assigned to this
* scenario, it will get one.
*
* @param pool
* The attribute pool from which to get an attribute for this
* scenario.
* @return The quark of the attribute from a pool for the given state system
* path, or <code>null</code> if no attribute was assigned yet at this
* path.
*/
public Integer getAttributeFromPool(TmfAttributePool pool) {
return fPoolAttributes.computeIfAbsent(pool, TmfAttributePool::getAvailable);
}
/**
* Recycle all attributes taken from attribute pools
*
* @param ts
* The timestamp at which to close the attributes
*/
public void recycleAttributes(long ts) {
fPoolAttributes.entrySet().forEach(e -> {
NonNullUtils.checkNotNull(e.getKey()).recycle(e.getValue(), ts);
});
}
/**
* Get the start time of a state
*
* FIXME: For the first iteration (no data driven patterns yet), this method
* is here, but may move to a class responsible of scenario history, like
* current code
*
* @param container
* The analysis data container
* @param state
* The state for which to get the start time
* @return The start time of the requested state or <code>-1L</code> if this
* state has not been reached
*/
public long getStateStartTime(IAnalysisDataContainer container, String state) {
ITmfStateSystem stateSystem = container.getStateSystem();
int stateQuark = stateSystem.optQuarkRelative(fQuark, TmfXmlStrings.STATE, state, START_TIME);
if (stateQuark < 0) {
return -1L;
}
Object startTs = stateSystem.queryOngoing(stateQuark);
if (startTs instanceof Long) {
return (long) startTs;
}
return -1L;
}
/**
* Get the ID of the FSM this scenario is part of
*
* FIXME: Make this @NonNull when everything is a pattern
*
* @return The ID of the FSM
*/
public @Nullable DataDrivenFsm getFsm() {
return fFsm;
}
}