Acquisition.java
001 package fr.isae.data;
002 
003 import java.io.*;
004 import java.util.*;
005 import javax.xml.parsers.DocumentBuilder;
006 import javax.xml.parsers.DocumentBuilderFactory;
007 import javax.xml.parsers.ParserConfigurationException;
008 import org.w3c.dom.Document;
009 import org.w3c.dom.Element;
010 import org.w3c.dom.Node;
011 import org.w3c.dom.NodeList;
012 import org.xml.sax.SAXException;
013 
014 /**
015  <code>Acquisition</code> permet de lire et de stocker les donnees d'un fichier
016  * XML qui representent des experience relevees lors d'une experience.
017  *
018  @author <a href="mailto:garion@isae.fr">Christophe Garion</a>
019  @version 1.0
020  */
021 public class Acquisition implements Iterable<Double> {
022 
023     private ArrayList<Double> data;
024     private String responsable;
025     private String nomFichier;
026 
027     /**
028      * Creer une instance d'<code>Acquisition</code>. On lit le fichier XML et
029      * on construit la liste de valeurs correspondante.
030      *
031      @param nom une instance de <code>String</code> qui est le nom du fichier
032      *            contenant les donnees
033      @exception ElementXMLException si le fichier XML ne respecte pas la
034      *                                specification attendue
035      @exception FormatDonneesException si le texte d'un element n'est pas
036      *                                   convertible en un reel ou est negatif
037      @exception ResponsableException si le responsable de l'experience n'est
038      *                                 pas precise
039      @exception IOException erreur de lecture du fichier
040      @exception ParseConfigurationException erreur lors de la construction
041      *                                        du parser
042      @exception SAXException erreur lors du parsing du fichier
043      */
044     public Acquisition(String nomthrows ElementXMLException,
045         ResponsableException, FormatDonneesException,
046         ParserConfigurationException, SAXException, IOException {
047         this.nomFichier = nom;
048         this.data = new ArrayList<Double>();
049         this.acquerirDonnees();
050     }
051 
052     private void acquerirDonnees() throws ElementXMLException,
053         ResponsableException, FormatDonneesException,
054         ParserConfigurationException, SAXException, IOException {
055         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
056 
057         DocumentBuilder db = dbf.newDocumentBuilder();
058         Document doc = db.parse(new File(this.nomFichier));
059 
060         Element root = doc.getDocumentElement();
061 
062         verifyElement(root, "experience");
063 
064         String respName = ((Elementroot).getAttribute("resp-name");
065 
066         if (respName != null) {
067             this.responsable = respName;
068         else {
069             throw new ResponsableException("Il n'y a pas de responsable!");
070         }
071 
072         NodeList childNodes = root.getChildNodes();
073 
074         ArrayList<String> errors = new ArrayList<String>();
075 
076         for(int i = 0; i < childNodes.getLength(); i++) {
077             Node n = childNodes.item(i);
078             if (n.getNodeType() == Node.ELEMENT_NODE) {
079                 verifyElement((Elementn, "pression");
080 
081                 String content = n.getTextContent();
082 
083                 try {
084                     double d = Double.parseDouble(content);
085 
086                     if (d < 0) {
087                         errors.add(content + " n'est pas positif");
088                     else {
089                         data.add(d);
090                     }
091                 catch (NumberFormatException e) {
092                     errors.add(content + " ne represente pas un nombre");
093                 }
094             }
095         }
096 
097         if (! errors.isEmpty()) {
098             throw new FormatDonneesException("Erreur dans les valeurs numeriques",
099                                              errors);
100         }
101     }
102 
103     /**
104      * Le nom du responsable de l'experience.
105      *
106      @return une instance de <code>String</code> qui est le nom du responsable
107      */
108     public String getResponsable() {
109         return this.responsable;
110     }
111 
112     @Override public Iterator<Double> iterator() {
113         return data.iterator();
114     }
115 
116     @Override public String toString() {
117         String s = "Fichier de donnees : " this.nomFichier;
118 
119         s +=  "\nExperience menee par : " this.responsable +
120             "\nValeurs relevees:\n";
121 
122         for (Double d : this) {
123             s += "   " + d + "\n";
124         }
125 
126         return s;
127     }
128 
129     private void verifyElement(Element e, String expectedName)
130         throws ElementXMLException {
131         if (! e.getTagName().equals(expectedName)) {
132             throw new ElementXMLException("le nom de l'element n'est pas " +
133                                           expectedName +
134                                           " mais " +
135                                           e.getTagName());
136         }
137     }
138 }