TMF: Create an analysis listener for the outputs defined in extension point
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Wed, 5 Feb 2014 19:16:41 +0000 (14:16 -0500)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Wed, 19 Feb 2014 15:49:06 +0000 (10:49 -0500)
For each output defined in the extension point, a new analysis module listener
is added to the analysis manager.

Change-Id: Ic4373f990c1c9656f9a9cfa6e7b008f8606c2a03
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/21580
Tested-by: Hudson CI
Reviewed-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
IP-Clean: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
Tested-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/Activator.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisManager.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisModuleOutputs.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfNewAnalysisOutputListener.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/analysis/TmfAnalysisViewOutput.java

index d864998ab4a4bfcb1b20649aedf990d8851124e7..fae189a683553767140ba31e1ff8c6a6c212e3c6 100644 (file)
@@ -84,8 +84,8 @@ public class Activator extends Plugin {
         TmfCoreTracer.init();
         /* Initialize the trace manager */
         TmfTraceManager.getInstance();
-        /* Initialize the analysis module sources */
-        TmfAnalysisManager.initializeModuleSources();
+        /* Initialize the analysis manager */
+        TmfAnalysisManager.initialize();
     }
 
     @Override
index 7a08e28490135392d3f5ef0b73486ffbd175426c..daae196dada06caee87dd7aee0f012b1f5ae1de0 100644 (file)
@@ -54,9 +54,17 @@ public class TmfAnalysisManager {
     }
 
     /**
-     * Cleans the module source list and initialize it from the extension point
+     * Initializes sources and new module listeners from the extension point
      */
