/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.actions.link;

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.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.pagedesigner.IJMTConstants;
import org.eclipse.jst.pagedesigner.PDPlugin;

/**
 * @author mengbo
 * @version 1.5
 */
public class ExtensionReader {
	private static Logger _log = PDPlugin.getLogger(ExtensionReader.class);

	private static ILinkCreator[] _handlers = null;

	private static final String ATTR_CLASS = "class";

	public static synchronized ILinkCreator[] getAllLinkHandlers() {
		if (_handlers == null) {
			_handlers = readAllLinkHandlers();
		}
		return _handlers;

	}

	private static ILinkCreator[] readAllLinkHandlers() {
		List result = new ArrayList();
		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
				.getExtensionPoint(PDPlugin.getPluginId(),
						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
		IExtension[] extensions = extensionPoint.getExtensions();

		for (int i = 0; i < extensions.length; i++) {
			IExtension ext = extensions[i];
			IConfigurationElement[] linkHandlers = ext
					.getConfigurationElements();

			for (int j = 0; j < linkHandlers.length; j++) {
				if (linkHandlers[j].getName()
						.equals(IJMTConstants.LINK_CREATOR)) {
					linkHandlers[j].getAttribute(ATTR_CLASS);
					Object obj;
					try {
						obj = linkHandlers[j]
								.createExecutableExtension(ATTR_CLASS);

						if (obj instanceof ILinkCreator) {
							result.add(obj);
						}
					} catch (CoreException e) {
						_log
								.error("Log.Error.ExtensionReader.ReadLinkExtension");
					}
				}
			}
		}
		ILinkCreator[] ret = new ILinkCreator[result.size()];
		result.toArray(ret);
		return ret;
	}
}
