/******************************************************************************* * Copyright (c) 2010, 2011 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.docs.intent.client.ui.internal.renderers; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.mylyn.docs.intent.client.ui.editor.renderers.IEditorRendererExtension; import org.eclipse.mylyn.docs.intent.core.modelingunit.ExternalContentReference; /** * Registry containing all Lock Strategy extensions that have been parsed from the * {@link IEditorRendererExtensionRegistryListener#RENDERER_EXTENSION_POINT} extension point. * * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a> */ public final class IEditorRendererExtensionRegistry { /** * The registered {@link ISaveDialogExtension}s. */ private static final Map<IEditorRendererExtension, Collection<IEditorRendererExtensionDescriptor>> EXTENSIONS = Maps .newHashMap(); /** * Utility classes don't need a default constructor. */ private IEditorRendererExtensionRegistry() { } /** * Adds an extension to the registry, with the given behavior. * * @param extensionDescriptor * The extension that is to be added to the registry */ public static void addExtension(IEditorRendererExtensionDescriptor extensionDescriptor) { IEditorRendererExtension extension = extensionDescriptor.getEditorRendererExtension(); if (EXTENSIONS.get(extension) == null) { EXTENSIONS.put(extension, new HashSet<IEditorRendererExtensionDescriptor>()); } EXTENSIONS.get(extension).add(extensionDescriptor); } /** * Removes all extensions from the registry. This will be called at plugin stopping. */ public static void clearRegistry() { EXTENSIONS.clear(); } /** * Returns a copy of the registered extensions list. * * @return A copy of the registered extensions list. */ public static Collection<IEditorRendererExtensionDescriptor> getRegisteredExtensions() { Set<IEditorRendererExtensionDescriptor> registeredExtensions = Sets.newHashSet(); for (Collection<IEditorRendererExtensionDescriptor> extensions : EXTENSIONS.values()) { registeredExtensions.addAll(extensions); } return registeredExtensions; } /** * Returns all the registered {@link IEditorRendererExtension}s defined for the given * {@link ExternalContentReference}, sorted by priority. * * @param externalContentReference * the {@link ExternalContentReference} to render * @return all the registered {@link IEditorRendererExtension}s defined for the given * {@link ExternalContentReference} */ public static Collection<IEditorRendererExtension> getEditorRendererExtensions( ExternalContentReference externalContentReference) { List<IEditorRendererExtensionDescriptor> registeredExtensions = Lists.newArrayList(); // Step 1: get all valid extension for (Collection<IEditorRendererExtensionDescriptor> extensions : EXTENSIONS.values()) { for (IEditorRendererExtensionDescriptor descriptor : extensions) { if (descriptor.getEditorRendererExtension().isRendererFor(externalContentReference)) { registeredExtensions.add(descriptor); } } } // Step 2: sort by priority Collections.sort(registeredExtensions, new Comparator<IEditorRendererExtensionDescriptor>() { public int compare(IEditorRendererExtensionDescriptor o1, IEditorRendererExtensionDescriptor o2) { return o2.getPriority() - o1.getPriority(); } }); // Step 3: return corresponding editor render Collection<IEditorRendererExtension> editorRenders = Sets.newLinkedHashSet(); for (IEditorRendererExtensionDescriptor descriptor : registeredExtensions) { editorRenders.add(descriptor.getEditorRendererExtension()); } return editorRenders; } /** * Returns all the registered {@link IEditorRendererExtension}s. * * @return all the registered {@link IEditorRendererExtension}s */ public static Collection<IEditorRendererExtension> getEditorRendererExtensions() { return EXTENSIONS.keySet(); } /** * Removes a phantom from the registry. * * @param extensionClassName * Qualified class name of the sync element which corresponding phantom is to be removed from * the registry. */ public static void removeExtension(String extensionClassName) { for (IEditorRendererExtensionDescriptor extension : getRegisteredExtensions()) { if (extension.getExtensionClassName().equals(extensionClassName)) { EXTENSIONS.get(extension.getEditorRendererExtension()).clear(); } } } }