/******************************************************************************* * 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.tracecompass.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.jdt.annotation.NonNull; import org.eclipse.tracecompass.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 */ 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$ /** Extension point element 'listener' */ private static final String LISTENER_ELEM = "listener"; //$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<@NonNull ITmfNewAnalysisModuleListener> getOutputListeners() { List<@NonNull 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(); ITmfNewAnalysisModuleListener listener = null; if (elementName.equals(OUTPUT_ELEM)) { listener = getListenerFromOutputElement(ce); } else if (elementName.equals(LISTENER_ELEM)) { listener = getListenerFromListenerElement(ce); } if (listener != null) { newModuleListeners.add(listener); } } return newModuleListeners; } private static ITmfNewAnalysisModuleListener getListenerFromOutputElement(IConfigurationElement ce) { ITmfNewAnalysisModuleListener listener = null; try { IAnalysisOutput output = (IAnalysisOutput) ce.createExecutableExtension(CLASS_ATTR); if (output == null) { Activator.logWarning("An output could not be created"); //$NON-NLS-1$ return listener; } 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)) { String contributorName = childCe.getContributor().getName(); Class<?> moduleClass = Platform.getBundle(contributorName).loadClass(childCe.getAttribute(CLASS_ATTR)); listener = new TmfNewAnalysisOutputListener(output, null, moduleClass.asSubclass(IAnalysisModule.class)); } } } catch (InvalidRegistryObjectException | CoreException | ClassNotFoundException e) { Activator.logError("Error creating module output listener", e); //$NON-NLS-1$ } return listener; } private static ITmfNewAnalysisModuleListener getListenerFromListenerElement(IConfigurationElement ce) { ITmfNewAnalysisModuleListener listener = null; try { listener = (ITmfNewAnalysisModuleListener) ce.createExecutableExtension(CLASS_ATTR); } catch (CoreException e) { Activator.logError("Error creating new module listener", e); //$NON-NLS-1$ } return listener; } }