/******************************************************************************* * Copyright (c) 2005, 2008 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ltk.internal.core.refactoring.history; import org.eclipse.che.ltk.core.refactoring.CheRefactoringContributions; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IRegistryChangeEvent; import org.eclipse.core.runtime.IRegistryChangeListener; import org.eclipse.core.runtime.Platform; import org.eclipse.ltk.core.refactoring.RefactoringContribution; import org.eclipse.ltk.core.refactoring.RefactoringCore; import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; import org.eclipse.ltk.internal.core.refactoring.Messages; import org.eclipse.ltk.internal.core.refactoring.RefactoringCoreMessages; import org.eclipse.ltk.internal.core.refactoring.RefactoringCorePlugin; import java.util.HashMap; import java.util.Map; /** * Contribution manager for refactorings. * * @since 3.2 */ public final class RefactoringContributionManager implements IRegistryChangeListener { /** The class attribute */ private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$ /** The id attribute */ private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$ /** The refactoring contributions extension point */ private static final String REFACTORING_CONTRIBUTIONS_EXTENSION_POINT = "refactoringContributions"; //$NON-NLS-1$ /** The singleton instance */ private static RefactoringContributionManager fInstance = null; /** * The refactoring contribution cache (element type: <String, * <code>RefactoringContribution></code>) */ private Map fContributionCache = null; /** * The refactoring contribution cache (element type: * <RefactoringContribution, <code>String></code>) * * @since 3.3 */ private Map fIdCache = null; /** * Creates a new refactoring contribution manager. */ private RefactoringContributionManager() { // Not instantiatable } /** * Returns the singleton instance of the refactoring contribution manager. * * @return the singleton instance */ public static RefactoringContributionManager getInstance() { if (fInstance == null) fInstance = new RefactoringContributionManager(); return fInstance; } /** * Connects this manager to the platform's extension registry. */ public void connect() { Platform.getExtensionRegistry().addRegistryChangeListener(this, RefactoringCore.ID_PLUGIN); } /** * Creates a new refactoring descriptor for the specified input data. * * @param id * the unique id of the refactoring * @param project * the project name, or <code>null</code> * @param description * a description * @param comment * the comment, or <code>null</code> * @param arguments * the argument map * @param flags * the flags * @return the refactoring descriptor * @throws IllegalArgumentException if the argument map contains invalid keys/values */ public RefactoringDescriptor createDescriptor(final String id, final String project, final String description, final String comment, final Map arguments, final int flags) throws IllegalArgumentException { Assert.isNotNull(id); Assert.isNotNull(description); Assert.isNotNull(arguments); Assert.isLegal(flags >= RefactoringDescriptor.NONE); final RefactoringContribution contribution = getRefactoringContribution(id); if (contribution != null) return contribution.createDescriptor(id, project, description, comment, arguments, flags); return new DefaultRefactoringDescriptor(id, project, description, comment, arguments, flags); } /** * Disconnects this manager from the platform's extension registry. */ public void disconnect() { Platform.getExtensionRegistry().removeRegistryChangeListener(this); } /** * Returns the refactoring contribution for the refactoring with the * specified id. * * @param id * the unique id of the refactoring * @return the refactoring contribution, or <code>null</code> if no * refactoring contribution has been registered with the specified * id */ public RefactoringContribution getRefactoringContribution(final String id) { Assert.isNotNull(id); Assert.isTrue(!"".equals(id)); //$NON-NLS-1$ populateCache(); return (RefactoringContribution)fContributionCache.get(id); } /** * Returns the refactoring id for the specified refactoring contribution. * * @param contribution * the refactoring contribution * @return the corresonding refactoring id * * @since 3.3 */ public String getRefactoringId(final RefactoringContribution contribution) { Assert.isNotNull(contribution); populateCache(); return (String)fIdCache.get(contribution); } /** * Populates the refactoring contribution cache if necessary. * * @since 3.3 */ private void populateCache() { if (fContributionCache == null || fIdCache == null) { fContributionCache = new HashMap(32); fIdCache = new HashMap(32); Map<String, String> contributions = CheRefactoringContributions.getRefactoringContributions(); contributions.forEach((id, clazz) -> { try { final Object implementation = CheRefactoringContributions.createExecutableExtension(clazz); if (implementation instanceof RefactoringContribution) { if (fContributionCache.get(id) != null) RefactoringCorePlugin.logErrorMessage( Messages.format(RefactoringCoreMessages.RefactoringCorePlugin_duplicate_warning, new String[]{id, clazz})); fContributionCache.put(id, implementation); fIdCache.put(implementation, id); } else RefactoringCorePlugin.logErrorMessage( Messages.format(RefactoringCoreMessages.RefactoringCorePlugin_creation_error, new String[]{id, clazz})); } catch (CoreException exception) { RefactoringCorePlugin.log(exception); } }); // final IConfigurationElement[] elements= Platform.getExtensionRegistry().getConfigurationElementsFor(RefactoringCore.ID_PLUGIN, // REFACTORING_CONTRIBUTIONS_EXTENSION_POINT); // for (int index= 0; index < elements.length; index++) { // final IConfigurationElement element= elements[index]; // final String attributeId= element.getAttribute(ATTRIBUTE_ID); // final String point= RefactoringCore.ID_PLUGIN + "." + REFACTORING_CONTRIBUTIONS_EXTENSION_POINT; //$NON-NLS-1$ // if (attributeId != null && !"".equals(attributeId)) { //$NON-NLS-1$ // final String className= element.getAttribute(ATTRIBUTE_CLASS); // if (className != null && !"".equals(className)) { //$NON-NLS-1$ // try { // final Object implementation= element.createExecutableExtension(ATTRIBUTE_CLASS); // if (implementation instanceof RefactoringContribution) { // if (fContributionCache.get(attributeId) != null) // RefactoringCorePlugin.logErrorMessage(Messages.format(RefactoringCoreMessages // .RefactoringCorePlugin_duplicate_warning, new String[] { attributeId, point})); // fContributionCache.put(attributeId, implementation); // fIdCache.put(implementation, attributeId); // } else // RefactoringCorePlugin.logErrorMessage(Messages.format(RefactoringCoreMessages.RefactoringCorePlugin_creation_error, new String[] { point, attributeId})); // } catch (CoreException exception) { // RefactoringCorePlugin.log(exception); // } // } else // RefactoringCorePlugin.logErrorMessage(Messages.format(RefactoringCoreMessages.RefactoringCorePlugin_missing_class_attribute, new String[] { point, attributeId, ATTRIBUTE_CLASS})); // } else // RefactoringCorePlugin.logErrorMessage(Messages.format(RefactoringCoreMessages.RefactoringCorePlugin_missing_attribute, new String[] { point, ATTRIBUTE_ID})); // } } } /** * {@inheritDoc} */ public void registryChanged(final IRegistryChangeEvent event) { fContributionCache = null; fIdCache = null; } }