/*   Corrige exo 1  
*/
import org.w3c.dom.*;
import javax.xml.parsers.*;// DocumentBuilderFactory, DocumentFactory
import java.util.Scanner;
import java.io.*;
import java.io.File;

//pour la suvegarded'un arbre dom en xml
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.*;

public class GestionEtudiants {
	private Document doc;
	
	public static void main(String [] args) {
		GestionEtudiants ge = new GestionEtudiants();
		ge.chargerXML();
		ge.afficherEtudiants();
		ge.ajouterEtudiant();
		ge.modifierEtudiant();
		ge.SauverArbre("etudiant_mod.xml");
		
	}
	
	public void chargerXML() {
		try {
		    // création d'une fabrique de documents, fabrique de constructeurs
			DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
			// création d'un constructeur de documents
			DocumentBuilder parser = fabrique.newDocumentBuilder();
            // lecture du contenu d'un fichier XML avec DOM
			File fdom = new File("etudiant.xml");	
			doc =  parser.parse(fdom);
		}
		catch(Exception e) {
		System.out.println("Sortie Erreur 1");

		}
	}
	
	public void SauverArbre(String fileName) {
		try {
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer transformer = tf.newTransformer();
			transformer.setOutputProperty(OutputKeys.METHOD, "xml");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
			File f = new File(fileName);
			if (f.exists()) {
			f.delete();
			}
			StreamResult nvFichier = new StreamResult(f);
			transformer.transform(new DOMSource(doc), nvFichier);
		}
		catch(Exception e) {
		}

	}
	
	public void ajouterEtudiant(){
	
		String pnom, pprenom;
	   // On récupère le flot de l'entrée standard (par défaut le clavier) dans un objet Scanner
		Scanner sc = new Scanner(System.in);
	    System.out.println("Veuillez saisir le nom :");
        pnom = sc.nextLine();
	    System.out.println("Veuillez saisir le prenom :");
        pprenom = sc.nextLine();
		// creer un nouveau fils etudiant
		Element fils = doc.createElement("etudiant");		
		fils.setAttribute("nom",pnom);	
        fils.setAttribute("prenom",pprenom);
        //recuperer la racine
        Element racine = doc.getDocumentElement();	
        // ajouter le nouveau fils		
		racine.appendChild(fils);
	}
	
	public void modifierEtudiant(){
	
		String pnom, pprenom, blanc;
		int Pos,i,NbEtudiants;
	   // On récupère le flot de l'entrée standard (par défaut le clavier) dans un objet Scanner
		Scanner sc = new Scanner(System.in);
	    System.out.println("Veuillez saisir la position nom :");
        Pos = sc.nextInt();
		blanc = sc.nextLine();
		// rechercher le Pos ieme etudiant
		Element racine = doc.getDocumentElement();
		NodeList nl = racine.getChildNodes();
		NbEtudiants=0;
		for(i = 0; i < nl.getLength() ; i++) {
		  Node n = nl.item(i);
		  if (n.getNodeType()==Node.ELEMENT_NODE )NbEtudiants++;
		}
		
		if(Pos<NbEtudiants) {
			System.out.println("Veuillez saisir le nom :");
			pnom = sc.nextLine();
			System.out.println("Veuillez saisir le prenom :");
			pprenom = sc.nextLine();
			
			Element fils = (Element) nl.item(Pos);
			fils.setAttribute("nom",pnom);	
			fils.setAttribute("prenom",pprenom);
			System.out.println("Etudiant modifié");
       }
        else System.out.println("Etudiant n'existe pas");	   
	}
	
	public void afficherEtudiants() {
		try {
		Element e = doc.getDocumentElement();
		
		NodeList nl = e.getChildNodes();
		
		int i, j;
		for(i = 0; i < nl.getLength() ; i++) {
			Node n = nl.item(i);
			switch(n.getNodeType()) {
				case Node.TEXT_NODE :
				System.out.println("Noeud texte "+ n.getNodeValue());
				break;
				case Node.ELEMENT_NODE :
				System.out.println("Noeud "+ n.getNodeName() + " Liste des attributs");
					for(j = 0; j < n.getAttributes().getLength() ; j++) {
						Node nf = n.getAttributes().item(j);
						System.out.println(nf.getNodeName()+ " : " +nf.getNodeValue());
					}
				System.out.println();
				break;
				}
			}
		}
		catch(Exception e) {
		}
	}
	
	/* Version 2 de l'affichage */
	
	public void afficherEtudiants_V2() {
		
		int i;
		Node n;
		NodeList nl;
		
		try {
			
		Element e;

		e = doc.getDocumentElement();
		
		nl = e.getChildNodes();
				
		System.out.println("Nombre de noeuds fils = " + nl.getLength());
		
		for(i = 0; i < nl.getLength() ; i++) {
			n = nl.item(i);
		    System.out.println("Noeud : " + n.getNodeType() + " " + n.getNodeName());
		}

		}
		catch(Exception e) {
		}
	}
	
		/* Version 3 de l'affichage */
	
	public void afficherEtudiants_V3() {
		
		int i, j, k;
		Node n;
		NodeList nl;
		
		try {
			
		Element e;

		e = doc.getDocumentElement();
		
		nl = e.getChildNodes();
				
		System.out.println("Nombre de noeuds fils = " + nl.getLength());
		
		for(i = 0; i < nl.getLength() ; i++) {
			n = nl.item(i);
		    System.out.println("Noeud : " + n.getNodeType() + " " + n.getNodeName());
		    System.out.println("*********************");
			if (n.getNodeType()==Node.TEXT_NODE)
				System.out.println("Noeud texte "+ n.getNodeValue());
			else if (n.getNodeType()==Node.ELEMENT_NODE)
			{
				if (n.getAttributes().getLength() != 0)
				{
					System.out.println("Liste des attributs : ");
					for(j = 0; j < n.getAttributes().getLength() ; j++) {
						Node nf = n.getAttributes().item(j);
						System.out.println(nf.getNodeName()+ " : " +nf.getNodeValue());
					}					
				}
				else System.out.println("Element sans attributs");
				
				if (n.getChildNodes().getLength() != 0)
				{
					System.out.println("Liste des enfants : ");
					for(k = 0; k < n.getChildNodes().getLength() ; k++) {
						Node nf = n.getChildNodes().item(k);
						System.out.println(nf.getNodeName()+ " : " +nf.getNodeValue());
					}					
				}
				else System.out.println("Element sans enfants");

				
			}

		}

		}
		catch(Exception e) {
		}
	}


	
	/**  creer un document xml par dom  **/
	public void creerEtudiants() {
		try {      
			DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();       
			DocumentBuilder builder = fabrique.newDocumentBuilder();      
			doc = builder.newDocument();     
			Element racine = (Element) doc.createElement("etudiants");       
			doc.appendChild(racine);    
		} catch (Exception e) {       
			e.printStackTrace();     
		} 
	}

}