/*******************************************************************************
 * 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.properties.internal;

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

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptorProvider;

/**
 * The DesignerTagPropertySectionDescriptorProvider will provide the section
 * descriptiors. Now section descriptor come from two sources.
 * 
 * One is reading from the "org.eclipse.jst.pagedesigner.propertyContributor"
 * extension point. This extension point will contribute additional section
 * providers, which provides a set of sections.
 * 
 * One is reading from the "org.eclipse.jst.pagedesigner.propertySections"
 * extension point. This extension provide a single section.
 * 
 * @author mengbo
 * @version 1.5
 */
public class DesignerTabPropertySectionDescriptorProvider implements
		ISectionDescriptorProvider {
	private static final String EXTPT_SECTIONS = "propertySections"; //$NON-NLS-1$

	private static final String ELEMENT_SECTION = "propertySection"; //$NON-NLS-1$

	private static final String EXTPT_SECTIONDESCRIPTORPROVIDER = "propertyContributor";

	private static final String ELEMENT_PROPERTYCONTRIBUTOR = "propertyContributor";

	private static final String ATTR_SECTIONDESCRIPTORPROVIDER = "sectionDescriptorProvider";

	ISectionDescriptor[] _descriptors = null;

	/**
	 * 
	 */
	public DesignerTabPropertySectionDescriptorProvider() {
		super();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptorProvider#getSectionDescriptors()
	 */
	public ISectionDescriptor[] getSectionDescriptors() {
		if (_descriptors == null) {
			List result = new ArrayList();
			List contributedSections = readSectionDescriptors();
			result.addAll(contributedSections);

			List providers = readAdditionalSectionDescriptorProviders();
			for (int i = 0, size = providers.size(); i < size; i++) {
				try {
					ISectionDescriptorProvider provider = (ISectionDescriptorProvider) providers
							.get(i);
					ISectionDescriptor[] sections = provider
							.getSectionDescriptors();
					if (sections != null) {
						result.addAll(Arrays.asList(sections));
					}
				} catch (Exception ex) {
					// ignore
					ex.printStackTrace();
				}
			}
			_descriptors = new ISectionDescriptor[result.size()];
			result.toArray(_descriptors);
		}
		return _descriptors;
	}

	/**
	 * @return the providers
	 */
	protected List readAdditionalSectionDescriptorProviders() {
		List result = new ArrayList();
		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONDESCRIPTORPROVIDER);
		for (int i = 0; i < extensions.length; i++) {
			IConfigurationElement extension = extensions[i];
			if (ELEMENT_PROPERTYCONTRIBUTOR.equals(extension.getName())) {
				IConfigurationElement contributor = extension;
				try {
					Object obj = contributor
							.createExecutableExtension(ATTR_SECTIONDESCRIPTORPROVIDER);
					if (obj instanceof ISectionDescriptorProvider) {
						result.add(obj);
					}
				} catch (CoreException ex) {
					ex.printStackTrace();
				}
			}
		}
		return result;
	}

	/**
	 * @return the descriptors
	 */
	protected List readSectionDescriptors() {
		List result = new ArrayList();
		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONS);
		for (int i = 0; i < extensions.length; i++) {
			IConfigurationElement extension = extensions[i];
			IConfigurationElement[] sections = extension
					.getChildren(ELEMENT_SECTION);
			for (int j = 0; j < sections.length; j++) {
				IConfigurationElement section = sections[j];
				ISectionDescriptor descriptor = new DesignerSectionDescriptor(
						section);
				result.add(descriptor);
			}
		}
		return result;
	}

	/**
	 * @param extensionPointId
	 * @return the configuration element
	 */
	public static IConfigurationElement[] getConfigurationElements(
			String extensionPointId) {
		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
				.getExtensionPoint(PDPlugin.getPluginId(), extensionPointId);

		if (extensionPoint == null) {
			return null;
		}
		return extensionPoint.getConfigurationElements();
	}
}
