1 /*******************************************************************************
2 * Copyright (c) 2013, 2014 École Polytechnique de Montréal
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
10 * Geneviève Bastien - Initial API and implementation
11 * Mathieu Rail - Added functionality for getting a module's requirements
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.core
.analysis
;
16 import java
.util
.Collections
;
17 import java
.util
.HashSet
;
20 import org
.eclipse
.core
.runtime
.ContributorFactoryOSGi
;
21 import org
.eclipse
.core
.runtime
.CoreException
;
22 import org
.eclipse
.core
.runtime
.IConfigurationElement
;
23 import org
.eclipse
.core
.runtime
.InvalidRegistryObjectException
;
24 import org
.eclipse
.jdt
.annotation
.NonNull
;
25 import org
.eclipse
.osgi
.util
.NLS
;
26 import org
.eclipse
.tracecompass
.internal
.tmf
.core
.Activator
;
27 import org
.eclipse
.tracecompass
.internal
.tmf
.core
.analysis
.TmfAnalysisModuleSourceConfigElement
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.exceptions
.TmfAnalysisException
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.project
.model
.TmfTraceType
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.project
.model
.TraceTypeHelper
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
32 import org
.osgi
.framework
.Bundle
;
35 * Analysis module helper for modules provided by a plugin's configuration
38 * @author Geneviève Bastien
40 public class TmfAnalysisModuleHelperConfigElement
implements IAnalysisModuleHelper
{
42 private final IConfigurationElement fCe
;
48 * The source {@link IConfigurationElement} of this module helper
50 public TmfAnalysisModuleHelperConfigElement(IConfigurationElement ce
) {
54 // ----------------------------------------
55 // Wrappers to {@link IAnalysisModule} methods
56 // ----------------------------------------
59 public String
getId() {
60 String id
= fCe
.getAttribute(TmfAnalysisModuleSourceConfigElement
.ID_ATTR
);
62 throw new IllegalStateException();
68 public String
getName() {
69 String name
= fCe
.getAttribute(TmfAnalysisModuleSourceConfigElement
.NAME_ATTR
);
71 throw new IllegalStateException();
77 public boolean isAutomatic() {
78 return Boolean
.parseBoolean(fCe
.getAttribute(TmfAnalysisModuleSourceConfigElement
.AUTOMATIC_ATTR
));
82 public String
getHelpText() {
84 * FIXME: No need to externalize this. A better solution will be found
85 * soon and this string is just temporary
87 return new String("The trace must be opened to get the help message"); //$NON-NLS-1$
91 public String
getIcon() {
92 return fCe
.getAttribute(TmfAnalysisModuleSourceConfigElement
.ICON_ATTR
);
96 public Bundle
getBundle() {
97 return ContributorFactoryOSGi
.resolve(fCe
.getContributor());
101 public boolean appliesToTraceType(Class
<?
extends ITmfTrace
> traceclass
) {
102 boolean applies
= false;
104 /* Get the module's applying tracetypes */
105 final IConfigurationElement
[] tracetypeCE
= fCe
.getChildren(TmfAnalysisModuleSourceConfigElement
.TRACETYPE_ELEM
);
106 for (IConfigurationElement element
: tracetypeCE
) {
109 applyclass
= getBundle().loadClass(element
.getAttribute(TmfAnalysisModuleSourceConfigElement
.CLASS_ATTR
));
110 String classAppliesVal
= element
.getAttribute(TmfAnalysisModuleSourceConfigElement
.APPLIES_ATTR
);
111 boolean classApplies
= true;
112 if (classAppliesVal
!= null) {
113 classApplies
= Boolean
.parseBoolean(classAppliesVal
);
116 applies
|= applyclass
.isAssignableFrom(traceclass
);
118 /* If the trace type does not apply, reset the applies variable to false */
119 if (applyclass
.isAssignableFrom(traceclass
)) {
123 } catch (ClassNotFoundException e
) {
124 Activator
.logError("Error in applies to trace", e
); //$NON-NLS-1$
125 } catch (InvalidRegistryObjectException e
) {
126 Activator
.logError("Error in applies to trace", e
); //$NON-NLS-1$
133 public Iterable
<Class
<?
extends ITmfTrace
>> getValidTraceTypes() {
134 Set
<Class
<?
extends ITmfTrace
>> traceTypes
= new HashSet
<>();
136 for (TraceTypeHelper tth
: TmfTraceType
.getTraceTypeHelpers()) {
137 if (appliesToTraceType(tth
.getTraceClass())) {
138 traceTypes
.add(tth
.getTraceClass());
146 public Iterable
<TmfAnalysisRequirement
> getAnalysisRequirements() {
147 IAnalysisModule module
= createModule();
148 if (module
!= null) {
149 return module
.getAnalysisRequirements();
151 return Collections
.EMPTY_SET
;
155 // ---------------------------------------
157 // ---------------------------------------
159 private IAnalysisModule
createModule() {
160 IAnalysisModule module
= null;
162 module
= (IAnalysisModule
) fCe
.createExecutableExtension(TmfAnalysisModuleSourceConfigElement
.ANALYSIS_MODULE_ATTR
);
163 module
.setName(getName());
164 module
.setId(getId());
165 } catch (CoreException e
) {
166 Activator
.logError("Error getting analysis modules from configuration files", e
); //$NON-NLS-1$
172 public IAnalysisModule
newModule(ITmfTrace trace
) throws TmfAnalysisException
{
174 /* Check that analysis can be executed */
175 if (!appliesToTraceType(trace
.getClass())) {
176 throw new TmfAnalysisException(NLS
.bind(Messages
.TmfAnalysisModuleHelper_AnalysisDoesNotApply
, getName()));
179 IAnalysisModule module
= createModule();
180 if (module
== null) {
184 module
.setAutomatic(isAutomatic());
186 /* Get the module's parameters */
187 final IConfigurationElement
[] parametersCE
= fCe
.getChildren(TmfAnalysisModuleSourceConfigElement
.PARAMETER_ELEM
);
188 for (IConfigurationElement element
: parametersCE
) {
189 String paramName
= element
.getAttribute(TmfAnalysisModuleSourceConfigElement
.NAME_ATTR
);
190 if (paramName
== null) {
193 module
.addParameter(paramName
);
194 String defaultValue
= element
.getAttribute(TmfAnalysisModuleSourceConfigElement
.DEFAULT_VALUE_ATTR
);
195 if (defaultValue
!= null) {
196 module
.setParameter(paramName
, defaultValue
);
199 module
.setTrace(trace
);
200 TmfAnalysisManager
.analysisModuleCreated(module
);
207 public String
getHelpText(@NonNull ITmfTrace trace
) {
208 IAnalysisModule module
= createModule();
209 if (module
!= null) {
210 String ret
= module
.getHelpText(trace
);
214 return getHelpText();