/*   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 dom;
	
	public static void main(String [] args) {
		GestionEtudiants ge = new GestionEtudiants();
		ge.chargerXML();
		ge.afficherEtudiants();
		ge.ajouterEtudiant();
		ge.modifierEtudiant();
		ge.SauverArbre("etudiants4.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("etudiants.xml");	
			dom =  parser.parse(fdom);
		}
		catch(Exception e) {
		}
	}
	
	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(dom), 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 = dom.createElement("etudiant");		
		fils.setAttribute("nom",pnom);	
        fils.setAttribute("prenom",pprenom);
        //recuperer la racine
        Element racine = dom.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 = dom.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 modifier");
       }
        else System.out.println("Etudiant n'existe pas");	   
	}
	
	public void afficherEtudiants() {
		try {
		Element e = dom.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) {
		}
	}
}