source: ether_megapoli/trunk/service/implementation/com/medias/integration/validation/Validation.java @ 488

Last change on this file since 488 was 488, checked in by vmipsl, 12 years ago

BO insertion données _ ajout code medias
clean

  • Property svn:executable set to *
File size: 7.8 KB
Line 
1/*
2 * Created on 26 Jan. 2007
3 */
4package com.medias.integration.validation;
5
6import com.medias.Constantes;
7import com.medias.DateTime;
8import com.medias.EcritureLog;
9import com.medias.integration.lecture_ecriture.LectureModeleXML;
10import com.medias.integration.prevalidation.PreValidation;
11import com.medias.integration.vues.ParametreModele;
12
13import java.lang.reflect.InvocationTargetException;
14import java.lang.reflect.Method;
15import java.util.ArrayList;
16import java.util.Date;
17
18/**
19 * @author
20 *
21 * Classe permettant de valider un ensemble de fichier d'un jeu donné
22 */
23public 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}
Note: See TracBrowser for help on using the repository browser.