#!/usr/bin/python
# -*- coding: UTF-8 -*-


"""
    Code pour la declaration des classes de configuration lue dans les fichiers
    XML avec DOM.
"""


###############################################################################
# Informations de versions
###############################################################################
__project__   = 'Formation Python'
__author__    = 'Simon CHOLLET (s.chollet@llr.in2p3.fr)'
__modifiers__ = ''
__date__      = '12/09/2011'
__version__   = '1.0'


###############################################################################
# Importations
###############################################################################
# Importation du minidom
import xml.dom.minidom as xmldom

# Importation de l'objet permettant de stocker la configuration
import config_xml as xmlcfg


###############################################################################
# Definitions specifiques
###############################################################################
# Chemin des fichiers XML
XML_SIMPLE_CFG_INPUT_PATH  = "../input/simple.xml"
XML_SIMPLE_CFG_OUTPUT_PATH = "../output/out.xml"


###############################################################################
# Declaration des classes / fonctions
###############################################################################
def FillSimpleCfg(cfg, doc):
    """
        Fonction qui permet de remplir une configuration simple.
        -------------------------------------------------------------------
        Arguments :
            - cfg : Configuration a remplir.
            - doc : Le document XML a analyser.
        -------------------------------------------------------------------
        Retour : Aucun.
    """
    # Enregistrement de la configuration
    cfg.m_author   = doc.getElementsByTagName("author")[0].childNodes[0].data
    cfg.m_email    = doc.getElementsByTagName("email")[0].childNodes[0].data
    for elt in doc.getElementsByTagName("institut")[0].attributes.items():
        cfg.m_institut[elt[0]] = elt[1]
    cfg.m_date     = doc.getElementsByTagName("date")[0].childNodes[0].data
    cfg.m_version  = doc.getElementsByTagName("version")[0].childNodes[0].data


#
#
# Fonction appelee lors de la demande
# d'execution de la classe/module
if __name__ == "__main__":

    # La configuration simple a charger
    simple_cfg = xmlcfg.SimpleCfg()

    ###########################################################################
    # Lecture simple d'un fichier XML
    xml_doc = xmldom.parse(XML_SIMPLE_CFG_INPUT_PATH)

    # Remplissage de la configuration
    FillSimpleCfg(simple_cfg, xml_doc)

    # Affichage de la configuration lue
    # Affiche :
    #   --- Lecture Fichier --------
    #   >>> SimpleCfg.__repr__() <<<
    #    * Auteur   : Simon CHOLLET
    #    * Email    : s.chollet@llr.in2p3.fr
    #    * Institut : LLR, Ecole Polytechnique - 91128 PALAISEAU
    #    * Date     : 09/09/2011
    #    * Version  : 1.0
    print "--- Lecture Fichier --------"
    print simple_cfg

    ###########################################################################
    # Lecture simple d'une chaine de caracteres
    xml_str = """<?xml version="1.0" encoding="utf-8" ?>
        <config>
            <author>Simon CHOLLET</author>
            <email>s.chollet@llr.in2p3.fr</email>
            <institut nom="LLR" address="Ecole Polytechnique - 91128 PALAISEAU" />
            <date>09/09/2011</date>
            <version>1.0</version>
        </config>"""
    xml_doc = xmldom.parseString(xml_str)

    # Remplissage de la configuration
    FillSimpleCfg(simple_cfg, xml_doc)

    # Affichage de la configuration lue
    # Affiche :
    #   --- Lecture Chaine ---------
    #   >>> SimpleCfg.__repr__() <<<
    #    * Auteur   : Simon CHOLLET
    #    * Email    : s.chollet@llr.in2p3.fr
    #    * Institut : LLR, Ecole Polytechnique - 91128 PALAISEAU
    #    * Date     : 09/09/2011
    #    * Version  : 1.0
    print "--- Lecture Chaine ---------"
    print simple_cfg

    ###########################################################################
    # Creation d'un document XML
    # Le nouveau document
    new_doc = xmldom.Document()

    # Ajout des balises
    config_tag   = new_doc.createElement('config')
    author_tag   = new_doc.createElement('author')
    author_data  = new_doc.createTextNode('Simon CHOLLET')
    author_tag.appendChild(author_data)
    email_tag    = new_doc.createElement('email')
    email_data   = new_doc.createTextNode('s.chollet@llr.in2p3.fr')
    email_tag.appendChild(email_data)
    institut_tag = new_doc.createElement('institut')
    institut_tag.setAttribute('nom', 'LLR')
    institut_tag.setAttribute('address', 'Ecole Polytechnique - 91128 PALAISEAU')
    date_tag     = new_doc.createElement('date')
    date_data    = new_doc.createTextNode('12/09/2011')
    date_tag.appendChild(date_data)
    version_tag  = new_doc.createElement('version')
    version_data = new_doc.createTextNode('1.0')
    version_tag.appendChild(version_data)
    # La configuration finale
    config_tag.appendChild(author_tag)
    config_tag.appendChild(email_tag)
    config_tag.appendChild(institut_tag)
    config_tag.appendChild(date_tag)
    config_tag.appendChild(version_tag)
    new_doc.appendChild(config_tag)

    # Affichage du document cree
    # Affiche :
    #   <?xml version="1.0" ?>
    #   <config>
    #       <author>
    #           Simon CHOLLET
    #       </author>
    #       <email>
    #           s.chollet@llr.in2p3.fr
    #       </email>
    #       <institut address="Ecole Polytechnique - 91128 PALAISEAU" nom="LLR"/>
    #       <date>
    #           12/09/2011
    #       </date>
    #       <version>
    #           1.0
    #       </version>
    #   </config>
    print new_doc.toprettyxml()

    # Sauvegarde du fichier
    out = open(XML_SIMPLE_CFG_OUTPUT_PATH, 'w')
    out.write(new_doc.toprettyxml())
    out.close()
