/*******************************************************************************
 * 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.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.core.resources.IProject;
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;

/**
 * Implementation of a {@link IDomainSourceModelType} descriptor.   
 * Responsible for producing instances of {@link IDomainSourceModelType}.  
 * Also responsible for creating the {@link IMetaDataTranslator} descriptors from the 
 * <code>com.eclipse.jst.jsf.common.domainSourceModelTypeTranslators</code> ext-pt
 */
public class DomainSourceModelTypeDescriptor {
	private static final String TRANSLATORS_EXTENSION_POINT_ID = "domainSourceModelTypeTranslators"; //$NON-NLS-1$
	private static final String STANDARD_FILE_NULL_TRANSLATOR = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataFilesTranslator"; //$NON-NLS-1$
	private String domain = "DEFAULT"; //$NON-NLS-1$
	private String domainSourceModelTypeId;
	private String locatorClassName = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataLocator"; //$NON-NLS-1$
	private Set translatorDescriptors;
	private String bundleId = JSFCommonPlugin.PLUGIN_ID;
	private int ordinal;
	
	/**
	 * Constructor
	 * @param domain
	 * @param domainSourceModelTypeId
	 * @param locatorClassName
	 * @param bundleId
	 * @param ordinal
	 */
	public DomainSourceModelTypeDescriptor(String domain, String domainSourceModelTypeId, String locatorClassName, String bundleId, int ordinal){
		this.domain = domain;
		this.locatorClassName = locatorClassName;
		this.domainSourceModelTypeId = domainSourceModelTypeId;
		this.bundleId = bundleId;
		this.ordinal = ordinal;
		init();
	}

	/**
	 * Default model type descriptor that will load only standard metadata files
	 */
	public DomainSourceModelTypeDescriptor(){
//		getTranslatorDescriptors();
		//createTranslatorInstances() will add the standard null translator 
	}
	
	private synchronized void init() {
		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, TRANSLATORS_EXTENSION_POINT_ID );
		if (point != null) {
			IConfigurationElement[] elements = point.getConfigurationElements();
			for (int i = 0; i < elements.length; i++) {
				IConfigurationElement element = elements[i];
				String srcHdlrId = element.getAttribute("domainSourceModelTypeId"); //$NON-NLS-1$
				if (srcHdlrId.equals(domainSourceModelTypeId))
					addTranslatorDescriptor(element);
			}
		}
	}
	
	private void addTranslatorDescriptor(IConfigurationElement element) {
		String translator = element.getAttribute("translatorClass"); //$NON-NLS-1$
		DomainSourceModelTranslatorDescriptor d = new DomainSourceModelTranslatorDescriptor(translator, element.getContributor().getName());
		getTranslatorDescriptors().add(d);
	}

	private Set getTranslatorDescriptors(){
		if (translatorDescriptors == null){
			translatorDescriptors = new HashSet();
		}
		return translatorDescriptors;
	}

	/**
	 * @return domain
	 */
	public String getDomain() { 
		return domain;
	}
	 
	/**
	 * @return new instance of the {@link IDomainSourceModelType}
	 */
	public IDomainSourceModelType getInstance(){
		return new DomainSourceModelTypeImpl();
	}
	
	/**
	 * Internal class implementing {@link IDomainSourceModelType}
	 */
	class DomainSourceModelTypeImpl implements IDomainSourceModelType{

		private Set translators;
		private IMetaDataLocator locator;

		DomainSourceModelTypeImpl(){
            // restrict construction to package scope
		}
		
		/* (non-Javadoc)
		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getDomain()
		 */
		public String getDomain() {
			return domain;
		}
		
		/**
		 * @return value of ordinal defined by the ext-pt used for ordering source types for a domain
		 */
		public int getOrdinal(){
			return ordinal;
		}
		
		/* (non-Javadoc)
		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getLocator()
		 */
		public IMetaDataLocator getLocator(IProject project) {
			if (locator == null){
				locator = MetaDataLocatorFactory.getInstance().getLocator(locatorClassName, bundleId, project);
			}
								
			return locator;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getTranslators()
		 */
		public Set getTranslators() {
			if (translators == null){				
				translators = createTranslatorInstances();
			}
			return translators;
		}
		
		/* (non-Javadoc)
		 * @see java.lang.Object#toString()
		 */
		public String toString(){
			StringBuffer buf = new StringBuffer("DomainSourceModelTypeImpl"); //$NON-NLS-1$
			buf.append("(domain = "); //$NON-NLS-1$
			buf.append(getDomain());
			buf.append(", locator = "); //$NON-NLS-1$
			buf.append(locator != null ? locator.toString() : "null"); //$NON-NLS-1$
			buf.append(")"); //$NON-NLS-1$
			return buf.toString();
		}
		
		private Set createTranslatorInstances() {
			translators = new HashSet/*<IMetaDataTranslator>*/();
			if (getTranslatorDescriptors().size() == 0){// for TagLibDomain, we are adding null translator via extension (as of 7/16/07)
				//would get here if a domain and source type was defined without a domain translator.  Should not happen, but 
				//add Null Translator for now....
				//we could/should raise exception.  
				//Developers should add a STANDARD_FILE_NULL_TRANSLATOR if using standard metadata format.
				Class klass = JSFCommonPlugin.loadClass(STANDARD_FILE_NULL_TRANSLATOR, JSFCommonPlugin.PLUGIN_ID);
				try {
					translators.add(klass.newInstance());
					return translators;
				} catch (InstantiationException e) {
                    // TODO: other error handling?
					JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)"); //$NON-NLS-1$
				} catch (IllegalAccessException e) {
                    // TODO: other error handling?
                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)"); //$NON-NLS-1$
				}

			}
			
			Iterator/*<DomainSourceModelTranslatorDescriptor>*/it = getTranslatorDescriptors().iterator();
			while (it.hasNext()){
				DomainSourceModelTranslatorDescriptor d = (DomainSourceModelTranslatorDescriptor)it.next();
				Class klass = JSFCommonPlugin.loadClass(d.getTranslator(), d.getBundleId());
				try {
					translators.add(klass.newInstance());
				} catch (InstantiationException e) {
                    // TODO: other error handling?
                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances"); //$NON-NLS-1$
				} catch (IllegalAccessException e) {
                    // TODO: other error handling?
                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances"); //$NON-NLS-1$
				}
			}
			return translators;
		}

	}
	
	/**
	 * Internal class implementing a descriptor for DomainSourceModelTranslators
	 */
	static class DomainSourceModelTranslatorDescriptor {

		private String _translator;
		private String _bundleId;

		/**
		 * Constructor
		 * @param translator
		 * @param bundleId
		 */
		public DomainSourceModelTranslatorDescriptor(String translator, String bundleId) {
			this._translator = translator;
			this._bundleId = bundleId;
		}
		
		String getTranslator(){
			return _translator;
		}
		
		String getBundleId(){
			return _bundleId;
		}
		
	}

}
