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 nom) throws 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 = ((Element) root).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((Element) n, "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 }
|