/** Une solution au TP DA 2002-2003 - implémentation avec une collection de type List */ import java.io.*; import java.util.*; public class VentesCSVtoXML { // format d'un ligne du fichier CSV : public;code;qte;;mois;annee[;commentaire] List listeProduitsMois; // une liste des produits mis à jour durant la lecture du fchier csv. String nameFileSource; // nom du fichier csv à traiter String nameFileDest; // nom du fichier résultat // construteur public VentesCSVtoXMLFile(String nameFile) { nameFileSource = nameFile; nameFileDest = changeExtension(nameFileSource, "xml"); listeProduitsMois = new ArrayList(); } // définition d'une classe interne. // Une instance de la classe englobante pourra exercer un // acces direct aux attributs des objets de cette classe, même // si ceux-ci sont déclarés privé (private). class ProduitMois { private String _public; private String _code; private int _qte; private String _mois; private String _annee; private String _commentaire; private String _cle; ProduitMois(String[] infosproduit) { _public=infosproduit[0]; _code=infosproduit[1]; _qte=Integer.parseInt(infosproduit[2]); _mois=infosproduit[3]; _annee=infosproduit[4]; if (infosproduit.length>5) _commentaire=infosproduit[5]; else _commentaire=""; _cle = _code.trim().toUpperCase() + _mois.trim().toUpperCase() + _annee.trim().toUpperCase(); } void update(ProduitMois produitAvecMemeCle) { // assert(this._cle.equals(produitAvecMemeCle._cle)); // A FAIRE } public String toString() { return " \r\n" +" "+ this._public + "\r\n" +" " + this._qte + "\r\n" +" " + this._code + "\r\n" +" " + this._mois + "\r\n" +" " + this._annee + "\r\n" +" " + this._commentaire + "\r\n" +" \r\n"; } public boolean equals(Object o) { if (this==o) return true; if (getClass()==o.getClass()) { ProduitMois p = (ProduitMois) o; return _cle.equals(p._cle); } return false; } }//ProduitMois // méthodes /** @param nameFile le nom du fichier initial @param newExt la nouvelle extension @return le nom du fichier initial avec une nouvelle extension. Dans le cas où il n'y a pas d'extension dans le nom initial, l'extension est ajoutée. exemple : changeExtension("toto.txt", "xml") rend "toto.xml" exemple : changeExtension("toto", "xml") rend "toto.xml" exemple : changeExtension("", "xml") rend ".xml" */ public String changeExtension(String nameFile, String newExt) { String res; int posPt = nameFile.lastIndexOf('.'); if (posPt > 0) res = nameFile.substring(0, posPt) + "." + newExt; else res = nameFile + "." + newExt; return res; } protected String debutXML(){ return " \r\n" + "\r\n" + "\r\n"; } protected String finXML(){ return "\r\n"; } /** @param unProd le produit à rechercher dans la liste. @return la référence au premier objet trouvé dans la liste ayant même clé que unProd. Retourne null si non trouvé. */ private ProduitMois getProduitMoisMemeCleDansListe(ProduitMois unProd) { // A FAIRE } /** Met à jour la liste des produits. @param nouveauProduitCandidat, un représentant d'une ligne du fichier csv Si un produit de meme cle est déja présent dans la liste, celui-ci est mis à jour, sinon nouveauProduitCandidat est ajouté à la liste. */ protected void updateListeProduitsMois(ProduitMois nouveauProduitCandidat){ ProduitMois produitMemeCle = getProduitMoisMemeCleDansListe(nouveauProduitCandidat); if (produitMemeCle != null) { produitMemeCle.update(nouveauProduitCandidat); } else { listeProduitsMois.add(nouveauProduitCandidat); } } public void go() { try { FileReader fr = new FileReader(nameFileSource); BufferedReader br = new BufferedReader(fr); File file = new File(nameFileDest); if (file.exists()) { BufferedReader clav = new BufferedReader(new InputStreamReader(System.in)); System.out.print(nameFileDest + " existe, voulez-vous l'écraser ? (O/N) : "); String rep = clav.readLine(); if (rep == null) rep = "N"; if (!("O".equals(rep.toUpperCase()))){ return; } } PrintWriter out = new PrintWriter(new FileWriter(nameFileDest)); String line; while ((line = br.readLine()) != null) { updateListeProduitsMois(new ProduitMois(line.split(";"))); } out.print(debutXML()); Iterator iterateur = listeProduitsMois.iterator(); while (iterateur.hasNext()) { out.print(iterateur.next()); } out.print(finXML()); out.flush(); } catch (java.io.FileNotFoundException e){ System.out.println(nameFileSource + " : fichier introuvable."); } catch (ArrayIndexOutOfBoundsException e){ System.out.println(nameFileSource + " : mauvais format de fichier."); } catch (java.io.IOException e) { System.out.println(e); } } // go public static void main (String[] args) { if (args.length == 1) new VentesCSVtoXML(args[0]).go(); else System.out.println("USAGE : java VentesCSVtoXML nomFivchierCSVventes"); } } // VentesCSVtoXML /* /////////////////////////////////////////////// Répondre aux questions suivantes 1/ 1.1/ Quel est le rôle de l'attribut _cle de la classe ProduitMois ? 1.2/ Pouvait-on s'en passer, comment ? (détailler votre réponse) 1.3/ Expliquez les avantages et inconvénients de chacune des solutions 1.4/ Donner les raisons d'en préférer une pour cette application. 2/ Donnez une implémentation de la méthode : void update(ProduitMois produitAvecMemeCle) de la classe ProduitMois. 3/ Donnez une implémentation de la méthode : ProduitMois getProduitMoisMemeCleDansListe(ProduitMois unProd) de la classe VentesCSVtoXML. 4/ Dans quelle(s) condition(s), l'exception ArrayIndexOutOfBoundsException peut-elle être déclenchée ? Donner un exemple. Ce "test" vous parait-il suffisamment répondre au point 1 de l'extension du cas d'utilisation ? Donner un exemple. 5/ Déterminer quelle instruction déclenche l'exécution de la méthode toString() d'un objet de type ProduitMois. Justifier votre réponse en fournissant la chaîne des appels de méthodes menant à l'exécution de cette méthode. Aidez-vous de l'aide en ligne. 6/ Quel(s) avantage(s) y a-t-il à utiliser une TreeMap au lieu d'un ArrayList ? */