-    public static void initializeModuleSources() {
+    public static void initialize() {
+        initializeModuleSources();
+        initializeNewModuleListeners();
+    }
+
+    /**
+     * Cleans the module sources list and initialize it from the extension point
+     */
+    private static void initializeModuleSources() {
         synchronized (fSources) {
             fSources.clear();
             for (IAnalysisModuleSource source : TmfAnalysisModuleSources.getSources()) {
@@ -65,6 +73,19 @@ public class TmfAnalysisManager {
         }
     }
 
+    /**
+     * Cleans the new module listeners list and initialize it from the extension
+     * point
+     */
+    private static void initializeNewModuleListeners() {
+        synchronized (fListeners) {
+            fListeners.clear();
+            for (ITmfNewAnalysisModuleListener output : TmfAnalysisModuleOutputs.getOutputListeners()) {
+                fListeners.add(output);
+            }
+        }
+    }
+
     /**
      * Gets all available analysis module helpers
      *
diff --git a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisModuleOutputs.java b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisModuleOutputs.java
new file mode 100644 (file)
index 0000000..70914d7
--- /dev/null
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2014 École Polytechnique de Montréal
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.core.analysis;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.linuxtools.internal.tmf.core.Activator;
+
+/**
+ * Utility class for accessing TMF analysis module extensions from the
+ * platform's extensions registry and returning the modules' outputs, wrapped as
+ * new module listeners.
+ *
+ * @author Geneviève Bastien
+ * @since 3.0
+ */
+public class TmfAnalysisModuleOutputs {
+
+    /** Extension point ID */
+    public static final String TMF_ANALYSIS_TYPE_ID = "org.eclipse.linuxtools.tmf.core.analysis"; //$NON-NLS-1$
+
+    /** Extension point element 'output' */
+    public static final String OUTPUT_ELEM = "output"; //$NON-NLS-1$
+
+    /** Extension point attribute 'outputClass' */
+    public static final String CLASS_ATTR = "class"; //$NON-NLS-1$
+
+    /** Extension point attribute 'id' */
+    public static final String ID_ATTR = "id"; //$NON-NLS-1$
+
+    /**
+     * Extension point element 'analysisId' to associate the output to a single
+     * analysis
+     */
+    public static final String ANALYSIS_ID_ELEM = "analysisId"; //$NON-NLS-1$
+
+    /**
+     * Extension point element 'analysisModuleClass' to associate the output
+     * with an analysis module class
+     */
+    public static final String MODULE_CLASS_ELEM = "analysisModuleClass"; //$NON-NLS-1$
+
+    private TmfAnalysisModuleOutputs() {
+
+    }
+
+    /**
+     * Return the analysis module outputs, wrapped as new module listeners,
+     * advertised in the extension point, in iterable format.
+     *
+     * @return List of {@link ITmfNewAnalysisModuleListener}
+     */
+    public static Iterable<ITmfNewAnalysisModuleListener> getOutputListeners() {
+        List<ITmfNewAnalysisModuleListener> newModuleListeners = new ArrayList<>();
+        // Get the sources element from the extension point
+        IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(TMF_ANALYSIS_TYPE_ID);
+        for (IConfigurationElement ce : config) {
+            String elementName = ce.getName();
+            if (elementName.equals(OUTPUT_ELEM)) {
+                try {
+                    IAnalysisOutput output = (IAnalysisOutput) ce.createExecutableExtension(CLASS_ATTR);
+                    ITmfNewAnalysisModuleListener listener = null;
+                    for (IConfigurationElement childCe : ce.getChildren()) {
+                        if (childCe.getName().equals(ANALYSIS_ID_ELEM)) {
+                            listener = new TmfNewAnalysisOutputListener(output, childCe.getAttribute(ID_ATTR), null);
+                        } else if (childCe.getName().equals(MODULE_CLASS_ELEM)) {
+                            listener = new TmfNewAnalysisOutputListener(output, null, (Class<? extends IAnalysisModule>) childCe.createExecutableExtension(CLASS_ATTR).getClass());
+                        }
+                    }
+                    if (listener != null) {
+                        newModuleListeners.add(listener);
+                    }
+                } catch (InvalidRegistryObjectException | CoreException e) {
+                    Activator.logError("Error creating module output listener", e); //$NON-NLS-1$
+                }
+            }
+        }
+        return newModuleListeners;
+    }
+}
diff --git a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfNewAnalysisOutputListener.java b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfNewAnalysisOutputListener.java
new file mode 100644 (file)
index 0000000..2412f1b
--- /dev/null
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2014 École Polytechnique de Montréal
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.core.analysis;
+
+/**
+ * This class listens when new analysis modules are created and registers an
+ * output if the module corresponds to the output specifications
+ *
+ * @author Geneviève Bastien
+ * @since 3.0
+ */
+public class TmfNewAnalysisOutputListener implements ITmfNewAnalysisModuleListener {
+
+    private final String fAnalysisId;
+    private final Class<? extends IAnalysisModule> fAnalysisModuleClass;
+    private final IAnalysisOutput fOutput;
+
+    /**
+     * Constructor
+     *
+     * @param output
+     *            The analysis output to add if the analysis corresponds to the
+     *            ID or class
+     * @param analysisId
+     *            The analysis ID of the single analysis to match
+     * @param moduleClass
+     *            The module class this output applies to
+     */
+    public TmfNewAnalysisOutputListener(IAnalysisOutput output, String analysisId, Class<? extends IAnalysisModule> moduleClass) {
+        fOutput = output;
+        fAnalysisId = analysisId;
+        fAnalysisModuleClass = moduleClass;
+    }
+
+    @Override
+    public void moduleCreated(IAnalysisModule module) {
+        if (fAnalysisId != null) {
+            if (module.getId().equals(fAnalysisId)) {
+                module.registerOutput(fOutput);
+            }
+        } else if (fAnalysisModuleClass != null) {
+            if (fAnalysisModuleClass.isAssignableFrom(module.getClass())) {
+                module.registerOutput(fOutput);
+            }
+        }
+    }
+
+}
index d5de7d09a78b188bee12065f77932c70d699ae52..8f0dba302850fd9f95d8f3be751c70c66bf31668 100644 (file)
 
 package org.eclipse.linuxtools.tmf.ui.analysis;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
 import org.eclipse.linuxtools.internal.tmf.ui.Activator;
 import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisOutput;
+import org.eclipse.linuxtools.tmf.core.analysis.TmfAnalysisModuleOutputs;
 import org.eclipse.linuxtools.tmf.ui.project.model.Messages;
 import org.eclipse.linuxtools.tmf.ui.project.model.TraceUtils;
 import org.eclipse.swt.widgets.Display;
@@ -31,9 +35,16 @@ import org.eclipse.ui.views.IViewDescriptor;
  * @author Geneviève Bastien
  * @since 3.0
  */
-public class TmfAnalysisViewOutput implements IAnalysisOutput {
+public class TmfAnalysisViewOutput implements IAnalysisOutput, IExecutableExtension {
 
-    private final String fViewId;
+    private String fViewId;
+
+    /**
+     * Default constructor
+     */
+    public TmfAnalysisViewOutput() {
+
+    }
 
     /**
      * Constructor
@@ -80,4 +91,9 @@ public class TmfAnalysisViewOutput implements IAnalysisOutput {
             }
         });
     }
+
+    @Override
+    public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+        fViewId = config.getAttribute(TmfAnalysisModuleOutputs.ID_ATTR);
+    }
 }
This page took 0.031049 seconds and 5 git commands to generate.