/*******************************************************************************
 * Copyright (c) 2005, 2009 IBM Corporation and others.
 * 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:
 * IBM Corporation - initial implementation
 *******************************************************************************/
package org.eclipse.epf.rcp.ui.wizards;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.epf.rcp.ui.RCPUIPlugin;

/**
 * Manages the 'org.eclipse.epf.ui.importWizards" extension point.
 * <p>
 * This extension point allows a contributing plug-in to add its import wizards
 * to the standalone RCP-based EPF Composer Import wizard page.
 * 
 * @author Shashidhar Kannoori
 * @author Kelvin Low
 * @since 1.0
 */
public class UIImportWizardExtensionPoint {

	/**
	 * The extension namespace.
	 */
	public static final String PAGE_PROVIDERS_EXTENSION_NAMESPACE = "org.eclipse.epf.ui"; //$NON-NLS-1$

	/**
	 * The extension name.
	 */
	public static final String PAGE_PROVIDERS_EXTENSION_NAME = "importWizards"; //$NON-NLS-1$

	/**
	 * The extension Attributes
	 */
	public static final String PAGE_PROVIDER_EXTENSION_ATTR_ID = "id"; //$NON-NLS-1$

	private ArrayList extensionsList = new ArrayList();

	// The shared instance.
	private static UIImportWizardExtensionPoint instance = null;

	public static UIImportWizardExtensionPoint getInstance() {
		if (instance == null) {
			synchronized (UIImportWizardExtensionPoint.class) {
				if (instance == null) {
					instance = new UIImportWizardExtensionPoint();
				}
			}
		}
		return instance;
	}

	/**
	 * Creates a new instance.
	 */
	private UIImportWizardExtensionPoint() {
	}

	/**
	 * Returns all the page providers
	 * 
	 * @return all the page providers.
	 */
	public List getPageProviders() {
		return extensionsList;
	}

	/**
	 * Loads the configuration providers specified via the
	 * "com.ibm.process.pageProviders" extension point.
	 */
	public void loadExtension() {
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
				PAGE_PROVIDERS_EXTENSION_NAMESPACE,
				PAGE_PROVIDERS_EXTENSION_NAME);
		if (extensionPoint != null) {
			IExtension[] extensions = extensionPoint.getExtensions();
			for (int i = 0; i < extensions.length; i++) {
				IExtension extension = extensions[i];
				IConfigurationElement[] configElements = extension
						.getConfigurationElements();
				for (int j = 0; j < configElements.length; j++) {
					IConfigurationElement configElement = configElements[j];
					try {
						String id = configElement
								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_ID);
						extensionsList.add(id);

					} catch (Exception e) {
						RCPUIPlugin
								.getDefault()
								.getLogger()
								.logError(
										"Failed to export import contribution extension points", e); //$NON-NLS-1$
					}
				}
			}
		}
	}

}
