/**
* Aptana Studio
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
* Please see the license.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.deploy.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.InvalidRegistryObjectException;
import org.eclipse.core.runtime.Platform;
import com.aptana.core.logging.IdeLog;
import com.aptana.deploy.DeployPlugin;
import com.aptana.deploy.IDeployProvider;
import com.aptana.deploy.preferences.DeployPreferenceUtil;
public class DeployProviderRegistry
{
/**
* unique id of the provider.
*/
private static final String PROVIDER_ID_ATTRIBUTE = "id"; //$NON-NLS-1$
/**
* Element name to register a deploy provider.
*/
private static final String PROVIDER_ELEMENT_NAME = "provider"; //$NON-NLS-1$
/**
* Extension point name/id.
*/
private static final String DEPLOY_PROVIDERS_EXP_PT = "deployProviders"; //$NON-NLS-1$
/**
* Cache
*/
private Map<String, IConfigurationElement> providersById;
private static DeployProviderRegistry fgInstance;
private DeployProviderRegistry()
{
}
public synchronized static DeployProviderRegistry getInstance()
{
if (fgInstance == null)
{
fgInstance = new DeployProviderRegistry();
}
return fgInstance;
}
public IDeployProvider getProvider(IContainer container)
{
IDeployProvider provider = getConfiguredProvider(container);
if (provider == null)
{
// Grab providers from ext pt!
Collection<IDeployProvider> providers = getAllProviders();
// Now go through the providers and find one that handles this project
for (IDeployProvider aProvider : providers)
{
if (aProvider.handles(container))
{
provider = aProvider;
break;
}
}
}
return provider;
}
private IDeployProvider getConfiguredProvider(IContainer container)
{
// check what deploy provider id is stored for project, then get provider from ext pt matching that id.
String id = DeployPreferenceUtil.getDeployProviderId(container);
if (id == null)
{
return null;
}
return getProviderById(id);
}
private IDeployProvider createProvider(IConfigurationElement element) throws CoreException
{
return (IDeployProvider) element.createExecutableExtension("class"); //$NON-NLS-1$
}
private Collection<IDeployProvider> getAllProviders()
{
Collection<IDeployProvider> providers = new ArrayList<IDeployProvider>();
for (IConfigurationElement element : providersById().values())
{
try
{
providers.add(createProvider(element));
}
catch (CoreException e)
{
IdeLog.logError(DeployPlugin.getDefault(), e);
}
}
return providers;
}
private synchronized Map<String, IConfigurationElement> providersById()
{
if (providersById == null)
{
providersById = new HashMap<String, IConfigurationElement>();
try
{
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement[] elements = registry.getConfigurationElementsFor(
DeployPlugin.getPluginIdentifier(), DEPLOY_PROVIDERS_EXP_PT);
for (IConfigurationElement element : elements)
{
if (PROVIDER_ELEMENT_NAME.equals(element.getName()))
{
String providerId = element.getAttribute(PROVIDER_ID_ATTRIBUTE);
providersById.put(providerId, element);
}
}
}
catch (InvalidRegistryObjectException e)
{
IdeLog.logError(DeployPlugin.getDefault(), e);
}
}
return providersById;
}
public IDeployProvider getProviderById(String id)
{
if (id == null)
{
return null;
}
IConfigurationElement element = providersById().get(id);
if (element != null)
{
try
{
return createProvider(element);
}
catch (CoreException e)
{
IdeLog.logError(DeployPlugin.getDefault(), e);
}
}
return null;
}
public String getIdForProvider(IDeployProvider provider)
{
if (provider == null)
{
return null;
}
String className = provider.getClass().getName();
for (Map.Entry<String, IConfigurationElement> entry : providersById().entrySet())
{
if (className.equals(entry.getValue().getAttribute("class"))) //$NON-NLS-1$
{
return entry.getKey();
}
}
return null;
}
}