tmf: Add getDocumentFromFile() to XmlUtils
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.analysis.xml.ui / src / org / eclipse / tracecompass / internal / tmf / analysis / xml / ui / module / TmfXmlAnalysisOutputSource.java
1 /*******************************************************************************
2 * Copyright (c) 2016 École Polytechnique de Montréal and others
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Geneviève Bastien - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.module;
14
15 import java.io.File;
16 import java.io.IOException;
17 import java.util.List;
18 import java.util.Map;
19
20 import javax.xml.parsers.ParserConfigurationException;
21
22 import org.eclipse.jdt.annotation.NonNull;
23 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlUtils;
24 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.pattern.stateprovider.XmlPatternAnalysis;
25 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.stateprovider.TmfXmlStrings;
26 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.Activator;
27 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.TmfXmlUiStrings;
28 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternDensityView;
29 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternLatencyTableView;
30 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternScatterGraphView;
31 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.latency.PatternStatisticsView;
32 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.timegraph.XmlTimeGraphView;
33 import org.eclipse.tracecompass.internal.tmf.analysis.xml.ui.views.xychart.XmlXYView;
34 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
35 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisOutput;
36 import org.eclipse.tracecompass.tmf.core.analysis.ITmfNewAnalysisModuleListener;
37 import org.eclipse.tracecompass.tmf.core.statesystem.ITmfAnalysisModuleWithStateSystems;
38 import org.w3c.dom.Document;
39 import org.w3c.dom.Element;
40 import org.w3c.dom.NodeList;
41 import org.xml.sax.SAXException;
42
43 /**
44 * This class searches all XML files to find outputs applicable to the newly
45 * created analysis
46 *
47 * @author Geneviève Bastien
48 */
49 public class TmfXmlAnalysisOutputSource implements ITmfNewAnalysisModuleListener {
50
51 /** String separating data elements for the output properties */
52 public static final @NonNull String DATA_SEPARATOR = ";;;"; //$NON-NLS-1$
53
54 /**
55 * Enum to match the name of a view's XML element to its view ID.
56 */
57 public static enum ViewType {
58 /**
59 * Time graph view element
60 */
61 TIME_GRAPH_VIEW(TmfXmlUiStrings.TIME_GRAPH_VIEW, XmlTimeGraphView.ID),
62 /**
63 * XY chart view element
64 */
65 XY_VIEW(TmfXmlUiStrings.XY_VIEW, XmlXYView.ID);
66
67 private final @NonNull String fXmlElem;
68 private final String fViewId;
69
70 private ViewType(@NonNull String xmlElem, String viewId) {
71 fXmlElem = xmlElem;
72 fViewId = viewId;
73 }
74
75 /**
76 * Get the XML element corresponding to this view type
77 *
78 * @return The XML element corresponding to this type
79 */
80 public @NonNull String getXmlElem() {
81 return fXmlElem;
82 }
83
84 private String getViewId() {
85 return fViewId;
86 }
87 }
88
89 /**
90 * Enum for latency view type.
91 *
92 * @author Jean-Christian Kouame
93 */
94 public static enum LatencyViewType {
95
96 /**
97 * Latency Table View type
98 */
99 LATENCY_TABLE(PatternLatencyTableView.ID, Messages.TmfXmlAnalysisOutputSource_LatencyTable),
100
101 /**
102 * Latency Scatter View type
103 */
104 SCATTER_GRAPH(PatternScatterGraphView.ID, Messages.TmfXmlAnalysisOutputSource_ScatterGraphTitle),
105
106 /**
107 * Latency Density View type
108 */
109 DENSITY_VIEW(PatternDensityView.ID, Messages.TmfXmlAnalysisOutputSource_DensityChartTitle),
110
111 /**
112 * Latency Statistic View type
113 */
114 STATISTIC_VIEW(PatternStatisticsView.ID, Messages.TmfXmlAnalysisOutputSource_LatencyStatisticsTitle);
115
116 private @NonNull String fLatencyViewId;
117 private String fLatencyViewLabel;
118
119 private LatencyViewType(@NonNull String viewId, String label) {
120 fLatencyViewId = viewId;
121 fLatencyViewLabel = label;
122 }
123
124 /**
125 * Get the ID of the latency view
126 *
127 * @return The ID
128 */
129 public String getViewId() {
130 return fLatencyViewId;
131 }
132
133 /**
134 * Get the label of the view
135 *
136 * @return The label
137 */
138 public String getLabel() {
139 return fLatencyViewLabel;
140 }
141 }
142
143 @Override
144 public void moduleCreated(IAnalysisModule module) {
145 Map<String, File> files = XmlUtils.listFiles();
146 for (File xmlFile : files.values()) {
147 if (!XmlUtils.xmlValidate(xmlFile).isOK()) {
148 continue;
149 }
150
151 try {
152 Document doc = XmlUtils.getDocumentFromFile(xmlFile);
153
154 /* get state provider views if the analysis has state systems */
155 if (module instanceof ITmfAnalysisModuleWithStateSystems) {
156 for (ViewType viewType : ViewType.values()) {
157 NodeList ssViewNodes = doc.getElementsByTagName(viewType.getXmlElem());
158 for (int i = 0; i < ssViewNodes.getLength(); i++) {
159 Element node = (Element) ssViewNodes.item(i);
160
161 /* Check if analysis is the right one */
162 List<Element> headNodes = XmlUtils.getChildElements(node, TmfXmlStrings.HEAD);
163 if (headNodes.size() != 1) {
164 continue;
165 }
166
167 List<Element> analysisNodes = XmlUtils.getChildElements(headNodes.get(0), TmfXmlStrings.ANALYSIS);
168 for (Element analysis : analysisNodes) {
169 String analysisId = analysis.getAttribute(TmfXmlStrings.ID);
170 if (analysisId.equals(module.getId())) {
171 String viewId = viewType.getViewId();
172 IAnalysisOutput output = new TmfXmlViewOutput(viewId, viewType);
173 output.setOutputProperty(TmfXmlUiStrings.XML_OUTPUT_DATA, node.getAttribute(TmfXmlStrings.ID) + DATA_SEPARATOR + xmlFile.getAbsolutePath(), false);
174 module.registerOutput(output);
175 }
176 }
177 }
178 }
179 }
180
181 // Add the latency views for pattern analysis
182 if (module instanceof XmlPatternAnalysis) {
183 for (LatencyViewType viewType : LatencyViewType.values()) {
184 IAnalysisOutput output = new TmfXmlLatencyViewOutput(viewType.getViewId(), viewType.getLabel());
185 output.setOutputProperty(TmfXmlUiStrings.XML_LATENCY_OUTPUT_DATA, module.getId() + DATA_SEPARATOR + viewType.getLabel(), false);
186 module.registerOutput(output);
187 }
188 }
189
190 } catch (ParserConfigurationException | SAXException | IOException e) {
191 Activator.logError("Error opening XML file", e); //$NON-NLS-1$
192 }
193 }
194 }
195
196 }
This page took 0.037308 seconds and 5 git commands to generate.