/******************************************************************************* * Copyright (c) 2015 É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 *******************************************************************************/ package org.eclipse.tracecompass.internal.tmf.core.analysis; import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; 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.tracecompass.internal.tmf.core.Activator; import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisParameterProvider; /** * Utility class for accessing TMF analysis parameter providers extensions from * the platform's extensions registry and returning the module parameter * providers. * * @author Geneviève Bastien */ public final class TmfAnalysisParameterProviders { /** Extension point ID */ public static final String TMF_ANALYSIS_TYPE_ID = "org.eclipse.linuxtools.tmf.core.analysis"; //$NON-NLS-1$ /** Extension point element 'module' */ public static final String PARAMETER_PROVIDER_ELEM = "parameterProvider"; //$NON-NLS-1$ /** Extension point attribute 'class' */ 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$ /* Maps a class name to an instance of a parameter provider */ private static final Map<String, IAnalysisParameterProvider> fParamProviderInstances = new HashMap<>(); private TmfAnalysisParameterProviders() { } /** * Disposes the analysis parameter providers * * @since 2.2 */ public static void dispose() { fParamProviderInstances.values().forEach(provider -> provider.dispose()); } /** * Return the analysis parameter providers advertised in the extension * point, and associated with an analysis ID. * * @param analysisId * Get the parameter providers for an analysis identified by its * ID * @return Map of analysis ID mapped to parameter provider classes */ public static Set<IAnalysisParameterProvider> getParameterProvidersFor(String analysisId) { Set<IAnalysisParameterProvider> providers = new HashSet<>(); // Get the parameter provider elements from the extension point IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(TMF_ANALYSIS_TYPE_ID); for (IConfigurationElement ce : config) { String elementName = ce.getName(); if (elementName.equals(PARAMETER_PROVIDER_ELEM)) { try { IConfigurationElement[] children = ce.getChildren(ANALYSIS_ID_ELEM); if (children.length == 0) { throw new IllegalStateException(); } String id = children[0].getAttribute(ID_ATTR); String className = ce.getAttribute(CLASS_ATTR); if (id == null || className == null) { continue; } if (analysisId.equals(id)) { IAnalysisParameterProvider provider = fParamProviderInstances.get(className); if (provider == null) { provider = checkNotNull((IAnalysisParameterProvider) ce.createExecutableExtension(CLASS_ATTR)); fParamProviderInstances.put(className, provider); } providers.add(provider); } } catch (InvalidRegistryObjectException | CoreException e) { Activator.logError("Error creating module parameter provider", e); //$NON-NLS-1$ } } } return providers; } }