blob: c5a4971a04ca246a8b16fa73f65a39f77b8b71ff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 École Polytechnique de Montréal and others
*
* 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
*
* Contributors:
* Geneviève Bastien - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.module;
import java.util.Collection;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlOutputElement;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlUtils;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.pattern.stateprovider.XmlPatternAnalysis;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternDensityView;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternLatencyTableView;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternScatterGraphView;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternStatisticsView;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.timegraph.XmlTimeGraphView;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.xychart.XmlXYView;
import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlStrings;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisOutput;
import org.eclipse.tracecompass.tmf.core.analysis.ITmfNewAnalysisModuleListener;
import org.eclipse.tracecompass.tmf.core.statesystem.ITmfAnalysisModuleWithStateSystems;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
/**
* This class searches all XML files to find outputs applicable to the newly
* created analysis
*
* @author Geneviève Bastien
*/
public class TmfXmlAnalysisOutputSource implements ITmfNewAnalysisModuleListener {
private static final String LATENCY_STRING = "Latency"; //$NON-NLS-1$
/** String separating data elements for the output properties */
public static final @NonNull String DATA_SEPARATOR = ";;;"; //$NON-NLS-1$
/**
* Enum to match the name of a view's XML element to its view ID.
*/
public static enum ViewType {
/**
* Time graph view element
*/
TIME_GRAPH_VIEW(XmlUtils.OutputType.TIME_GRAPH, XmlTimeGraphView.ID),
/**
* XY chart view element
*/
XY_VIEW(XmlUtils.OutputType.XY, XmlXYView.ID);
private final XmlUtils.OutputType fOutputType;
private final String fViewId;
private ViewType(XmlUtils.OutputType outputType, String viewId) {
fOutputType = outputType;
fViewId = viewId;
}
/**
* Get the XML element corresponding to this view type
*
* @return The XML element corresponding to this type
*/
public @NonNull String getXmlElem() {
return fOutputType.getXmlElem();
}
private String getViewId() {
return fViewId;
}
}
/**
* Enum for latency view type.
*
* @author Jean-Christian Kouame
*/
public static enum LatencyViewType {
/**
* Latency Table View type
*/
LATENCY_TABLE(PatternLatencyTableView.ID, Messages.TmfXmlAnalysisOutputSource_LatencyTable),
/**
* Latency Scatter View type
*/
SCATTER_GRAPH(PatternScatterGraphView.ID, Messages.TmfXmlAnalysisOutputSource_ScatterGraphTitle),
/**
* Latency Density View type
*/
DENSITY_VIEW(PatternDensityView.ID, Messages.TmfXmlAnalysisOutputSource_DensityChartTitle),
/**
* Latency Statistic View type
*/
STATISTIC_VIEW(PatternStatisticsView.ID, Messages.TmfXmlAnalysisOutputSource_LatencyStatisticsTitle);
private @NonNull String fLatencyViewId;
private String fLatencyViewLabel;
private LatencyViewType(@NonNull String viewId, String label) {
fLatencyViewId = viewId;
fLatencyViewLabel = label;
}
/**
* Get the ID of the latency view
*
* @return The ID
*/
public String getViewId() {
return fLatencyViewId;
}
/**
* Get the label of the view
*
* @return The label
*/
public String getLabel() {
return fLatencyViewLabel;
}
}
@Override
public void moduleCreated(IAnalysisModule module) {
if (module instanceof ITmfAnalysisModuleWithStateSystems) {
Multimap<String, XmlOutputElement> outputs = XmlUtils.getXmlOutputElements();
for (Collection<XmlOutputElement> elements : outputs.asMap().values()) {
for (ViewType viewType : ViewType.values()) {
Iterable<XmlOutputElement> filteredElements = Iterables.filter(elements, element -> (element.getXmlElem().equals(viewType.getXmlElem()) && element.getAnalyses().contains(module.getId())));
String viewId = viewType.getViewId();
for (XmlOutputElement element : filteredElements) {
IAnalysisOutput output = new TmfXmlViewOutput(viewId, viewType);
output.setOutputProperty(TmfXmlStrings.XML_OUTPUT_DATA, element.getId() + DATA_SEPARATOR + element.getPath() + DATA_SEPARATOR + element.getLabel(), false);
module.registerOutput(output);
}
}
}
}
// Add the latency views for pattern analysis
if (module instanceof XmlPatternAnalysis) {
for (LatencyViewType viewType : LatencyViewType.values()) {
String viewLabelPrefix = ((XmlPatternAnalysis) module).getViewLabelPrefix();
String label = viewLabelPrefix.isEmpty() ? viewType.getLabel() : viewType.getLabel().replaceFirst(LATENCY_STRING, viewLabelPrefix);
IAnalysisOutput output = new TmfXmlLatencyViewOutput(viewType.getViewId(), label);
output.setOutputProperty(TmfXmlStrings.XML_LATENCY_OUTPUT_DATA, module.getId() + DATA_SEPARATOR + output.getName(), false);
module.registerOutput(output);
}
}
}
}