From b63291e61778040dc1ebc9ecaa5584c1e36b8cd0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Genevi=C3=A8ve=20Bastien?= Date: Wed, 5 Feb 2014 14:16:41 -0500 Subject: [PATCH] TMF: Create an analysis listener for the outputs defined in extension point MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-on: https://git.eclipse.org/r/21580 Tested-by: Hudson CI Reviewed-by: Marc-Andre Laperle IP-Clean: Marc-Andre Laperle Tested-by: Marc-Andre Laperle --- .../internal/tmf/core/Activator.java | 4 +- .../tmf/core/analysis/TmfAnalysisManager.java | 25 ++++- .../analysis/TmfAnalysisModuleOutputs.java | 95 +++++++++++++++++++ .../TmfNewAnalysisOutputListener.java | 58 +++++++++++ .../ui/analysis/TmfAnalysisViewOutput.java | 20 +++- 5 files changed, 196 insertions(+), 6 deletions(-) create mode 100644 org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisModuleOutputs.java create mode 100644 org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfNewAnalysisOutputListener.java diff --git a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/Activator.java b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/Activator.java index d864998ab4..fae189a683 100644 --- a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/Activator.java +++ b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/Activator.java @@ -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 diff --git a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisManager.java b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisManager.java index 7a08e28490..daae196dad 100644 --- a/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisManager.java +++ b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisManager.java @@ -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 index 0000000000..70914d72e7 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfAnalysisModuleOutputs.java @@ -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 getOutputListeners() { + List 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) 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 index 0000000000..2412f1bb6f --- /dev/null +++ b/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/analysis/TmfNewAnalysisOutputListener.java @@ -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 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 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); + } + } + } + +} diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/analysis/TmfAnalysisViewOutput.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/analysis/TmfAnalysisViewOutput.java index d5de7d09a7..8f0dba3028 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/analysis/TmfAnalysisViewOutput.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/analysis/TmfAnalysisViewOutput.java @@ -12,8 +12,12 @@ 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); + } } -- 2.34.1