/*******************************************************************************
 * Copyright (c) 2007 Oracle Corporation.
 * 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.jst.jsf.common.metadata.internal;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.jst.jsf.common.metadata.internal.DomainSourceModelTypeDescriptor.DomainSourceModelTypeImpl;

/**
 * Registry of Domain Source Types loaded from domainSourceModelTypes ext-pt.
 */
public class DomainSourceTypesRegistry{
	private static final String EXTENSION_POINT_ID = "domainSourceModelTypes";
	private static DomainSourceTypesRegistry INSTANCE;
	private Map/*<String, List/*<DomainSourceModelTypeDescriptor>>*/ domainSourceTypeDescriptors;
	private Map/*<String, List/*<IDomainSourceModelType>*/ domainSourceTypes;
	
	private DomainSourceTypesRegistry(){
		init();
	}

	/**
	 * @return singleton instance of DomainSourceTypesRegistry
	 */
	public synchronized static DomainSourceTypesRegistry getInstance() {
		if (INSTANCE == null){
			INSTANCE = new DomainSourceTypesRegistry();
		}
		return INSTANCE;
	}

	/**
	 * @param domain identifier
	 * @return list of <code>IDomainSourceModelType</code> sorted in descending order by ordinal
	 */
	public List/*<IDomainSourceModelType>*/ getDomainSourceTypes(String domain){
		if (getDomainSourceTypes().containsKey(domain))
			return (List)getDomainSourceTypes().get(domain);
		
		List/*<DomainSourceModelTypeDescriptor>*/ list = (List)getDescriptors().get(domain);
		List/*<IDomainSourceModelType>*/ types = new ArrayList/*<IDomainSourceModelType>*/();
		for(Iterator/*<DomainSourceModelTypeDescriptor>*/ it=list.iterator();it.hasNext();){
			DomainSourceModelTypeDescriptor d = (DomainSourceModelTypeDescriptor)it.next();
			types.add(d.newInstance());
		}
		//default sort descending by ordinal 
		Collections.sort(types, new Comparator(){
			public int compare(Object o1, Object o2) {
				DomainSourceModelTypeImpl desc1 = (DomainSourceModelTypeImpl)o1;
				DomainSourceModelTypeImpl desc2 = (DomainSourceModelTypeImpl)o2;
				if (desc1.getOrdinal() == desc2.getOrdinal())
						return 0;
				if (desc1.getOrdinal() > desc2.getOrdinal())
					return -1;
				
				return 1;
			}
			
		});
		
		getDomainSourceTypes().put(domain, types);
		return types;
	}
	
	private synchronized void init() {
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID );
		if (point != null) {
			IConfigurationElement[] elements = point.getConfigurationElements();
			for (int i = 0; i < elements.length; i++) {
				IConfigurationElement element = elements[i];
				addDomainSourceTypeDescriptor(element);
			}
		}
	}

	private void addDomainSourceTypeDescriptor(IConfigurationElement element) {
		String domainId = element.getAttribute("domainId");
		String srcHdlrId = element.getAttribute("domainSourceModelTypeId");
		String locator = element.getAttribute("locator");
		String ordinalStr = element.getAttribute("ordinal");
		int ordinal = 1;
		if (ordinalStr!=null && !ordinalStr.equals("")){
			ordinal = Integer.parseInt(ordinalStr);
		}
		DomainSourceModelTypeDescriptor d = new DomainSourceModelTypeDescriptor(domainId, srcHdlrId, locator, element.getContributor().getName(), ordinal);
		List/*<DomainSourceTypeDescriptor>*/ descs = (List)getDescriptors().get(domainId);
		if (descs == null){
			descs = new ArrayList/*<DomainSourceTypeDescriptor>*/();
			getDescriptors().put(domainId, descs);
		}
		descs.add(d);
	}

	private Map/*<String, List/*<DomainSourceTypeDescriptor>>*/ getDescriptors() {
		if (domainSourceTypeDescriptors == null){
			domainSourceTypeDescriptors = new HashMap/*<String, List/*<DomainSourceTypeDescriptor>>*/();
		}
		return domainSourceTypeDescriptors;
	}
	
	private Map/*<String, List/*<IDomainSourceModelType>>*/ getDomainSourceTypes() {
		if (domainSourceTypes == null){
			domainSourceTypes = new HashMap/*<String, List/*<IDomainSourceModelType>>*/();
		}
		return domainSourceTypes;
	}

}