TMF: Display a help text for analyses from the helper
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Fri, 9 May 2014 02:05:49 +0000 (22:05 -0400)
committerAlexandre Montplaisir <alexmonthy@voxpopuli.im>
Sat, 24 May 2014 05:53:20 +0000 (01:53 -0400)
When an analysis cannot be executed, it used to show the same message as if the
trace was not opened. Now it displays a verbose message explaining why the
analysis cannot be executed.

Change-Id: I97f1a79ac5c76362ebb9764b95fc8a7af99f963b
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/26295
Reviewed-by: Alexandre Montplaisir <alexmonthy@voxpopuli.im>
Tested-by: Hudson CI
org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/TmfAnalysisModuleHelperXml.java
org.eclipse.linuxtools.tmf.core.tests/stubs/org/eclipse/linuxtools/tmf/tests/stubs/analysis/AnalysisModuleTestHelper.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/IAnalysisModuleHelper.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/Messages.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAbstractAnalysisModule.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisModuleHelperConfigElement.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/messages.properties
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfAnalysisElement.java

index 2288bb33cca4cc09d81017f36a80659d18b9bbcc..a22601c63166716db46e774b3f6a34fa08ae08d3 100644 (file)
@@ -17,6 +17,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.linuxtools.internal.tmf.analysis.xml.ui.Activator;
 import org.eclipse.linuxtools.tmf.analysis.xml.core.module.XmlUtils;
 import org.eclipse.linuxtools.tmf.analysis.xml.core.stateprovider.TmfXmlStrings;
@@ -100,6 +101,11 @@ public class TmfAnalysisModuleHelperXml implements IAnalysisModuleHelper {
         return new String();
     }
 
