/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlconfiguration;

import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author blackpanther
 */
public class XMLConfigHandler extends DefaultHandler {

    private static final Logger logger = Logger.getLogger(XMLConfigHandler.class.getName());
    
    private final Properties databaseProperties;        
    private ElementNode currentNode = null;
    private boolean     valid = true;

    XMLConfigHandler(Properties props) {
        this.databaseProperties = props;

        logger.setLevel(Level.FINEST);
    }
    
    public boolean isValid(){
        return valid;
    }

    @Override
    public void startDocument() throws SAXException {
        logger.info("Starting document analysis...");
    }

    @Override
    public void endDocument() throws SAXException {
        logger.info("Document analysis ended");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        logger.entering(XMLConfigHandler.class.getName(), "startElement");

        try {
            currentNode = ElementNode.valueOf(localName.toUpperCase());

            logger.log(Level.INFO, "switching to node : {0}", currentNode);

            if (currentNode == ElementNode.DATABASEACCESSCONFIG) {
                logger.log(Level.INFO, "fetching attribute from current node");

                databaseProperties.put(currentNode.getValue() + ".sgbd", attributes.getValue("sgbd"));
            }
        } catch (IllegalArgumentException e) {
            logger.log(
                    Level.SEVERE, 
                    "problem during node state parsing : {0}\n\t Cause : {1}",
                    new String[]{localName, e.getLocalizedMessage()});
            currentNode = ElementNode.NONE;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        logger.entering(XMLConfigHandler.class.getName(), "endElement");

        currentNode = ElementNode.NONE;

        logger.fine("setting current node to null");
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        logger.entering(getClass().getName(), "characters");

        logger.log(Level.INFO, "current node : {0}", currentNode);
        logger.log(Level.INFO, "fetched text : {0}", new String(ch, start, length));

        switch (currentNode) {
            case DATABASEACCESSCONFIG:
                //do nothing
                break;
            case DATABASENAME:
            case SERVERADDRESS:
            case SERVERPORT:
            case USERLOGIN:
            case USERPASSWD:
                databaseProperties.put(currentNode.getValue(), new String(ch, start, length));
                break;
            default:
                logger.log(Level.WARNING, "current node in an illegal state : {0}", currentNode);
                break;
        }
    }
    
    private void reportProblem(String message, SAXParseException e)
    {
        logger.log(
                Level.SEVERE, 
                message,
                e);
    }

    @Override
    public void error(SAXParseException e) throws SAXException {
        reportProblem("Erreur", e);
        valid = false;
    }

    @Override
    public void fatalError(SAXParseException e) throws SAXException {
        reportProblem("Erreur fatale", e);
        valid = false;
    }

    @Override
    public void warning(SAXParseException e) throws SAXException {
        reportProblem("Warning", e);
        valid = false;
    }
    
    
}
