blob: 6ce8d66c85f92284325ec46a175067c3511feba6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 É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.module;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.script.ScriptEngine;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenEventHandler;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenMappingGroup;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.runtime.DataDrivenScenarioInfo;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.statesystem.AbstractTmfStateProvider;
import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
import org.eclipse.tracecompass.tmf.core.statesystem.TmfAttributePool;
import org.eclipse.tracecompass.tmf.core.statesystem.TmfAttributePool.QueueType;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
/**
* A state provider for data-driven analyses
*
* @author Geneviève Bastien
*/
public class DataDrivenStateProvider extends AbstractTmfStateProvider implements IAnalysisDataContainer {
private final List<DataDrivenEventHandler> fEventHandlers;
private final Map<String, DataDrivenMappingGroup> fMappingGroups = new HashMap<>();
private Map<String, ScriptEngine> fScriptengine = new HashMap<>();
private final String fId;
private final int fVersion;
/** Map for attribute pools */
private final Map<Integer, TmfAttributePool> fAttributePools = new HashMap<>();
/**
* Constructor
*
* @param trace
* The trace to run this state provider on
* @param providerId
* The ID of the provider
* @param version
* The version of this state provider
* @param eventHandlers
* The handlers for the events
* @param mappingGroups
* The mapping groups used in this analysis
*/
public DataDrivenStateProvider(ITmfTrace trace, String providerId, int version, List<DataDrivenEventHandler> eventHandlers, Collection<DataDrivenMappingGroup> mappingGroups) {
super(trace, providerId);
fEventHandlers = eventHandlers;
mappingGroups.forEach(mg -> fMappingGroups.put(mg.getId(), mg));
fId = providerId;
fVersion = version;
}
@Override
public int getVersion() {
return fVersion;
}
@Override
public ITmfStateProvider getNewInstance() {
return new DataDrivenStateProvider(getTrace(), fId, fVersion, fEventHandlers, fMappingGroups.values());
}
@Override
protected void eventHandle(ITmfEvent event) {
fEventHandlers.forEach(handler -> handler.handleEvent(event, DataDrivenScenarioInfo.DUMMY_SCENARIO, this));
}
@Override
public ITmfStateSystem getStateSystem() {
ITmfStateSystem ss = getAssignedStateSystem();
if (ss == null) {
throw new NullPointerException("The state system should not be requested at this point, it is null"); //$NON-NLS-1$
}
return ss;
}
@Override
public @Nullable TmfAttributePool getAttributePool(int startNodeQuark) {
ITmfStateSystem ss = getStateSystem();
if (!(ss instanceof ITmfStateSystemBuilder)) {
throw new IllegalStateException("The state system hasn't been initialized yet"); //$NON-NLS-1$
}
return fAttributePools.computeIfAbsent(startNodeQuark, baseQuark -> new TmfAttributePool((ITmfStateSystemBuilder) ss, baseQuark, QueueType.PRIORITY));
}
@Override
public DataDrivenMappingGroup getMappingGroup(String id) {
return Objects.requireNonNull(fMappingGroups.get(id));
}
@Override
public void addFutureState(long time, @Nullable Object state, int quark, FutureEventType type) {
addFutureEvent(time, state, quark, type);
}
@Override
public void setScriptengine(String name, ScriptEngine engine) {
fScriptengine.put(name, engine);
}
@Override
public @Nullable ScriptEngine getScriptEngine(String name) {
return fScriptengine.get(name);
}
@Override
public boolean isReadOnlyContainer() {
return false;
}
}