blob: 11b6fe0907099e016591521396dba3edb8c16245 [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.compile;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
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.compile.TmfXmlFsmStateCu.TmfXmlFsmCu;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenFsm;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenPatternEventHandler;
import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlStrings;
import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlUtils;
import org.w3c.dom.Element;
/**
* The compilation unit for XML pattern event handler
*
* @author Geneviève Bastien
*/
public class TmfXmlPatternEventHandlerCu implements IDataDrivenCompilationUnit {
private List<TmfXmlFsmCu> fFsms;
private List<String> fInitials;
private TmfXmlPatternEventHandlerCu(List<TmfXmlFsmCu> fsms, List<String> initials) {
fFsms = fsms;
fInitials = initials;
}
@Override
public DataDrivenPatternEventHandler generate() {
Map<String, DataDrivenFsm> fsms = fFsms.stream()
.map(TmfXmlFsmCu::generate)
.collect(Collectors.toMap(DataDrivenFsm::getId, fsm -> fsm));
List<DataDrivenFsm> initials = new ArrayList<>();
for (String initial : fInitials) {
initials.add(Objects.requireNonNull(fsms.get(initial)));
}
return new DataDrivenPatternEventHandler(fsms.values(), initials);
}
/**
* Compile a pattern event handler compilation unit from an XML element
*
* @param analysisData
* The analysis data already compiled
* @param element
* The event handler XML element
* @return The event handler compilation unit, or <code>null</code> if there was
* compilation errors
*/
public static @Nullable TmfXmlPatternEventHandlerCu compile(AnalysisCompilationData analysisData, Element element) {
List<Element> elements = TmfXmlUtils.getChildElements(element, TmfXmlStrings.TEST);
for (Element testElement : elements) {
TmfXmlConditionCu test = TmfXmlConditionCu.compileNamedCondition(analysisData, testElement);
if (test == null) {
return null;
}
}
elements = TmfXmlUtils.getChildElements(element, TmfXmlStrings.ACTION);
for (Element actionElement : elements) {
TmfXmlActionCu action = TmfXmlActionCu.compileNamedAction(analysisData, actionElement);
if (action == null) {
return null;
}
}
elements = TmfXmlUtils.getChildElements(element, TmfXmlStrings.ACTION);
for (Element actionElement : elements) {
TmfXmlActionCu action = TmfXmlActionCu.compileNamedAction(analysisData, actionElement);
if (action == null) {
return null;
}
}
List<TmfXmlFsmCu> fsms = new ArrayList<>();
elements = TmfXmlUtils.getChildElements(element, TmfXmlStrings.FSM);
for (Element fsmElement : elements) {
TmfXmlFsmCu fsm = TmfXmlFsmStateCu.compileFsm(analysisData, fsmElement);
if (fsm == null) {
return null;
}
fsms.add(fsm);
}
String initialFsm = element.getAttribute(TmfXmlStrings.INITIAL);
List<String> initials = new ArrayList<>();
if (!initialFsm.isEmpty()) {
for (String initial : initialFsm.split(TmfXmlStrings.AND_SEPARATOR)) {
TmfXmlFsmStateCu fsm = analysisData.getFsm(initial);
if (fsm == null) {
// TODO: Validation message here
Activator.logError("XML pattern handler: Undefined initial FSM: " + initial); //$NON-NLS-1$
return null;
}
initials.add(initial);
}
}
return new TmfXmlPatternEventHandlerCu(fsms, initials);
}
}