package keo.pos.tools;

import java.io.*;
import java.util.Properties;

import org.apache.log4j.*;

/**
 * Cette classe permet de charger divers fichiers de configuration, en
 * particulier le fichier par défaut 
 * {@link keo.pos.tools.PropertiesManager#DEFAULT_CONFIG}.
 * @see keo.pos.tools.PropertiesManager
 * 
 * @version	$Revision$ $Date$
 * @author		damien.lecan
 */
public class PropertiesLoader extends Properties {

	static Logger log = Logger.getLogger(Properties.class);

	/**
	 * Constructor for PropertiesLoader.
	 * Lit le fichier de propriétés par défaut.<br>
	 * Si un problème survient, quelqu'il soit, qui empêche la lecture
	 * des paramètres, on quitte l'application directement.
	 * @see PropertiesManager#DEFAULT_CONFIG
	 */
	public PropertiesLoader() {
		super();

		try {
			loadFile(PropertiesManager.DEFAULT_CONFIG);
		} catch(FileNotFoundException e) {
			log.fatal("Fichier " + PropertiesManager.DEFAULT_CONFIG 
					+ " introuvable", e);
			System.exit(0);
		} catch(IOException e) {
			log.fatal("Fichier " + PropertiesManager.DEFAULT_CONFIG 
					+ " illisible", e);
			System.exit(0);
		} catch(NullPointerException e) { // nécessaire, sinon ça plante à l'éxecution
			log.fatal("Fichier " + PropertiesManager.DEFAULT_CONFIG 
					+ " introuvable", e);
			System.exit(0);
		}

	}
	
	/** 
	 * Permet de lire un fichier de configuration quelconque et d'ajouter et/ou
	 * de remplacer les nouveaux paramètres du fichier de config global 
	 * (le fichier personnalisé).
	 * 
	 * @param defaultProperties Les propriétés en cours de l'application et
	 * auxquelles ont veut rajouter des propriétés personnalisée (les 
	 * anciennes valeurs sont écrasées)
	 * @param nomFichier Le nom du fichier de propriétés à ajouter. Le fichier
	 * doit être dans le CLASSPATH ...
	 * @throws FileNotFoundException Le fichier n'est pas trouvé
	 * @throws IOException On ne peut pas lire le contenu du fichier
	 * @throws NullPointerException Un autre problème s'est produit
	 */
	public PropertiesLoader(Properties defaultProperties, String nomFichier) 
			throws FileNotFoundException,
					IOException,
					NullPointerException {
		super(defaultProperties);
		loadFile(nomFichier);
	}
	
	/**
	 * Lit un fichier de configuration.
	 * @param nomFichier Le nom du fichier de propriétés à ajouter. Le fichier
	 * doit être dans le CLASSPATH ...
	 * @throws FileNotFoundException Le fichier n'est pas trouvé
	 * @throws IOException On ne peut pas lire le contenu du fichier
	 * @throws NullPointerException Un autre problème s'est produit
	 */
	private void loadFile(String nomFichier) 
			throws FileNotFoundException,
					IOException,
					NullPointerException {
		log.info("On charge le fichier de configuration " + nomFichier);
		// On rajoute un / au début du fichier pour chercher dans le CLASSPATH
		FileInputStream in = new FileInputStream(
			getClass().getResource("/" + nomFichier).getPath());
		load(in);
		in.close();
	}
	
	/* Pour tester */
	public static void main(String[] arguments) throws Exception {
		Properties mProprietes = new Properties();
		PropertiesLoader customProperties = new PropertiesLoader(
					mProprietes, PropertiesManager.CUSTOM_CONFIG);
	}
}
