/* Traduction d'un fichier "adhérents" en une liste d'étiquettes-adresses en pdf
   avec Javax standard.
*/

import org.w3c.dom.*;
import org.xml.sax.*; 

import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.*; 
import javax.xml.transform.sax.*; 
import javax.xml.transform.stream.*; 

import org.apache.fop.apps.*;

import java.io.*;
import java.util.*;
import java.util.regex.*;

public class Csv2Pdf {
	
	private Document listeAdh;
	private Element liste;
	
	public Csv2Pdf() 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);
			// 5 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 xsl = "etiquettes.xsl";
		    String fichOut = "adh.pdf";
		    
		    Driver driver = new Driver();
		    driver.setRenderer(Driver.RENDER_PDF);
		    
		    try {
		    	OutputStream out = new FileOutputStream(fichOut);
		    	driver.setOutputStream(out);
		    	Result res = new SAXResult(driver.getContentHandler());

				BufferedReader entree = 
					new BufferedReader ( 
						new InputStreamReader(
							new FileInputStream (fichIn), 
							"MacRoman") );
							
	    		Document doc = (new Csv2Pdf()).lireText(entree);
	    		DOMSource don = new DOMSource(doc);
	    		//StreamResult res = new StreamResult(new File(fichOut));
	    		
	    		StreamSource fst = new StreamSource(new File(xsl));
	    		Transformer tf = TransformerFactory.newInstance().newTransformer(fst);
	    		
		    	tf.transform(don, res);
				out.close();
				
			} catch (Exception e) {
	    		System.out.println("Erreur "+ e.getMessage());
            }
    } // main
}//Csv2Pdf

