b955a1a5195be67e66dfb562d6ef312734624511
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.analysis.xml.core / src / org / eclipse / tracecompass / internal / tmf / analysis / xml / core / module / TmfAnalysisModuleHelperXml.java
1 /*******************************************************************************
2 * Copyright (c) 2014, 2016 École Polytechnique de Montréal
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
10 package org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module;
11
12 import java.io.File;
13 import java.util.Collections;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 import org.eclipse.core.runtime.Path;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.eclipse.tracecompass.common.core.NonNullUtils;
21 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.Activator;
22 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.pattern.stateprovider.XmlPatternAnalysis;
23 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.stateprovider.TmfXmlStrings;
24 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.stateprovider.XmlStateSystemModule;
25 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
26 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
27 import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
28 import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAbstractAnalysisRequirement;
29 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
30 import org.eclipse.tracecompass.tmf.core.project.model.ITmfPropertiesProvider;
31 import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
32 import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper;
33 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
34 import org.osgi.framework.Bundle;
35 import org.w3c.dom.Element;
36
37 /**
38 * Analysis module helpers for modules provided by XML files
39 *
40 * @author Geneviève Bastien
41 * @since 2.0
42 */
43 public class TmfAnalysisModuleHelperXml implements IAnalysisModuleHelper, ITmfPropertiesProvider {
44
45 /**
46 * The types of analysis that can be XML-defined
47 */
48 public enum XmlAnalysisModuleType {
49 /** Analysis will be of type XmlStateSystemModule */
50 STATE_SYSTEM,
51
52 /**
53 * Analysis will be of type XmlPatternAnalysisModule
54 *
55 * @since 2.0
56 */
57 PATTERN
58 }
59
60 private final File fSourceFile;
61 private final Element fSourceElement;
62 private final XmlAnalysisModuleType fType;
63
64 /**
65 * Constructor
66 *
67 * @param xmlFile
68 * The XML file containing the details of this analysis
69 * @param node
70 * The XML node element
71 * @param type
72 * The type of analysis
73 */
74 public TmfAnalysisModuleHelperXml(File xmlFile, Element node, XmlAnalysisModuleType type) {
75 fSourceFile = xmlFile;
76 fSourceElement = node;
77 fType = type;
78 }
79
80 @Override
81 public String getId() {
82 /*
83 * The attribute ID cannot be null because the XML has been validated
84 * and it is mandatory
85 */
86 return fSourceElement.getAttribute(TmfXmlStrings.ID);
87 }
88
89 @Override
90 public String getName() {
91 String name = null;
92 /* Label may be available in XML header */
93 List<Element> head = XmlUtils.getChildElements(fSourceElement, TmfXmlStrings.HEAD);
94 if (head.size() == 1) {
95 List<Element> labels = XmlUtils.getChildElements(head.get(0), TmfXmlStrings.LABEL);
96 if (!labels.isEmpty()) {
97 name = labels.get(0).getAttribute(TmfXmlStrings.VALUE);
98 }
99 }
100
101 if (name == null) {
102 name = getId();
103 }
104 return name;
105 }
106
107 @Override
108 public boolean isAutomatic() {
109 return false;
110 }
111
112 /**
113 * @since 1.0
114 */
115 @Override
116 public boolean appliesToExperiment() {
117 return false;
118 }
119
120 @Override
121 public String getHelpText() {
122 return ""; //$NON-NLS-1$
123 }
124
125 @Override
126 public String getHelpText(@NonNull ITmfTrace trace) {
127 return ""; //$NON-NLS-1$
128 }
129
130 @Override
131 public String getIcon() {
132 return null;
133 }
134
135 @Override
136 public Bundle getBundle() {
137 return Activator.getDefault().getBundle();
138 }
139
140 @Override
141 public boolean appliesToTraceType(Class<? extends ITmfTrace> traceClass) {
142 /* Trace types may be available in XML header */
143 List<Element> head = XmlUtils.getChildElements(fSourceElement, TmfXmlStrings.HEAD);
144 if (head.size() != 1) {
145 return true;
146 }
147 /*
148 * TODO: Test with custom trace types
149 */
150 List<Element> elements = XmlUtils.getChildElements(head.get(0), TmfXmlStrings.TRACETYPE);
151 if (elements.isEmpty()) {
152 return true;
153 }
154
155 for (Element element : elements) {
156 String traceTypeId = element.getAttribute(TmfXmlStrings.ID);
157 traceTypeId = TmfTraceType.buildCompatibilityTraceTypeId(traceTypeId);
158 TraceTypeHelper helper = TmfTraceType.getTraceType(traceTypeId);
159 if ((helper != null) && helper.getTrace().getClass().isAssignableFrom(traceClass)) {
160 return true;
161 }
162 }
163 return false;
164 }
165
166 @Override
167 public Iterable<Class<? extends ITmfTrace>> getValidTraceTypes() {
168 return Collections.EMPTY_SET;
169 }
170
171 @Override
172 public Iterable<TmfAbstractAnalysisRequirement> getAnalysisRequirements() {
173 return Collections.EMPTY_SET;
174 }
175
176 @Override
177 public IAnalysisModule newModule(ITmfTrace trace) throws TmfAnalysisException {
178 String analysisid = getId();
179 IAnalysisModule module = null;
180 switch (fType) {
181 case STATE_SYSTEM:
182 module = new XmlStateSystemModule();
183 XmlStateSystemModule ssModule = (XmlStateSystemModule) module;
184 module.setId(analysisid);
185 ssModule.setXmlFile(new Path(fSourceFile.getAbsolutePath()));
186
187 /*
188 * FIXME: There is no way to know if a module is automatic, so we
189 * default to true
190 */
191 ssModule.setAutomatic(true);
192
193 break;
194 case PATTERN:
195 module = new XmlPatternAnalysis();
196 module.setName(getName());
197 module.setId(analysisid);
198 XmlPatternAnalysis paModule = (XmlPatternAnalysis) module;
199 paModule.setXmlFile(new Path(fSourceFile.getAbsolutePath()));
200
201 /*
202 * FIXME: Maybe the pattern analysis should not be automatic.
203 */
204 paModule.setAutomatic(true);
205
206 break;
207 default:
208 break;
209
210 }
211 if (module != null) {
212 if (module.setTrace(trace)) {
213 TmfAnalysisManager.analysisModuleCreated(module);
214 } else {
215 /* The analysis does not apply to the trace, dispose of the module */
216 module.dispose();
217 module = null;
218 }
219 }
220
221 return module;
222 }
223
224 // ------------------------------------------------------------------------
225 // ITmfPropertiesProvider
226 // ------------------------------------------------------------------------
227
228 @Override
229 public @NonNull Map<@NonNull String, @NonNull String> getProperties() {
230 Map<@NonNull String, @NonNull String> properties = new HashMap<>();
231 properties.put(NonNullUtils.checkNotNull(Messages.XmlModuleHelper_PropertyFile), fSourceFile.getName());
232 properties.put(NonNullUtils.checkNotNull(Messages.XmlModuleHelper_PropertyType), fType.name());
233 return properties;
234 }
235
236 }
This page took 0.036548 seconds and 4 git commands to generate.