/*   Corrige exo 1  
*/

/* Ne pas oublier de créer dans note pad ++ le .xml et le copier coller dans éclipse sur le nom du projet
java application pour compiler
créer Une classe /!\ de bien remplacer au bon endroit !!!*/
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 { // modifier ça doit être le nom de la classe
	private Document doc;
	
	public static void main(String [] args) {
		GestionEtudiants ge = new GestionEtudiants(); // modifier ça doit être le nom de la classe (GestiobnEtudiants)
		ge.chargerXML(); // permet de charger l'XML
		ge.afficherEtudiants(); // si on veut utiliser la fonction afficher
		ge.ajouterEtudiant();  // si on veut utiliser la fonction ajouter 
		ge.modifierEtudiant(); // si on veut utiliser la fonction modifier
		ge.SauverArbre("etudiants4.xml");  // changer le nom du .xml ça doit etre le même que l'autre
		
	}
	
	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");	// changer le document .xml
			doc =  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(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 modifier");
       }
        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) {
		}
	}
	
	/**  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();     
		} 
	}

}