1 | /* |
---|
2 | * Created on 26 Jan. 2007 |
---|
3 | */ |
---|
4 | package com.medias.integration.validation; |
---|
5 | |
---|
6 | import com.medias.Constantes; |
---|
7 | import com.medias.DateTime; |
---|
8 | import com.medias.EcritureLog; |
---|
9 | import com.medias.integration.lecture_ecriture.LectureModeleXML; |
---|
10 | import com.medias.integration.prevalidation.PreValidation; |
---|
11 | import com.medias.integration.vues.ParametreModele; |
---|
12 | |
---|
13 | import java.lang.reflect.InvocationTargetException; |
---|
14 | import java.lang.reflect.Method; |
---|
15 | import java.util.ArrayList; |
---|
16 | import java.util.Date; |
---|
17 | |
---|
18 | /** |
---|
19 | * @author |
---|
20 | * |
---|
21 | * Classe permettant de valider un ensemble de fichier d'un jeu donné |
---|
22 | */ |
---|
23 | public class Validation { |
---|
24 | public Validation(PreValidation preValidation) { |
---|
25 | this.listeMesures = preValidation.getMesures(); |
---|
26 | this.nbParams = preValidation.getNbParams(); |
---|
27 | this.listeParams = preValidation.getInfoParams(); |
---|
28 | this.nbLignesEntete = preValidation.getEntete().size(); |
---|
29 | } |
---|
30 | |
---|
31 | public ArrayList<ArrayList<String>> valider(LectureModeleXML lectureModeleXML, String nomFichier) { |
---|
32 | // On récupére les paramétres du modéle |
---|
33 | // NB: si le délimiteur est l'espace ou la tabulation, |
---|
34 | // on testera 2 délimiteurs par défaut: espace ET tabulation pour éviter les ambiguités |
---|
35 | String delimiteur = lectureModeleXML.getDelimiteur(); |
---|
36 | boolean isDelim2 = false; |
---|
37 | String delimiteur2 = delimiteur, delimiteur1 = delimiteur; |
---|
38 | if (delimiteur.equals( Constantes.delimiteur1) || delimiteur.equals(Constantes.delimiteur2)) { |
---|
39 | delimiteur2 = Constantes.delimiteur22; |
---|
40 | isDelim2 = true; |
---|
41 | } |
---|
42 | String mesure, donnee, datePrec = "", date; |
---|
43 | // Déclarations, initialisations |
---|
44 | int erreurNbParam = 0, erreurType = 0, erreurDate = 0, nbErreursFichier = 0; |
---|
45 | nbErreursTotales = 0; |
---|
46 | int nbMesures = listeMesures.size(); |
---|
47 | // On initialise la liste des tableaux de données des fichiers trouvés |
---|
48 | ArrayList<ArrayList<String>> listeDonnees = new ArrayList<ArrayList<String>>(); |
---|
49 | ArrayList<String> donnees; |
---|
50 | |
---|
51 | if (listeParams.get(0).getFormat() == null && listeParams.get(0).getDateSince() == null) { |
---|
52 | EcritureLog.ecrire( "\nErreur é la ligne 9 : La date doit étre au format YYYY-MM-DD HH:MM:SS Z", "err" ); |
---|
53 | erreurType++; |
---|
54 | } |
---|
55 | |
---|
56 | int indiceDelim, numLigne; |
---|
57 | // On parcourt les mesures du fichier |
---|
58 | for (int numMesure=0; numMesure< nbMesures; numMesure++) { |
---|
59 | mesure = listeMesures.get(numMesure).trim(); |
---|
60 | donnees = new ArrayList<String>(); |
---|
61 | numLigne = nbLignesEntete+numMesure+1; |
---|
62 | indiceDelim = mesure.indexOf(delimiteur1); |
---|
63 | if (isDelim2 && indiceDelim==-1) indiceDelim = mesure.indexOf(delimiteur2); |
---|
64 | // Si la mesure contient au moins un délimiteur... |
---|
65 | while (indiceDelim != -1) { |
---|
66 | // On récupére la 1ére donnée de la mesure avant le délimiteur |
---|
67 | donnee = mesure.substring(0, indiceDelim).trim(); |
---|
68 | donnees.add(donnee); |
---|
69 | // On récupére la mesure restante aprés le délimiteur |
---|
70 | mesure = mesure.substring(indiceDelim+1).trim(); |
---|
71 | indiceDelim = mesure.indexOf(delimiteur1); |
---|
72 | if (isDelim2 && indiceDelim==-1) indiceDelim = mesure.indexOf(delimiteur2); |
---|
73 | } |
---|
74 | donnee = mesure; |
---|
75 | donnees.add(donnee); |
---|
76 | // On compare le nombre de paramétres du modéle avec le nombre de données de la mesure |
---|
77 | // if (!subdiviser){ |
---|
78 | if (donnees.size() != nbParams) { |
---|
79 | EcritureLog.ecrire("\nErreur : le fichier n'a pas le nombre de paramétres attendus é la ligne "+numLigne+" ! Nb données="+donnees.size()+", nb param attendus="+nbParams,"err"); |
---|
80 | erreurNbParam++; |
---|
81 | } |
---|
82 | // On stocke les dates dans une liste |
---|
83 | if (listeParams.get(0).getType().equals("Year")) |
---|
84 | date = donnees.get(2)+"/"+donnees.get(1)+"/"+donnees.get(0)+" "+donnees.get(3)+":"+donnees.get(4)+":"+donnees.get(5); |
---|
85 | else |
---|
86 | date = donnees.get(0); |
---|
87 | if (date.equals(datePrec)) { |
---|
88 | if (listeParams.get(0).getType().equals("Year")) { |
---|
89 | EcritureLog.ecrire("\nErreur é la ligne "+numLigne+", la date '"+date+"' apparait plusieurs fois dans le fichier !","err"); |
---|
90 | } else { |
---|
91 | double val = Double.parseDouble(date); |
---|
92 | Date d = DateTime.hoursSinceToDate( val, listeParams.get( 0 ).getDateSince() ); |
---|
93 | EcritureLog.ecrire("\nErreur é la ligne "+numLigne+", la date '"+date+"' ("+DateTime.dateToString(d, Constantes.formatDateJJMMAAAAHHMMSS)+") apparait plusieurs fois dans le fichier !","err"); |
---|
94 | } |
---|
95 | erreurDate++; |
---|
96 | } |
---|
97 | datePrec = date; |
---|
98 | |
---|
99 | // Test du type de chaque donnee |
---|
100 | erreurType = testType(donnees,numLigne);//, indiceNiv, nbNiv); |
---|
101 | nbErreursTotales += erreurType; |
---|
102 | nbErreursFichier += erreurType; |
---|
103 | listeDonnees.add(donnees); |
---|
104 | donnees = null; |
---|
105 | } |
---|
106 | listeMesures = null; |
---|
107 | if (erreurNbParam > 0 || erreurType > 0 || erreurDate > 0) { |
---|
108 | EcritureLog.ecrire("\nIl y a " + (erreurNbParam + erreurDate + nbErreursFichier)+ " erreur(s) dans le fichier "+nomFichier,"err"); |
---|
109 | } |
---|
110 | nbErreursTotales += erreurNbParam + erreurDate; |
---|
111 | return listeDonnees; |
---|
112 | } |
---|
113 | |
---|
114 | public void vider() { |
---|
115 | listeMesures = null; |
---|
116 | } |
---|
117 | |
---|
118 | /** |
---|
119 | * |
---|
120 | * @return |
---|
121 | * |
---|
122 | */ |
---|
123 | /** |
---|
124 | * Teste si le type de la iéme donnée de la mesure correspond bien au type |
---|
125 | * du paramétre associé |
---|
126 | */ |
---|
127 | |
---|
128 | private int testType(ArrayList<String> donnees, int numLigne) {//, int indiceNiv, int nbNiv) { |
---|
129 | int erreurType = 0; |
---|
130 | String donnee, valeurAbsente, type = null, format = null; |
---|
131 | ParametreModele parametre; |
---|
132 | Method appelTest; |
---|
133 | Class<?>[] paramMethode = { String.class, Object.class , Object.class }; |
---|
134 | ArrayList<Date> dates = null; |
---|
135 | Message message = null; |
---|
136 | Object obj, obj2; |
---|
137 | // int indiceParam, cptNiv = 0, cptParam = 0; |
---|
138 | for (int numDonnee = 0; numDonnee < donnees.size(); numDonnee++) { |
---|
139 | donnee = donnees.get(numDonnee); |
---|
140 | |
---|
141 | if (numDonnee < nbParams) { |
---|
142 | parametre = listeParams.get(numDonnee);//parametres.get(indiceParam); |
---|
143 | valeurAbsente = parametre.getValAbsente(); |
---|
144 | type = parametre.getType(); |
---|
145 | dates = new ArrayList<Date>(); |
---|
146 | dates.add(parametre.getDateSince()); |
---|
147 | dates.add(parametre.getDateDeb()); |
---|
148 | dates.add(parametre.getDateFin()); |
---|
149 | format = parametre.getFormat(); |
---|
150 | } else { |
---|
151 | valeurAbsente = donnee; |
---|
152 | parametre = new ParametreModele(); |
---|
153 | } |
---|
154 | // On teste les données n'étant pas égales é la valeur absente |
---|
155 | if (valeurAbsente == null || !donnee.equals(valeurAbsente)) { |
---|
156 | obj = format; |
---|
157 | obj2 = dates; |
---|
158 | Object[] argumentsMethode = {donnee,obj,obj2}; |
---|
159 | try { |
---|
160 | // Création de la méthode correspondant au type trouvé |
---|
161 | appelTest = ControleurType.class.getMethod("tester" + type, paramMethode); |
---|
162 | try { |
---|
163 | // Invocation de la méthode sur la donnée |
---|
164 | message = (Message) appelTest.invoke(null, argumentsMethode); |
---|
165 | } catch (IllegalAccessException e1) { |
---|
166 | e1.printStackTrace(); |
---|
167 | } catch (InvocationTargetException e1) { |
---|
168 | e1.printStackTrace(); |
---|
169 | } |
---|
170 | } catch (NoSuchMethodException e) { |
---|
171 | e.printStackTrace(); |
---|
172 | } |
---|
173 | // On affiche les erreurs éventuelles |
---|
174 | if (!message.isValid()) { |
---|
175 | EcritureLog.ecrire("\nErreur é la ligne "+numLigne+" : " + message.getMessage(),"err"); |
---|
176 | erreurType++; |
---|
177 | } |
---|
178 | } |
---|
179 | // Si la donnée est une valeur absente et est une latitude : ERREUR |
---|
180 | else if (parametre.getNom().toLowerCase().equals(Constantes.nomParametreLatitude)) { |
---|
181 | EcritureLog.ecrire("\nErreur é la ligne "+numLigne+" : La latitude est une valeur absente ("+donnee+")","err"); |
---|
182 | erreurType++; |
---|
183 | } |
---|
184 | // Si la donnée est une valeur absente et est une longitude : ERREUR |
---|
185 | else if (parametre.getNom().toLowerCase().equals(Constantes.nomParametreLongitude)) { |
---|
186 | EcritureLog.ecrire("\nErreur é la ligne "+numLigne+" : La longitude est une valeur absente ("+donnee+")","err"); |
---|
187 | erreurType++; |
---|
188 | } |
---|
189 | } |
---|
190 | return erreurType; |
---|
191 | } |
---|
192 | |
---|
193 | public int getIndiceNiv() { |
---|
194 | return indiceNiv; |
---|
195 | } |
---|
196 | |
---|
197 | public int getNbErreursTotales() { |
---|
198 | return nbErreursTotales; |
---|
199 | } |
---|
200 | |
---|
201 | public ArrayList<ParametreModele> getListeParams() { |
---|
202 | return listeParams; |
---|
203 | } |
---|
204 | |
---|
205 | private ArrayList<String> listeMesures; |
---|
206 | private int nbParams; |
---|
207 | private int nbLignesEntete; |
---|
208 | private ArrayList<ParametreModele> listeParams; |
---|
209 | // Le nombre d'erreurs totales trouvées pendant la validation |
---|
210 | private int nbErreursTotales; |
---|
211 | private int indiceNiv; |
---|
212 | } |
---|