+    @Override
+    public String getHelpText(@NonNull ITmfTrace trace) {
+        return ""; //$NON-NLS-1$
+    }
+
     @Override
     public String getIcon() {
         return null;
index aa9cdff3e956b970aae9e38606c00c16eaa2d7d8..b53246213c57f0127e5b6d90979d3e3ec063361e 100644 (file)
@@ -16,6 +16,7 @@ package org.eclipse.linuxtools.tmf.tests.stubs.analysis;
 import java.util.Collections;
 
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisModuleHelper;
 import org.eclipse.linuxtools.tmf.core.analysis.TmfAnalysisRequirement;
@@ -76,6 +77,11 @@ public class AnalysisModuleTestHelper implements IAnalysisModuleHelper {
         return "";
     }
 
+    @Override
+    public String getHelpText(@NonNull ITmfTrace trace) {
+        return "";
+    }
+
     @Override
     public String getIcon() {
         return "";
index 2529825958e66a378aa7816a46196adf3334ff1d..4469e9798fd017a93bfc214d21d2f6493043a2ab 100644 (file)
@@ -12,6 +12,7 @@
 
 package org.eclipse.linuxtools.tmf.core.analysis;
 
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.osgi.framework.Bundle;
@@ -67,6 +68,22 @@ public interface IAnalysisModuleHelper extends IAnalysisRequirementProvider {
      */
     String getHelpText();
 
+    /**
+     * Gets a specific help message/documentation for this analysis module
+     * applied on the given trace. This help message can add information on the
+     * status of this analysis for a given trace, whether it can be executed or
+     * not and why.
+     *
+     * This help text will be displayed to the user and may contain information
+     * on what the module does, how to use it and how to correctly generate the
+     * trace to make it available
+     *
+     * @param trace
+     *            A trace for which to get specific help message
+     * @return The generic help text
+     */
+    String getHelpText(@NonNull ITmfTrace trace);
+
     /**
      * Gets the icon for this module
      *
@@ -106,8 +123,8 @@ public interface IAnalysisModuleHelper extends IAnalysisRequirementProvider {
      * helper and initializes it with the trace.
      *
      * After the module is fully created, this method should call
-     * {@link TmfAnalysisManager#analysisModuleCreated(IAnalysisModule)} in order
-     * for the new module listeners to be executed on this module.
+     * {@link TmfAnalysisManager#analysisModuleCreated(IAnalysisModule)} in
+     * order for the new module listeners to be executed on this module.
      *
      * @param trace
      *            The trace to be linked to the module
index fb8e1eebb299b39ea1367c59ef9878ec3b484bd9..3919bf3270df8ef9905fa05ec7fe17bb6350be52 100644 (file)
@@ -43,6 +43,15 @@ public class Messages extends NLS {
     /** The trace to set was null */
     public static String TmfAbstractAnalysisModule_NullTrace;
 
+    /** Additional information on a requirement */
+    public static String TmfAnalysis_RequirementInformation;
+
+    /** Mandatory values of a requirement */
+    public static String TmfAnalysis_RequirementMandatoryValues;
+
+    /** A requirement is not fulfilled */
+    public static String TmfAnalysis_RequirementNotFulfilled;
+
     /** Running analysis */
     public static String TmfAbstractAnalysisModule_RunningAnalysis;
 
index 6ac0f8153f332759f32ff24774d01f3ab93f8acc..fefb3a4b20b391865a385a56bea520708daa9443 100644 (file)
@@ -17,6 +17,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -26,6 +27,7 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.linuxtools.internal.tmf.core.Activator;
+import org.eclipse.linuxtools.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
 import org.eclipse.linuxtools.tmf.core.component.TmfComponent;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
@@ -403,14 +405,30 @@ public abstract class TmfAbstractAnalysisModule extends TmfComponent implements
 
     /**
      * Gets the help text specific for a trace who does not have required
-     * characteristics for module to execute
+     * characteristics for module to execute. The default implementation uses
+     * the analysis requirements.
      *
      * @param trace
      *            The trace to apply the analysis to
      * @return Help text
      */
-    protected String getTraceCannotExecuteHelpText(ITmfTrace trace) {
-        return Messages.TmfAbstractAnalysisModule_AnalysisCannotExecute;
+    protected String getTraceCannotExecuteHelpText(@NonNull ITmfTrace trace) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(NLS.bind(Messages.TmfAbstractAnalysisModule_AnalysisCannotExecute, getName()));
+        for (TmfAnalysisRequirement requirement : getAnalysisRequirements()) {
+            if (!requirement.isFulfilled(trace)) {
+                builder.append("\n\n"); //$NON-NLS-1$
+                builder.append(NLS.bind(Messages.TmfAnalysis_RequirementNotFulfilled, requirement.getType()));
+                builder.append("\n"); //$NON-NLS-1$
+                builder.append(NLS.bind(Messages.TmfAnalysis_RequirementMandatoryValues, requirement.getValues(ValuePriorityLevel.MANDATORY)));
+                Set<String> information = requirement.getInformation();
+                if (!information.isEmpty()) {
+                    builder.append("\n"); //$NON-NLS-1$
+                    builder.append(NLS.bind(Messages.TmfAnalysis_RequirementInformation, information));
+                }
+            }
+        }
+        return builder.toString();
     }
 
     @Override
@@ -425,7 +443,7 @@ public abstract class TmfAbstractAnalysisModule extends TmfComponent implements
         }
         String text = getShortHelpText(trace);
         if (!canExecute(trace)) {
-            text = text + getTraceCannotExecuteHelpText(trace);
+            text = text + "\n\n" + getTraceCannotExecuteHelpText(trace); //$NON-NLS-1$
         }
         return text;
     }
index cc6116fb9d872528abd5885fa0358d217291cdab..e50762498ecf999d7928064169c213951ce59dae 100644 (file)
@@ -21,6 +21,7 @@ import org.eclipse.core.runtime.ContributorFactoryOSGi;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.linuxtools.internal.tmf.core.Activator;
 import org.eclipse.linuxtools.internal.tmf.core.analysis.TmfAnalysisModuleSourceConfigElement;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfAnalysisException;
@@ -133,23 +134,10 @@ public class TmfAnalysisModuleHelperConfigElement implements IAnalysisModuleHelp
 
     @Override
     public Iterable<TmfAnalysisRequirement> getAnalysisRequirements() {
-        /**
-         * TODO: This method returns only the requirement of the first
-         * applicable tracetype. We may assume that requirements will be the
-         * same no matter the trace type, the trace generator will know how to
-         * handle those. But this will have to be confirmed when the situation
-         * happens.
-         */
-        for (TraceTypeHelper helper : TmfTraceType.getInstance().getTraceTypeHelpers()) {
-            if (appliesToTraceType(helper.getTraceClass())) {
-                try {
-                    return newModule(helper.getTrace()).getAnalysisRequirements();
-                } catch (TmfAnalysisException e) {
-                    Activator.logError("Error in get analysis requirements", e); //$NON-NLS-1$
-                }
-            }
+        IAnalysisModule module = createModule();
+        if (module != null) {
+            return module.getAnalysisRequirements();
         }
-
         return Collections.EMPTY_SET;
     }
 
@@ -157,6 +145,18 @@ public class TmfAnalysisModuleHelperConfigElement implements IAnalysisModuleHelp
     // Functionalities
     // ---------------------------------------
 
+    private IAnalysisModule createModule() {
+        IAnalysisModule module = null;
+        try {
+            module = (IAnalysisModule) fCe.createExecutableExtension(TmfAnalysisModuleSourceConfigElement.ANALYSIS_MODULE_ATTR);
+            module.setName(getName());
+            module.setId(getId());
+        } catch (CoreException e) {
+            Activator.logError("Error getting analysis modules from configuration files", e); //$NON-NLS-1$
+        }
+        return module;
+    }
+
     @Override
     public IAnalysisModule newModule(ITmfTrace trace) throws TmfAnalysisException {
 
@@ -165,28 +165,37 @@ public class TmfAnalysisModuleHelperConfigElement implements IAnalysisModuleHelp
             throw new TmfAnalysisException(NLS.bind(Messages.TmfAnalysisModuleHelper_AnalysisDoesNotApply, getName()));
         }
 
-        IAnalysisModule module = null;
-        try {
-            module = (IAnalysisModule) fCe.createExecutableExtension(TmfAnalysisModuleSourceConfigElement.ANALYSIS_MODULE_ATTR);
-            module.setName(getName());
-            module.setId(getId());
-            module.setAutomatic(isAutomatic());
-
-            /* Get the module's parameters */
-            final IConfigurationElement[] parametersCE = fCe.getChildren(TmfAnalysisModuleSourceConfigElement.PARAMETER_ELEM);
-            for (IConfigurationElement element : parametersCE) {
-                module.addParameter(element.getAttribute(TmfAnalysisModuleSourceConfigElement.NAME_ATTR));
-                String defaultValue = element.getAttribute(TmfAnalysisModuleSourceConfigElement.DEFAULT_VALUE_ATTR);
-                if (defaultValue != null) {
-                    module.setParameter(element.getAttribute(TmfAnalysisModuleSourceConfigElement.NAME_ATTR), defaultValue);
-                }
+        IAnalysisModule module = createModule();
+        if (module == null) {
+            return null;
+        }
+
+        module.setAutomatic(isAutomatic());
+
+        /* Get the module's parameters */
+        final IConfigurationElement[] parametersCE = fCe.getChildren(TmfAnalysisModuleSourceConfigElement.PARAMETER_ELEM);
+        for (IConfigurationElement element : parametersCE) {
+            module.addParameter(element.getAttribute(TmfAnalysisModuleSourceConfigElement.NAME_ATTR));
+            String defaultValue = element.getAttribute(TmfAnalysisModuleSourceConfigElement.DEFAULT_VALUE_ATTR);
+            if (defaultValue != null) {
+                module.setParameter(element.getAttribute(TmfAnalysisModuleSourceConfigElement.NAME_ATTR), defaultValue);
             }
-            module.setTrace(trace);
-            TmfAnalysisManager.analysisModuleCreated(module);
-        } catch (CoreException e) {
-            Activator.logError("Error getting analysis modules from configuration files", e); //$NON-NLS-1$
         }
+        module.setTrace(trace);
+        TmfAnalysisManager.analysisModuleCreated(module);
+
         return module;
 
     }
+
+    @Override
+    public String getHelpText(@NonNull ITmfTrace trace) {
+        IAnalysisModule module = createModule();
+        if (module != null) {
+            String ret = module.getHelpText(trace);
+            module.dispose();
+            return ret;
+        }
+        return getHelpText();
+    }
 }
index 9744dea2547d50cb59e397d404ba7846f54a0c80..1cd4123a28e941a7a8134ff600c682ebed27b339 100644 (file)
@@ -16,6 +16,9 @@ TmfAbstractAnalysisModule_AnalysisForTrace=Analysis module: {0} for trace {1}
 TmfAbstractAnalysisModule_AnalysisModule=Analysis module: {0}
 TmfAbstractAnalysisModule_InvalidParameter=Parameter {0} is not valid for analysis module {1}
 TmfAbstractAnalysisModule_NullTrace=Setting a null trace to analysis module
+TmfAnalysis_RequirementInformation=Additional information: {0}
+TmfAnalysis_RequirementMandatoryValues=Mandatory values: {0}
+TmfAnalysis_RequirementNotFulfilled=Requirement not fulfilled: {0}
 TmfAbstractAnalysisModule_RunningAnalysis=Running analysis {0}
 TmfAnalysisManager_ErrorParameterProvider=Error instantiating parameter provider
 TmfAnalysisModuleHelper_ImpossibleToCreateModule=Could not instantiate module "{0}"
index 3855d6649821698c29154f45f836c61d6ca988d4..0b479a33df930634339326caaa34297089784674 100644 (file)
@@ -198,6 +198,10 @@ public class TmfAnalysisElement extends TmfProjectModelElement implements ITmfSt
             return new String();
         }
 
+        if (trace != null) {
+            return helper.getHelpText(trace);
+        }
+
         return helper.getHelpText();
     }
 
This page took 0.035627 seconds and 5 git commands to generate.