/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.validation; 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.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; /** * Represents a map between warning name supported by @SuppressWarnings * and the corresponding preference ID. * * @author Alexey Kazakov */ public class WarningNameManager implements IWarningNameMap { private static final WarningNameManager INSTANCE = new WarningNameManager(); private Map<String, Set<IConfigurationElement>> allExtensions; private Map<String, Set<IWarningNameMap>> maps; private Map<String, String[]> warnings; public static WarningNameManager getInstance() { return INSTANCE; } private WarningNameManager() { } /* (non-Javadoc) * @see org.jboss.tools.common.validation.IWarningNameMap#getNames(java.lang.String) */ @Override public String[] getWarningNames(String preferenceID) { init(); String[] names = null; synchronized (warnings) { names = warnings.get(preferenceID); if(names==null) { String preferenceGoupID = getPreferenceGroupID(preferenceID); Set<IWarningNameMap> mapsByID = maps.get(preferenceGoupID); if(mapsByID==null) { mapsByID = new HashSet<IWarningNameMap>(); maps.put(preferenceGoupID, mapsByID); Set<IConfigurationElement> extns = allExtensions.get(preferenceGoupID); if(extns!=null) { for (IConfigurationElement element : extns) { try { Object o = element.createExecutableExtension("class"); if(o instanceof IWarningNameMap) { mapsByID.add((IWarningNameMap)o); } else { CommonValidationPlugin.getDefault().logError("Extension of " + IWarningNameMap.EXTENSION_POINT_ID + " should refer to an instance of " + IWarningNameMap.class + ". But the actuall class declared in " + element + " refers to " + o.getClass()); } } catch (CoreException e) { CommonValidationPlugin.getDefault().logError(e); } } } } if(mapsByID.size()==1) { names = mapsByID.iterator().next().getWarningNames(preferenceID); } else { Set<String> mapNameSet = new HashSet<String>(); for (IWarningNameMap map : mapsByID) { String[] mapNames = map.getWarningNames(preferenceID); for (String n : mapNames) { mapNameSet.add(n); } } names = mapNameSet.toArray(new String[mapNameSet.size()]); } warnings.put(preferenceID, names); } } return names; } private String getPreferenceGroupID(String preferenceID) { int dot = preferenceID.lastIndexOf('.'); return dot>-1?preferenceID.substring(0, dot):preferenceID; } private synchronized void init() { if(allExtensions == null) { maps = new HashMap<String, Set<IWarningNameMap>>(); warnings = new HashMap<String, String[]>(); allExtensions = new HashMap<String, Set<IConfigurationElement>>(); IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtensionPoint extensionPoint = registry.getExtensionPoint(IWarningNameMap.EXTENSION_POINT_ID); if (extensionPoint != null) { IExtension[] extensions = extensionPoint.getExtensions(); for (int i=0; i<extensions.length; i++) { IExtension extension = extensions[i]; IConfigurationElement[] elements = extension.getConfigurationElements(); for(int j=0; j<elements.length; j++) { String preferenceGroupId = elements[j].getAttribute("preferenceGroupID"); Set<IConfigurationElement> els = allExtensions.get(preferenceGroupId); if(els==null) { els = new HashSet<IConfigurationElement>(); allExtensions.put(preferenceGroupId, els); } els.add(elements[j]); } } } } } }