/*******************************************************************************
* Copyright (c) 2014, 2016 É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 v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.common.core.NonNullUtils;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.Activator;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.pattern.stateprovider.XmlPatternAnalysis;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.stateprovider.TmfXmlStrings;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.stateprovider.XmlStateSystemModule;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAbstractAnalysisRequirement;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
import org.eclipse.tracecompass.tmf.core.project.model.ITmfPropertiesProvider;
import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.osgi.framework.Bundle;
import org.w3c.dom.Element;
/**
* Analysis module helpers for modules provided by XML files
*
* @author Geneviève Bastien
* @since 2.0
*/
public class TmfAnalysisModuleHelperXml implements IAnalysisModuleHelper, ITmfPropertiesProvider {
private static final String ICON_ANALYSIS = "/icons/analysis.png"; //$NON-NLS-1$
/**
* The types of analysis that can be XML-defined
*/
public enum XmlAnalysisModuleType {
/** Analysis will be of type XmlStateSystemModule */
STATE_SYSTEM,
/**
* Analysis will be of type XmlPatternAnalysisModule
*
* @since 2.0
*/
PATTERN
}
private final File fSourceFile;
private final Element fSourceElement;
private final XmlAnalysisModuleType fType;
/**
* Constructor
*
* @param xmlFile
* The XML file containing the details of this analysis
* @param node
* The XML node element
* @param type
* The type of analysis
*/
public TmfAnalysisModuleHelperXml(File xmlFile, Element node, XmlAnalysisModuleType type) {
fSourceFile = xmlFile;
fSourceElement = node;
fType = type;
}
@Override
public String getId() {
/*
* The attribute ID cannot be null because the XML has been validated
* and it is mandatory
*/
return fSourceElement.getAttribute(TmfXmlStrings.ID);
}
@Override
public String getName() {
String name = null;
/* Label may be available in XML header */
List<Element> head = XmlUtils.getChildElements(fSourceElement, TmfXmlStrings.HEAD);
if (head.size() == 1) {
List<Element> labels = XmlUtils.getChildElements(head.get(0), TmfXmlStrings.LABEL);
if (!labels.isEmpty()) {
name = labels.get(0).getAttribute(TmfXmlStrings.VALUE);
}
}
if (name == null) {
name = getId();
}
return name;
}
@Override
public boolean isAutomatic() {
return false;
}
/**
* @since 1.0
*/
@Override
public boolean appliesToExperiment() {
return false;
}
@Override
public String getHelpText() {
return ""; //$NON-NLS-1$
}
@Override
public String getHelpText(@NonNull ITmfTrace trace) {
return ""; //$NON-NLS-1$
}
@Override
public String getIcon() {
return ICON_ANALYSIS;
}
@Override
public Bundle getBundle() {
return Activator.getDefault().getBundle();
}
@Override
public boolean appliesToTraceType(Class<? extends ITmfTrace> traceClass) {
/* Trace types may be available in XML header */
List<Element> head = XmlUtils.getChildElements(fSourceElement, TmfXmlStrings.HEAD);
if (head.size() != 1) {
return true;
}
/*
* TODO: Test with custom trace types
*/
List<Element> elements = XmlUtils.getChildElements(head.get(0), TmfXmlStrings.TRACETYPE);
if (elements.isEmpty()) {
return true;
}
for (Element element : elements) {
String traceTypeId = element.getAttribute(TmfXmlStrings.ID);
traceTypeId = TmfTraceType.buildCompatibilityTraceTypeId(traceTypeId);
TraceTypeHelper helper = TmfTraceType.getTraceType(traceTypeId);
if ((helper != null) && helper.getTrace().getClass().isAssignableFrom(traceClass)) {
return true;
}
}
return false;
}
@Override
public Iterable<Class<? extends ITmfTrace>> getValidTraceTypes() {
return Collections.EMPTY_SET;
}
@Override
public Iterable<TmfAbstractAnalysisRequirement> getAnalysisRequirements() {
return Collections.EMPTY_SET;
}
@Override
public IAnalysisModule newModule(ITmfTrace trace) throws TmfAnalysisException {
String analysisid = getId();
IAnalysisModule module = null;
switch (fType) {
case STATE_SYSTEM:
module = new XmlStateSystemModule();
XmlStateSystemModule ssModule = (XmlStateSystemModule) module;
module.setId(analysisid);
ssModule.setXmlFile(new Path(fSourceFile.getAbsolutePath()));
break;
case PATTERN:
module = new XmlPatternAnalysis();
module.setName(getName());
module.setId(analysisid);
XmlPatternAnalysis paModule = (XmlPatternAnalysis) module;
paModule.setXmlFile(new Path(fSourceFile.getAbsolutePath()));
break;
default:
break;
}
if (module != null) {
if (module.setTrace(trace)) {
TmfAnalysisManager.analysisModuleCreated(module);
} else {
/* The analysis does not apply to the trace, dispose of the module */
module.dispose();
module = null;
}
}
return module;
}
// ------------------------------------------------------------------------
// ITmfPropertiesProvider
// ------------------------------------------------------------------------
@Override
public @NonNull Map<@NonNull String, @NonNull String> getProperties() {
Map<@NonNull String, @NonNull String> properties = new HashMap<>();
properties.put(NonNullUtils.checkNotNull(Messages.XmlModuleHelper_PropertyFile), fSourceFile.getName());
properties.put(NonNullUtils.checkNotNull(Messages.XmlModuleHelper_PropertyType), fType.name());
return properties;
}
}