/*******************************************************************************
 * Copyright (c) 2007, 2010 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 - Initial API and implementation
 *     Mike Kucera (IBM)
 *******************************************************************************/
package org.eclipse.ptp.internal.rdt.core.miners;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.internal.core.indexer.ILanguageMapper;
import org.eclipse.dstore.core.model.DataStore;
import org.eclipse.dstore.core.model.DataStoreAttributes;
import org.eclipse.ptp.internal.rdt.core.IRemoteIndexerInfoProvider;
import org.eclipse.ptp.rdt.core.IConfigurableLanguage;
import org.eclipse.rse.dstore.universal.miners.UniversalServerUtilities;

/**
 *
 */
public class RemoteLanguageMapper implements ILanguageMapper {
	
	private static final String LOG_TAG = "CDTMiner-RemoteLanguageMapper"; //$NON-NLS-1$
	private static final String LANGUAGE_CLASS_FILE_NAME = "languages.properties"; //$NON-NLS-1$
	private static final ILanguage DEFAULT_LANGUAGE = GPPLanguage.getDefault();
	
	private static Properties languageIdToClassName = null;
	
	private final Map<String,ILanguage> languages = new HashMap<String,ILanguage>();
	private final IRemoteIndexerInfoProvider provider;
	private final DataStore dataStore;
	
	
	public RemoteLanguageMapper(IRemoteIndexerInfoProvider provider, DataStore dataStore) {
		if(provider == null || dataStore == null)
			throw new NullPointerException();
		
		this.provider = provider;
		this.dataStore = dataStore;
	}
	
	
	
	public ILanguage getLanguage(String file) {
		String languageId = provider.getLanguageID(file);
		if(languageId == null) {
			UniversalServerUtilities.logWarning(LOG_TAG, "No language id for '" + file + "'", dataStore); //$NON-NLS-1$ //$NON-NLS-2$
			return DEFAULT_LANGUAGE;
		}
		
		ILanguage language = languages.get(languageId);
		if(language == null) {
			language = getLanguageById(languageId, provider.getLanguageProperties(languageId), dataStore);			
			languages.put(languageId, language);
		}
		
		return language;
	}
	
	
	
	public static ILanguage getLanguageById(String languageId, Map<String,String> languageProperties, DataStore dataStore) {
		ILanguage language = instantiateAndConfigureLanguage(languageId, languageProperties, dataStore);
		return language == null ? DEFAULT_LANGUAGE : language;
	}
	
	
	
	private static ILanguage instantiateAndConfigureLanguage(String languageId, Map<String,String> languageProperties, DataStore dataStore) {
		String className = getClassName(languageId, dataStore);
		if(className == null) {
			if(dataStore != null) 
				UniversalServerUtilities.logWarning(LOG_TAG, "No class for " + languageId, dataStore); //$NON-NLS-1$
			return null;
		}
		
		ILanguage language = null;
		try {
			Class<?> clazz = Class.forName(className);
			language = (ILanguage) clazz.newInstance();
			if(dataStore != null) 
				UniversalServerUtilities.logInfo(LOG_TAG, "Instantiated language: " + className, dataStore); //$NON-NLS-1$
		} catch(Exception e) {
			if(dataStore != null) 
				UniversalServerUtilities.logError(LOG_TAG, e.toString(), e, dataStore);
			return null;
		}
		
		if(languageProperties != null && language instanceof IConfigurableLanguage) {
			((IConfigurableLanguage) language).setProperties(languageProperties);
			if(dataStore != null) 
				UniversalServerUtilities.logDebugMessage(LOG_TAG, "Configured language: " + className, dataStore); //$NON-NLS-1$
		}
		
		return language;
	}
	
	
	
	private static synchronized String getClassName(String languageId, DataStore dataStore) {
		if(languageIdToClassName == null) {
			try {
				languageIdToClassName = new Properties();
				
				// set up the defaults
				languageIdToClassName.setProperty(GPPLanguage.ID, GPPLanguage.class.getCanonicalName());
				languageIdToClassName.setProperty(GCCLanguage.ID, GCCLanguage.class.getCanonicalName());
				
				// defaults may be overridden when the file is loaded
				String pluginDir = dataStore.getAttribute(DataStoreAttributes.A_PLUGIN_PATH);
				String dataFile = pluginDir + File.separator + LANGUAGE_CLASS_FILE_NAME;
				File file = new File(dataFile);
				if(file.canRead()) {
					InputStream in = new FileInputStream(file);
					languageIdToClassName.load(in);
					in.close();
					if(dataStore != null)
						UniversalServerUtilities.logInfo(LOG_TAG, "Loaded language mappings from " + file.getAbsolutePath(), dataStore); //$NON-NLS-1$
				}
				else if(dataStore != null) {
					UniversalServerUtilities.logWarning(LOG_TAG, "Cannot load language mappings file: " + file.getAbsolutePath(), dataStore); //$NON-NLS-1$
				}

			} catch (FileNotFoundException e) {
				if(dataStore != null)
					UniversalServerUtilities.logError(LOG_TAG, e.toString(), e, dataStore);
			} catch (IOException e) {
				if(dataStore != null)
					UniversalServerUtilities.logError(LOG_TAG, e.toString(), e, dataStore);
			}
			
			if(dataStore != null)
				UniversalServerUtilities.logInfo(LOG_TAG, "Language ID mappings: " + languageIdToClassName, dataStore); //$NON-NLS-1$
		}
		
		return languageIdToClassName.getProperty(languageId);
	}
	
	
}
