/*
 * Loader.java
 *
 * Created on 14 novembre 2007, 11:08
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package fr.gouv.finances.cp.xemelios.common.config;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.log4j.Logger;
import org.xml.sax.SAXException;

/**
 * Provides helper method to load config files
 * @author chm
 */
public class Loader {
    private static final Logger logger = Logger.getLogger(Loader.class);
    private static DocumentsModel cache = null;
    
    /**
     * Loads and returns config files. If config files contains at least one error, returns an empty DocumentsModel.
     * @param repertoires A comma-separated list of directories where to find config files
     * @return DocumentsModel the fully-assembled config
     */
    public static DocumentsModel getDocsInfos(String repertoires) throws SAXException, ParserConfigurationException, IOException {
        DocumentsModel ret = cache;
        if(ret==null) {
            String[] dirs = repertoires.split(",");
            for(String repertoire:dirs) {
                File dir = new File(repertoire);
                logger.info("Searching " + repertoire);
                if (!dir.exists()) {
                    logger.info(repertoire + " does not exists.");
                    continue;
                }
                // Fichiers de config
                File[] fichiers = dir.listFiles(new FilenameFilter() {
                    public boolean accept(File dir, String name) {
                        return name.toUpperCase().endsWith(".XML") && !"build.xml".equals(name);
                    }
                });
                if (fichiers == null) {
                    logger.info("No file found in " + repertoire);
                    return null;
                }
                DocumentsParser dp = new DocumentsParser();
                for (int i = 0; i < fichiers.length; i++) {
                    dp.parse(fichiers[i]);
                    DocumentsModel dm = (DocumentsModel) dp.getMarshallable();
                    if (ret == null) {
                        ret = dm;
                        for(DocumentModel docModel:dm.getDocuments()) {
                            docModel.setBaseDirectory(repertoire);
                        }
                    } else {
                        for(DocumentModel docModel : dm.getDocuments()) {
                            docModel.setBaseDirectory(repertoire);
                            ret.addChild(docModel, DocumentModel.QN);
                        }
                    }
                }
            }
            for(String repertoire:dirs) {
                // fichiers dérivés d'une config
                File dir = new File(repertoire);
                logger.info("Searching " + repertoire);
                if (!dir.exists()) {
                    logger.info(repertoire + " does not exists.");
                    continue;
                }
                File[] fichiers = dir.listFiles(new FilenameFilter() {
                    public boolean accept(File dir, String name) {
                        return name.toUpperCase().endsWith(".EXML");
                    }
                });
                if (fichiers == null) {
                    logger.info("No file found in " + repertoire);
                    return null;
                }
                for(File f:fichiers) {
                    DocumentsParser dp = new DocumentsParser();
                    dp.setInitialData(ret);
                    dp.parse(f);
                    ret = (DocumentsModel)dp.getMarshallable();
                    for(DocumentModel docModel:ret.getDocuments()) {
                        if(docModel.getBaseDirectory()==null)
                            docModel.setBaseDirectory(repertoire);
                    }
                }
            }
            cache = ret;
        }
        return ret;
    }
    
    public static DocumentsModel getDocumentsInfos(String repertoires) throws SAXException, ParserConfigurationException, IOException {
        DocumentsModel ret = getDocsInfos(repertoires);
        try {
            ret.validate();
        } catch(Throwable t) {
            logger.error("while loading config files: "+t);
            ret = new DocumentsModel(DocumentsModel.QN);
        }
        logger.debug("exiting successfully getDocumentsInfos");
        return ret;
    }
    
}
