/* Production d'un document XML "histogramme"
   à partir d'un document "listeNotes" 
   en "format 1" : <eleve nom="Toto" note="12 />
   avec Javax standard. 
*/

import org.w3c.dom.Document;
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import java.io.Writer;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileOutputStream;

public class LN2Histo {

	private int[] tabHist = new int[21];
	/* contient le tableau des fréquences des notes */

// constructeur ------------------------------------------------------------------------

	public LN2Histo(Document ln) {
	
		NodeList liste = ln.getElementsByTagName("eleve");
		
		for (int k = 0; k < tabHist.length; k++ ){
			tabHist[k] = 0;
		}
		
		for ( int i = 0; i < liste.getLength(); i++ ) {
			Element el = (Element) liste.item(i);
			int note = Integer.parseInt(el.getAttribute("note"));
			tabHist[note]++;
		}
	}// constructeur LN2Histo
	
// méthode de service - ici, méthode d'instance
	public void sortir (Document doc, Writer out) throws Exception {
		DOMSource src = new DOMSource(doc);
    	StreamResult res = new StreamResult(out);
    	Transformer trans = TransformerFactory.newInstance().newTransformer();
    	
		trans.transform(src, res);
	}
		
// la méthode principale ---------------------------------------------------------------

    public Document makeXML() throws Exception {
    
    	DocumentBuilder parseur = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document histo = 
			parseur.getDOMImplementation().createDocument(null, "chart", null);			
		Element chart = histo.getDocumentElement();
		
		Element data = histo.createElement("chart_data");
		chart.appendChild(data);
		
//Première partie = l'axe des abscisses
		Element base = histo.createElement("row");
		data.appendChild(base);
		base.appendChild(histo.createElement("null"));
		
		for( int i = 0; i < tabHist.length; i++ ){
			Element chn = histo.createElement("string");
			base.appendChild(chn);
			chn.appendChild(histo.createTextNode(String.valueOf(i)));
		}
		
//Seconde partie = l'axe des ordonnées		
		Element val = histo.createElement("row");
		data.appendChild(val);
		val.appendChild(histo.createElement("null"));
		
		for( int i = 0; i < tabHist.length; i++ ){
			Element nbr = histo.createElement("number");
			val.appendChild(nbr);
			nbr.appendChild(histo.createTextNode(String.valueOf(tabHist[i])));
		}
		
// et c'est tout !
		return histo;

    } //makeXML

// exécution --------------------------------------------------------------------------  

    public static void main(String[] args) {
		if( args.length < 1 ){
	    	System.out.println("Il me faut un nom de fichier !" );
		} else {
		    try {
		     	BufferedReader entree = new BufferedReader(new FileReader(args[0]));
	    		Document doc = NNTxt2Xml.lireText(entree);
	    		LN2Histo mkh = new LN2Histo(doc);
		    	Document res = mkh.makeXML();
		    	
		    	if( args.length == 1 ){ 
		       		Writer sortieStandard = 
			               new OutputStreamWriter(System.out, "UTF-8");
			        mkh.sortir(res, sortieStandard);
				}else{ // sortie sur fichier
					String nomFich = args[1]; 
					Writer sortieFichier = new OutputStreamWriter(
							new FileOutputStream(nomFich), "UTF-8");
               		mkh.sortir(res, sortieFichier);
               }
			} catch (Exception e) {
	    		System.out.println("Erreur "+ e.getMessage());
            }
        }
    } // main
}//LN2Histo


