/**********************************************************************
 * 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);
				}
			}
		}
	}
}
