/*******************************************************************************
 *  Copyright (c) 2006, 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.jaxb.ui.internal.platform;

import static org.eclipse.jpt.common.core.internal.XPointUtil.*;
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.jpt.common.core.internal.XPointUtil.XPointException;
import org.eclipse.jpt.common.utility.internal.KeyedSet;
import org.eclipse.jpt.jaxb.core.JptJaxbCorePlugin;
import org.eclipse.jpt.jaxb.core.platform.JaxbPlatformDescription;
import org.eclipse.jpt.jaxb.ui.JptJaxbUiPlugin;
import org.eclipse.jpt.jaxb.ui.platform.JaxbPlatformUi;
import org.eclipse.jpt.jaxb.ui.platform.JaxbPlatformUiManager;

public class JaxbPlatformUiManagerImpl
		implements JaxbPlatformUiManager {
	
	static final String EXTENSION_POINT_ID = "jaxbPlatformUis"; //$NON-NLS-1$
	static final String QUALIFIED_EXTENSION_POINT_ID = JptJaxbCorePlugin.PLUGIN_ID_ + EXTENSION_POINT_ID; //$NON-NLS-1$
	static final String PLATFORM_UI_ELEMENT = "jaxbPlatformUi"; //$NON-NLS-1$
	static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$	
	static final String PLATFORM_ATTRIBUTE = "jaxbPlatform"; //$NON-NLS-1$	
	static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$	
	
	
	private static final JaxbPlatformUiManagerImpl INSTANCE = new JaxbPlatformUiManagerImpl();
	
	
	public static JaxbPlatformUiManagerImpl instance() {
		return INSTANCE;
	}
	
	
	private KeyedSet<String, JaxbPlatformUiConfig> platformUiConfigs;
	private KeyedSet<JaxbPlatformDescription, JaxbPlatformUiConfig> platformToUiConfigs;
	
	
	// ********** constructor/initialization **********
	
	private JaxbPlatformUiManagerImpl() {
		super();
		this.platformUiConfigs = new KeyedSet<String, JaxbPlatformUiConfig>();
		this.platformToUiConfigs = new KeyedSet<JaxbPlatformDescription, JaxbPlatformUiConfig>();
		readExtensions();
	}
	
	
	private void readExtensions() {
		final IExtensionRegistry registry = Platform.getExtensionRegistry();
		
		final IExtensionPoint xpoint 
				= registry.getExtensionPoint(JptJaxbUiPlugin.PLUGIN_ID, EXTENSION_POINT_ID);
		
		if (xpoint == null) {
			throw new IllegalStateException();
		}
		
		List<IConfigurationElement> platformUiConfigs = new ArrayList<IConfigurationElement>();
		
		for (IExtension extension : xpoint.getExtensions()) {
			for (IConfigurationElement configElement : extension.getConfigurationElements()) {
				if (configElement.getName().equals(PLATFORM_UI_ELEMENT)) {
					platformUiConfigs.add(configElement);
				}
			}
		}
		
		for (IConfigurationElement configElement: platformUiConfigs) {
			readPlatformUiExtension(configElement);
		}
	}
	
	private void readPlatformUiExtension(IConfigurationElement element) {
		try {
			JaxbPlatformUiConfig platformUiConfig = new JaxbPlatformUiConfig();
			
			// plug-in id
			platformUiConfig.setPluginId(element.getContributor().getName());
			
			// id
			platformUiConfig.setId(findRequiredAttribute(element, ID_ATTRIBUTE));
			
			if (this.platformUiConfigs.containsKey(platformUiConfig.getId())) {
				logDuplicateExtension(QUALIFIED_EXTENSION_POINT_ID, ID_ATTRIBUTE, platformUiConfig.getId());
				throw new XPointException();
			}
			
			// jaxb platform id
			String jaxbPlatformId = findRequiredAttribute(element, PLATFORM_ATTRIBUTE);
			JaxbPlatformDescription jaxbPlatform = 
					JptJaxbCorePlugin.getJaxbPlatformManager().getJaxbPlatform(jaxbPlatformId);
			
			if (jaxbPlatform == null) {
				logInvalidValue(element, PLATFORM_ATTRIBUTE, jaxbPlatformId);
			}
			
			if (this.platformToUiConfigs.containsKey(jaxbPlatform)) {
				logDuplicateExtension(QUALIFIED_EXTENSION_POINT_ID, PLATFORM_ATTRIBUTE, jaxbPlatformId);
				throw new XPointException();
			}
			
			platformUiConfig.setJaxbPlatform(jaxbPlatform);
			
			// class
			platformUiConfig.setClassName(findRequiredAttribute(element, CLASS_ATTRIBUTE));
			
			this.platformUiConfigs.addItem(platformUiConfig.getId(), platformUiConfig);
			this.platformToUiConfigs.addItem(jaxbPlatform, platformUiConfig);
		}
		catch (XPointException e) {
			// Ignore and continue. The problem has already been reported to the user
			// in the log.
		}
	}
	
	public JaxbPlatformUi getJaxbPlatformUi(JaxbPlatformDescription platformDesc) {
		JaxbPlatformUiConfig config = this.platformToUiConfigs.getItem(platformDesc);
		return (config == null) ? null : config.getPlatformUi();
	}
}
