blob: 331e1d9a916b4eeabbbf7db472cc4053c8a1b59e [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.compile;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.Activator;
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.module.DataDrivenStateProvider;
import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlStrings;
import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlUtils;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.w3c.dom.Element;
/**
* The compilation unit for the state provider XML element.
*
* @author Geneviève Bastien
* @author Florian Wininger
*/
public class TmfXmlStateProviderCu {
private final List<TmfXmlEventHandlerCu> fEventHandlers;
private final List<TmfXmlMappingGroupCu> fMapGroups;
private final String fProviderId;
private final int fVersion;
/**
* Constructor
*
* Package-private because only classes from this package can build this
*
* @param providerId
* The ID of the state provider
* @param version
* The version of the state provider
* @param mapGroups
* The mapping groups compilation units
* @param eventHandlers
* The event handlers compilation units
*/
TmfXmlStateProviderCu(String providerId, int version, List<TmfXmlMappingGroupCu> mapGroups, List<TmfXmlEventHandlerCu> eventHandlers) {
fEventHandlers = eventHandlers;
fMapGroups = mapGroups;
fProviderId = providerId;
fVersion = version;
}
/**
* Generate a state provider from this compilation unit
*
* @param trace
* The trace for which to generate the state provider
* @return The data-driven state provider
*/
public DataDrivenStateProvider generate(ITmfTrace trace) {
List<DataDrivenEventHandler> eventHandlers = fEventHandlers.stream()
.map(TmfXmlEventHandlerCu::generate)
.collect(Collectors.toList());
List<DataDrivenMappingGroup> mappingGroups = fMapGroups.stream()
.map(TmfXmlMappingGroupCu::generate)
.collect(Collectors.toList());
return new DataDrivenStateProvider(trace, fProviderId, fVersion, eventHandlers, mappingGroups);
}
/**
* Compile a state provider from an XML file
*
* @param file
* The path to the XML file
* @param providerId
* The ID of the provider to build
* @return The compilation unit corresponding to this state provider
*/
public static @Nullable TmfXmlStateProviderCu compile(Path file, String providerId) {
Element spEl = TmfXmlUtils.getElementInFile(file.toAbsolutePath().toString(), TmfXmlStrings.STATE_PROVIDER, providerId);
if (spEl == null) {
// TODO: Validation message here
Activator.logError("XmlStateProvider: Cannot find state provider element in file " + file); //$NON-NLS-1$
return null;
}
AnalysisCompilationData analysisData = new AnalysisCompilationData();
int version;
try {
version = Integer.parseInt(spEl.getAttribute(TmfXmlStrings.VERSION));
} catch (NumberFormatException e) {
// TODO: Validation message here
Activator.logError("XmlStateProvider: The version is not a parseable integer"); //$NON-NLS-1$
return null;
}
/* parser for defined Values */
List<Element> childElements = TmfXmlUtils.getChildElements(spEl, TmfXmlStrings.DEFINED_VALUE);
for (Element element : childElements) {
analysisData.addDefinedValue(element.getAttribute(TmfXmlStrings.NAME), element.getAttribute(TmfXmlStrings.VALUE));
}
/* parser for the locations */
childElements = TmfXmlUtils.getChildElements(spEl, TmfXmlStrings.LOCATION);
for (Element element : childElements) {
TmfXmlLocationCu.compile(analysisData, element);
}
/* parser for the mapping groups */
List<TmfXmlMappingGroupCu> mapGroups = new ArrayList<>();
childElements = TmfXmlUtils.getChildElements(spEl, TmfXmlStrings.MAPPING_GROUP);
for (Element map : childElements) {
TmfXmlMappingGroupCu compile = TmfXmlMappingGroupCu.compile(analysisData, map);
if (compile == null) {
return null;
}
mapGroups.add(compile);
}
/* parser for the event handlers */
childElements = TmfXmlUtils.getChildElements(spEl, TmfXmlStrings.EVENT_HANDLER);
List<TmfXmlEventHandlerCu> handlers = new ArrayList<>();
for (Element element : childElements) {
TmfXmlEventHandlerCu compile = TmfXmlEventHandlerCu.compile(analysisData, element);
if (compile == null) {
return null;
}
handlers.add(compile);
}
return new TmfXmlStateProviderCu(providerId, version, mapGroups, handlers);
}
}