/**
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 ?
*/