/******************************************************************************* * Copyright (c) 2012 SAP AG. * 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: * Stefan Lay (SAP AG) - initial implementation *******************************************************************************/ package org.eclipse.egit.ui.internal.clone; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.internal.UIIcons; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.egit.ui.internal.provisional.wizards.IRepositorySearchResult; import org.eclipse.egit.ui.internal.provisional.wizards.IRepositoryServerProvider; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.wizard.WizardPage; import org.osgi.framework.Bundle; /** * Provides access to the extensions of the cloneSourceProvider extension point */ public class GitCloneSourceProviderExtension { private static final String CLONE_SOURCE_PROVIDER_ID = "org.eclipse.egit.ui.cloneSourceProvider"; //$NON-NLS-1$ /** * @return the list of {@code CloneSourceProvider} read from the extension * point registry */ public static List<CloneSourceProvider> getCloneSourceProvider() { List<CloneSourceProvider> cloneSourceProvider = new ArrayList<>(); IExtensionRegistry registry = Platform.getExtensionRegistry(); IConfigurationElement[] config = registry .getConfigurationElementsFor(CLONE_SOURCE_PROVIDER_ID); if (config.length > 0) addCloneSourceProvider(cloneSourceProvider, config, 0); return cloneSourceProvider; } private static void addCloneSourceProvider( List<CloneSourceProvider> cloneSourceProvider, IConfigurationElement[] config, int index) { try { int myIndex = index; String label = config[myIndex].getAttribute("label"); //$NON-NLS-1$ boolean hasFixLocation = Boolean.valueOf( config[myIndex].getAttribute("hasFixLocation")).booleanValue(); //$NON-NLS-1$ String iconPath = config[myIndex].getAttribute("icon"); //$NON-NLS-1$ ImageDescriptor icon = null; if (iconPath != null) { Bundle declaringBundle = Platform.getBundle(config[myIndex] .getDeclaringExtension().getNamespaceIdentifier()); icon = ImageDescriptor.createFromURL(declaringBundle.getResource(iconPath)); } myIndex++; IConfigurationElement serverProviderElement = null; if (myIndex < config.length && config[myIndex].getName().equals("repositoryServerProvider")) { //$NON-NLS-1$ serverProviderElement = config[myIndex]; myIndex++; } IConfigurationElement pageElement = null; if (myIndex < config.length && config[myIndex].getName().equals("repositorySearchPage")) { //$NON-NLS-1$ pageElement = config[myIndex]; myIndex++; } cloneSourceProvider.add(new CloneSourceProvider(label, serverProviderElement, pageElement, hasFixLocation, icon)); if (myIndex == config.length) return; addCloneSourceProvider(cloneSourceProvider, config, myIndex); } catch (Exception e) { Activator.logError("Could not create extension provided by " + //$NON-NLS-1$ Platform.getBundle(config[index].getDeclaringExtension().getNamespaceIdentifier()), e); } } /** * Encapsulates a clone source provided by an extension of the extension * point "org.eclipse.egit.ui.cloneSourceProvider" */ public static class CloneSourceProvider { /** * The constant provider used for local repositories */ public static final CloneSourceProvider LOCAL = new CloneSourceProvider( UIText.GitCloneSourceProviderExtension_Local, null, null, true, UIIcons.REPOSITORY); private static final ImageDescriptor defaultImage = UIIcons.REPOSITORY; private final String label; private final IConfigurationElement repositoryServerProviderElement; private final IConfigurationElement repositorySearchPageELement; private boolean hasFixLocation = false; private ImageDescriptor image = UIIcons.REPOSITORY; private CloneSourceProvider(String label, IConfigurationElement repositoryServerProviderElement, IConfigurationElement repositorySearchPageElement, boolean hasFixLocation, ImageDescriptor image) { this.label = label; this.repositoryServerProviderElement = repositoryServerProviderElement; this.repositorySearchPageELement = repositorySearchPageElement; this.hasFixLocation = hasFixLocation; this.image = image; } /** * @return label the human readable name of a type of servers which * contain repositories */ public String getLabel() { return label; } /** * @return the image */ public ImageDescriptor getImage() { return image != null ? image : defaultImage; } /** * @return a class which provides a list of servers which host git * repositories. This class is newly created on each invocation * of this method. Clients are responsible to cache this * class. * @throws CoreException */ public IRepositoryServerProvider getRepositoryServerProvider() throws CoreException { if (repositoryServerProviderElement == null) return null; Object object = repositoryServerProviderElement .createExecutableExtension("class"); //$NON-NLS-1$ IRepositoryServerProvider provider = null; if (object instanceof IRepositoryServerProvider) provider = (IRepositoryServerProvider) object; return provider; } /** * @return A wizard page which can return information of a git * repository. This class is newly created on each invocation of * this method. Clients are responsible to cache this * class. * @throws CoreException */ public WizardPage getRepositorySearchPage() throws CoreException { if (repositorySearchPageELement == null) return null; Object object = repositorySearchPageELement .createExecutableExtension("class"); //$NON-NLS-1$ WizardPage page = null; if (object instanceof WizardPage && object instanceof IRepositorySearchResult) page = (WizardPage) object; return page; } /** * @return true if there will be no ability to add different servers of * this type. The provided repositoryImportPage has to know * where to look for the repositories. */ public boolean hasFixLocation() { return hasFixLocation; } } }