/*******************************************************************************
 *  Copyright (c) 2010  Oracle. 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: 
 *  	Oracle - initial API and implementation
 *******************************************************************************/
package org.eclipse.jpt.core.internal.libval;

import static org.eclipse.jpt.core.internal.XPointUtil.*;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.expressions.ExpressionConverter;
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.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jpt.core.JptCorePlugin;
import org.eclipse.jpt.core.internal.XPointUtil.XPointException;
import org.eclipse.jpt.core.internal.libprov.JptLibraryProviderInstallOperationConfig;
import org.eclipse.jpt.core.libval.LibraryValidator;
import org.eclipse.jpt.utility.internal.KeyedSet;
import org.eclipse.jpt.utility.internal.iterables.FilteringIterable;
import org.eclipse.jpt.utility.internal.iterables.TransformationIterable;

public class LibraryValidatorManager {
	
	public static final String EXTENSION_POINT_ID = "libraryValidators";
	public static final String QUALIFIED_EXTENSION_POINT_ID = JptCorePlugin.PLUGIN_ID_ + EXTENSION_POINT_ID;
	public static final String LIBRARY_VALIDATOR_ELEMENT = "libraryValidator";
	public static final String ID_ATTRIBUTE = "id";
	public static final String CLASS_ATTRIBUTE = "class";
	public static final String ENABLEMENT_ELEMENT = "enablement";
	
	
	private static LibraryValidatorManager INSTANCE = new LibraryValidatorManager();
	
	
	public static LibraryValidatorManager instance() {
		return INSTANCE;
	}
	
	
	private KeyedSet<String, LibraryValidatorConfig> libraryValidatorConfigs;
	
	
	private LibraryValidatorManager() {
		this.libraryValidatorConfigs = new KeyedSet<String, LibraryValidatorConfig>();
		readExtensions();
	}
	
	
	/**
	 * Return the {@link LibraryValidator}s 
	 */
	public Iterable<LibraryValidator> getLibraryValidators(final JptLibraryProviderInstallOperationConfig config) {
		return new FilteringIterable<LibraryValidator>(
				new TransformationIterable<LibraryValidatorConfig, LibraryValidator>(
						new FilteringIterable<LibraryValidatorConfig>(
								this.libraryValidatorConfigs.getItemSet()) {
							@Override
							protected boolean accept(LibraryValidatorConfig o) {
								return o.isEnabledFor(config);
							}
						}) {
					@Override
					protected LibraryValidator transform(LibraryValidatorConfig o) {
						return o.getLibraryValidator();
					}
				}) {
			@Override
			protected boolean accept(LibraryValidator o) {
				return o != null;
			}
		};
	}
	
	private void readExtensions() {
		final IExtensionRegistry registry = Platform.getExtensionRegistry();
		
		final IExtensionPoint xpoint 
				= registry.getExtensionPoint(JptCorePlugin.PLUGIN_ID, EXTENSION_POINT_ID);
		
		if (xpoint == null) {
			throw new IllegalStateException();
		}
		
		final List<IConfigurationElement> configs = new ArrayList<IConfigurationElement>();
		
		for (IExtension extension : xpoint.getExtensions()) {
        	for (IConfigurationElement element : extension.getConfigurationElements()) {
        		configs.add(element);
        	}
		}
		
		for (IConfigurationElement element : configs) {
			if (element.getName().equals(LIBRARY_VALIDATOR_ELEMENT)) {
                readExtension(element);
			}
		}
	}
	
	private void readExtension(IConfigurationElement element) {
		try {
			final LibraryValidatorConfig lvConfig = new LibraryValidatorConfig();
			
			// plug-in id
			lvConfig.setPluginId(element.getContributor().getName());
			
			// resource locator id
			lvConfig.setId(findRequiredAttribute(element, ID_ATTRIBUTE));
			
			if (this.libraryValidatorConfigs.containsKey(lvConfig.getId())) {
				logDuplicateExtension(QUALIFIED_EXTENSION_POINT_ID, lvConfig.getId());
				throw new XPointException();
			}
			
			// resource locator class name
			lvConfig.setClassName(findRequiredAttribute(element, CLASS_ATTRIBUTE));
			
			// enablement
			for (IConfigurationElement child : element.getChildren()) {
				String childName = child.getName();
				if (childName.equals(ENABLEMENT_ELEMENT)) {
					Expression expr;
					try {
						expr = ExpressionConverter.getDefault().perform(child);
					}
					catch (CoreException e) {
						log(e);
						throw new XPointException();
					}
					lvConfig.setEnablementCondition(expr);
				}
			}
			
			this.libraryValidatorConfigs.addItem(lvConfig.getId(), lvConfig);
		}
		catch (XPointException e) {
			// Ignore and continue. The problem has already been reported to the user
			// in the log.
		}
	}
}
