/******************************************************************************* * Copyright (c) 2010 Alena Laskavaia * 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: * Alena Laskavaia - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.codan.internal.ui.views; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import org.eclipse.cdt.codan.internal.ui.CodanUIActivator; import org.eclipse.cdt.codan.ui.AbstractCodanProblemDetailsProvider; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; /** * Class that can load extension for problemDetails */ public class ProblemDetailsExtensions { public static final String ALL = "*";//$NON-NLS-1$ private static final String EXTENSION_POINT_NAME = "codanProblemDetails"; //$NON-NLS-1$ private static boolean extensionsLoaded; private static HashMap<String, Collection<?>> map = new HashMap<String, Collection<?>>(); private static synchronized void readExtensions() { if (extensionsLoaded) return; IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(CodanUIActivator.PLUGIN_ID, EXTENSION_POINT_NAME); if (ep == null) return; try { IConfigurationElement[] elements = ep.getConfigurationElements(); // process categories for (int i = 0; i < elements.length; i++) { IConfigurationElement configurationElement = elements[i]; processDetails(configurationElement); } } finally { extensionsLoaded = true; } } /** * @param configurationElement */ private static void processDetails(IConfigurationElement configurationElement) { if (configurationElement.getName().equals("problemDetails")) { //$NON-NLS-1$ String id = configurationElement.getAttribute("problemId"); //$NON-NLS-1$ if (id == null) { id = ALL; } addExtension(id, configurationElement); } } public static AbstractCodanProblemDetailsProvider resolveClass(IConfigurationElement configurationElement) { AbstractCodanProblemDetailsProvider res; try { res = (AbstractCodanProblemDetailsProvider) configurationElement.createExecutableExtension("class");//$NON-NLS-1$ } catch (CoreException e) { CodanUIActivator.log(e); return null; } return res; } @SuppressWarnings({ "unchecked", "rawtypes" }) private static void addExtension(String id, IConfigurationElement configurationElement) { Collection collection = getCollection(id); collection.add(configurationElement); } /** * Remove provider from the list * * @param id - codan problem id or ALL * @param el - details provider (class extending * AbstractCodanProblemDetailsProvider) or ElementConfiguration (user * internally) */ @SuppressWarnings("rawtypes") public static void removeExtension(String id, Object el) { Collection collection = getCollection(id); collection.remove(el); } @SuppressWarnings("rawtypes") private static Collection getCollection(String id) { Collection collection = map.get(id); if (collection == null) { collection = new ArrayList(); map.put(id, collection); } return collection; } public static Collection<AbstractCodanProblemDetailsProvider> getProviders(String id) { readExtensions(); Collection<AbstractCodanProblemDetailsProvider> providers = new ArrayList<AbstractCodanProblemDetailsProvider>(); Collection<?> collection1 = getCollection(id); Collection<?> collection2 = getCollection(ALL); providers.addAll(resolveProviders(collection1)); providers.addAll(resolveProviders(collection2)); return providers; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static Collection<AbstractCodanProblemDetailsProvider> resolveProviders(Collection collection) { Collection res = new ArrayList(collection); for (Iterator iterator = res.iterator(); iterator.hasNext();) { Object object = iterator.next(); if (object instanceof IConfigurationElement) { // resolve collection.remove(object); AbstractCodanProblemDetailsProvider provider = resolveClass((IConfigurationElement) object); if (provider != null) collection.add(provider); } } return collection; } /** * Add extension (details provider) using API * * @param id - codan problem id or ALL * @param provider - class extending AbstractCodanProblemDetailsProvider */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static void addExtension(String id, AbstractCodanProblemDetailsProvider provider) { Collection collection = getCollection(id); collection.add(provider); } }