/*******************************************************************************
 * Copyright (c) 2003, 2006 IBM Corporation 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.common.frameworks.datamodel;

import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.wst.common.frameworks.internal.datamodel.DataModelExtensionReader;
import org.eclipse.wst.common.frameworks.internal.datamodel.DataModelImpl;

/**
 * <p>
 * DataModelFactory is used to create IDataModel instances.
 * </p>
 * 
 * @since 1.0
 */
public class DataModelFactory {

	private static DataModelExtensionReader reader;

	private DataModelFactory() {
	}

	/**
	 * <p>
	 * Looks up the appropriate IDataModelProvider by the specified id and constructs a new
	 * IDataModel. If the IDataModelProvider is not found then a RuntimeException is logged and null
	 * is returned.
	 * </p>
	 * 
	 * @param dataModelProviderID
	 *            the id of the IDataModelProvider
	 * @return a new IDataModel
	 */
	public static IDataModel createDataModel(String dataModelProviderID) {
		IDataModelProvider provider = loadProvider(dataModelProviderID);
		if (provider == null)
			return null;
		return createDataModel(provider);
	}

	private static IDataModelProvider loadProvider(String id) {
		if (null == reader) {
			reader = new DataModelExtensionReader();
		}
		return reader.getProvider(id);
	}

	/**
	 * <p>
	 * Looks up the appropriate dataModelProviderIDs by the specified dataModelProviderKindID.
	 * </p>
	 * 
	 * @param dataModelProviderKindID
	 *            the String id of the dataModelProviderKindID
	 * 
	 * @return the array of valid dataModelProviderIDs or an empty array if there are none.
	 */
	public static String[] getDataModelProviderIDsForKind(String dataModelProviderKindID) {
		String[] validProviderIDs = loadProviderForProviderKind(dataModelProviderKindID);
		return null != validProviderIDs ? validProviderIDs : new String[0];
	}


	private static String[] loadProviderForProviderKind(String providerKind) {
		if (null == reader) {
			reader = new DataModelExtensionReader();
		}
		return reader.getProviderDescriptorsForProviderKind(providerKind);
	}

	/**
	 * <p>
	 * Builds an {@link IDataModel} using the specified Class. This Class will
	 * normally be a sub interface of {@link IDataModelProperties}. If the
	 * Class it is an {@link IDataModelProperties}.class then this method will
	 * attempt to use the {@link IDataModelProperties#_provider_class} field to
	 * load the {@link IDataModelProvider} with which to back the
	 * {@link IDataModel}. If this fails, or if the Class is not an interface,
	 * then this method is equavalent to
	 * <code>createDataModel(aClass.getName())</code>.
	 * </p>
	 * 
	 * @param aClass
	 *            an {@link IDataModelProperties}.class or the class whose name
	 *            is the id of the IDataModelProvider
	 * @return a new IDataModel
	 */
	public static IDataModel createDataModel(Class aClass) {
		if(aClass.isInterface()){
				try{
					Class clazz = (Class)aClass.getField("_provider_class").get(null);
					if(clazz != null){
						IDataModelProvider provider = (IDataModelProvider)clazz.newInstance();
						return createDataModel(provider);
					}
				} catch (NoSuchFieldException e) {
					//ignore; the interface may not have defined the field and is relying on extensions.
				} catch (IllegalArgumentException e) {
					Logger.getLogger().logError(e);
				} catch (SecurityException e) {
					Logger.getLogger().logError(e);
				} catch (IllegalAccessException e) {
					Logger.getLogger().logError(e);
				} catch (InstantiationException e) {
					Logger.getLogger().logError(e);
				}  
		}
		return createDataModel(aClass.getName());
	}

	/**
	 * <p>
	 * Creates a new IDataModel using the the specified instance of an IDataModelProvider.
	 * </p>
	 * 
	 * @param provider
	 * @return a new IDataModel
	 */
	public static IDataModel createDataModel(IDataModelProvider provider) {
		if (null == provider) {
			throw new NullPointerException();
		}
		DataModelImpl dataModel = new DataModelImpl(provider);
		return dataModel;
	}

}
