blob: f8ceee2ce8ff4b1970abe1690d17ebd963c59cf1 [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.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.DataDrivenMappingGroup;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenMappingGroup.DataDrivenMappingEntry;
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 an XML mapping group element
*
* @author Geneviève Bastien
* @author Jean-Christian Kouame
*/
public class TmfXmlMappingGroupCu implements IDataDrivenCompilationUnit {
/** Class for the entries */
private static class TmfXmlMappingEntryCu {
private final TmfXmlStateValueCu fKey;
private final TmfXmlStateValueCu fVal;
public TmfXmlMappingEntryCu(TmfXmlStateValueCu key, TmfXmlStateValueCu val) {
fKey = key;
fVal = val;
}
public DataDrivenMappingEntry generate() {
return new DataDrivenMappingEntry(fKey.generate(), fVal.generate());
}
}
private final String fId;
private final List<TmfXmlMappingEntryCu> fEntries;
/**
* Constructor
*
* Package-private because only classes from this package can build this
*
* @param id
* The ID of the mapping group
* @param entries
* The list of entries
*/
TmfXmlMappingGroupCu(String id, List<TmfXmlMappingEntryCu> entries) {
fEntries = entries;
fId = id;
}
@Override
public DataDrivenMappingGroup generate() {
List<DataDrivenMappingEntry> collect = fEntries.stream()
.map(TmfXmlMappingEntryCu::generate)
.collect(Collectors.toList());
DataDrivenMappingGroup mapGroup = new DataDrivenMappingGroup(fId, collect);
return mapGroup;
}
/**
* Get the ID of this mapping group
*
* @return The ID of the mapping group
*/
public String getId() {
return fId;
}
/**
* @param analysisData
* The analysis data already compiled
* @param mapGroupEl
* The XML element corresponding to this mapping group
* @return The mapping group compilation unit or <code>null</code> if there was
* compilation errors.
*/
public static @Nullable TmfXmlMappingGroupCu compile(AnalysisCompilationData analysisData, Element mapGroupEl) {
String id = mapGroupEl.getAttribute(TmfXmlStrings.ID);
List<Element> entries = TmfXmlUtils.getChildElements(mapGroupEl, TmfXmlStrings.ENTRY);
List<TmfXmlMappingEntryCu> entriesCu = new ArrayList<>();
for (Element entryElement : entries) {
List<Element> svElements = TmfXmlUtils.getChildElements(entryElement, TmfXmlStrings.STATE_VALUE);
if (svElements.size() != 2) {
// TODO: Validation message here
Activator.logError("TmfXmlMappingGroupCu: There should be 2 children state values. There were " + svElements.size()); //$NON-NLS-1$
return null;
}
TmfXmlStateValueCu keySv = TmfXmlStateValueCu.compileValue(analysisData, svElements.get(0));
if (keySv == null) {
// TODO: Validation message here
Activator.logError("TmfXmlMappingGroupCu: Invalid key"); //$NON-NLS-1$
return null;
}
TmfXmlStateValueCu valueSv = TmfXmlStateValueCu.compileValue(analysisData, svElements.get(1));
if (valueSv == null) {
// TODO: Validation message here
Activator.logError("TmfXmlMappingGroupCu: Invalid value"); //$NON-NLS-1$
return null;
}
TmfXmlMappingEntryCu mapEntry = new TmfXmlMappingEntryCu(keySv, valueSv);
entriesCu.add(mapEntry);
}
TmfXmlMappingGroupCu mappingGroup = new TmfXmlMappingGroupCu(id, entriesCu);
analysisData.addMappingGroup(id, mappingGroup);
return mappingGroup;
}
}