blob: 01662dd2c47d6638e20bea61092105179aee2325 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2004, 2017 Eclipse Foundation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Gunnar Wagenknecht - Initial API and implementation
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.pde.internal.build;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.pde.build.IFetchFactory;
/**
* A registry for accessing fetch task factories.
* @since 3.2
*/
public class FetchTaskFactoriesRegistry implements IPDEBuildConstants {
// Map of registered factories. key: factoryId, value: configuration element or corresponding instance
private final Map<String, IConfigurationElement> factories;
private final Map<String, IFetchFactory> cache;
public FetchTaskFactoriesRegistry() {
factories = new HashMap<>();
cache = new HashMap<>();
initializeRegistry();
}
/**
* Returns the factory instance with the specified id.
* <p>
* The instance is cached, subsequent calls with the same id will
* return the same factory instance.
* </p>
* @param id
* @return the factory instance (maybe <code>null</code>)
*/
public IFetchFactory getFactory(String id) {
Object result = cache.get(id);
if (result != null)
return (IFetchFactory) result;
IFetchFactory toCache = newFactory(id);
if (toCache != null) {
cache.put(id, toCache);
return toCache;
}
return null;
}
/**
* Creates a new factory instance with the specified id
* <p>
* The instance is not cached. Each time this method is called, a new
* instance is created.
* </p>
* @param id
* @return the factory instance (maybe <code>null</code>)
*/
public IFetchFactory newFactory(String id) {
IConfigurationElement extension = factories.get(id);
if (null != extension) {
try {
IFetchFactory factory = (IFetchFactory) extension.createExecutableExtension(ATTR_CLASS);
return factory;
} catch (CoreException e) {
BundleHelper.getDefault().getLog().log(e.getStatus());
}
}
return null;
}
/**
* Returns a collection of registered factory ids.
*
* @return a collection of registered factory ids
*/
public Collection<String> getFactoryIds() {
return factories.keySet();
}
/**
* Initializes the registry
*/
private void initializeRegistry() {
IConfigurationElement[] extensions = Platform.getExtensionRegistry().getConfigurationElementsFor(EXT_FETCH_TASK_FACTORIES);
for (int i = 0; i < extensions.length; i++) {
IConfigurationElement extension = extensions[i];
if (ELEM_FACTORY.equals(extension.getName())) {
String id = extension.getAttribute(ATTR_ID);
if (null != id && id.trim().length() > 0) {
factories.put(id, extension);
}
}
}
}
}