/* Traduction du fichier XML des adhérents à partir du CSV
   avec Javax standard.
   Modèle du CSV : Prénom-1;Prénom-2;NOM;Adresse 
   (4 champs exactement)
*/

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.*; // spécifications officielles.

import javax.xml.parsers.DocumentBuilder; // l'implémentation standard de Java 1.4
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.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;

import java.util.StringTokenizer;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Csv2Xml {
	
	private Document listeAdh;
	private Element liste;
	
	public Csv2Xml() throws Exception{
		DocumentBuilder parseur = 
			DocumentBuilderFactory.newInstance().newDocumentBuilder();
			
		listeAdh = 
			parseur.getDOMImplementation().createDocument(null, "liste", null);	
		liste = listeAdh.getDocumentElement();
	}
		
	public Element lireAdresse(String adr){
	// Sous l'hypothèse que l'adresse est complète !
	
		String zip_code = "\\d{2}+ \\d{3}+"; // 26 340
		Pattern pzpc = Pattern.compile(zip_code);
		Matcher mzpc = pzpc.matcher(adr);

		if( mzpc.find() ){
			String codPost = adr.substring(mzpc.start(), mzpc.end());
			String[] lieuLoc = pzpc.split(adr);
			
			Element adresse = listeAdh.createElement("adresse");
			adresse.setAttribute("localite", lieuLoc[1].trim());
			adresse.setAttribute("codePostal", codPost);
			adresse.setAttribute("lieu", lieuLoc[0].trim());
			
			return adresse;
		}else{
			Element adresse = listeAdh.createElement("adresse");
			adresse.setAttribute("localite", "");
			adresse.setAttribute("codePostal", "");
			adresse.setAttribute("lieu", "");
			
			return adresse;
		}
	}
	
	public Document lireText(BufferedReader entree) throws Exception {
			
		String ligne = entree.readLine(); // le titre
		ligne = entree.readLine(); // ligne blanche
		ligne = entree.readLine(); // les champs
		ligne = entree.readLine(); // ligne blanche

		ligne = entree.readLine(); // la première ligne
		
        do {
			StringTokenizer lex = new StringTokenizer(ligne, ";");
	//System.out.println(ligne);
			// 4 champs obligatoires
			String prenom1 = lex.nextToken().trim();			
			String prenom2 = lex.nextToken().trim();
			String nom = lex.nextToken().trim();
			String adresse = lex.nextToken().trim();
							
			Element adh = listeAdh.createElement("adherent");
			if( nom.contains("/") ){
				String[] noms = nom.split("/");
				adh.setAttribute("nom1", noms[0].trim());
				adh.setAttribute("nom2", noms[1].trim());
			}else{
				adh.setAttribute("nom1", nom.trim());
				adh.setAttribute("nom2", "");
			}

			adh.setAttribute("prenom1", prenom1);
			adh.setAttribute("prenom2", prenom2.equals("//")?"":prenom2);
			
			adh.appendChild(lireAdresse(adresse));

			liste.appendChild(adh);

			ligne = entree.readLine();
        } while ( ligne != null );

		return listeAdh;
	}//lireText
       
    public static void main(String[] args) {
			String fichIn = "ListeAdh-4.csv";	
			String fichOut = "ListeAdh-4.xml";	
		    try {
		    	Csv2Xml lect = new Csv2Xml();
				BufferedReader entree = 
					new BufferedReader ( 
						new InputStreamReader(
							new FileInputStream (fichIn), 
							"MacRoman") );

	    		Document doc = lect.lireText(entree);
	    		DOMSource ds = new DOMSource(doc);
	    		StreamResult res = new StreamResult(new File(fichOut)); 
	    		Transformer trans = TransformerFactory.newInstance().newTransformer();
	    		trans.transform(ds, res);

			} catch (Exception e) {
	    		System.out.println("Erreur "+ e.getMessage());
            }
    } // main
}//Csv2Xml


