Author: chatellier Date: 2010-11-24 13:57:47 +0000 (Wed, 24 Nov 2010) New Revision: 263 Log: Ajout du details de erreur pour certaines erreurs. Ajout de tooltip sur certaines erreurs. Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlValidationRenderer.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-11-24 11:11:17 UTC (rev 262) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-11-24 13:57:47 UTC (rev 263) @@ -389,23 +389,23 @@ switch (category) { case CATCH: if (index == Catch.INDEX_SURVEY || index == Catch.INDEX_YEAR || index == Catch.INDEX_HAUL || index == Catch.INDEX_SPECIES) { - sb.append(data[index]).append(';'); + sb.append(data[index]).append('|'); } break; case HAUL: if (index == Haul.INDEX_SURVEY || index == Haul.INDEX_YEAR || index == Haul.INDEX_HAUL || index == Haul.INDEX_MONTH) { - sb.append(data[index]).append(';'); + sb.append(data[index]).append('|'); } break; case LENGTH: if (index == Length.INDEX_SURVEY || index == Length.INDEX_YEAR || index == Length.INDEX_HAUL || index == Length.INDEX_SPECIES || index == Length.INDEX_SEX || index == Length.INDEX_MATURITY || index == Length.INDEX_LENGTH) { - sb.append(data[index]).append(';'); + sb.append(data[index]).append('|'); } break; case STRATA: if (index == Strata.INDEX_SURVEY || index == Strata.INDEX_STRATUM) { - sb.append(data[index]).append(';'); + sb.append(data[index]).append('|'); } break; } @@ -783,9 +783,13 @@ } /** - * @param control - * @param progress - * @return + * Validation par croisement de fichiers. + * + * Les erreurs relevé ici porte sur plusieurs fichiers. + * + * @param control control + * @param progress progress + * @return error list */ protected List<ValidationError> validationCrossFiles(Project project, Control control, ProgressMonitor progress) { @@ -833,8 +837,8 @@ String[] catchData = itCatch.next(); campagneNames.add(catchData[Catch.INDEX_SURVEY]); catchYear.add(catchData[Catch.INDEX_YEAR]); - catchYearHaulSpecies.add(catchData[Catch.INDEX_YEAR] + ";" + catchData[Catch.INDEX_HAUL] + ";" + catchData[Catch.INDEX_SPECIES]); - catchYearHaul.add(catchData[Catch.INDEX_YEAR] + ";" + catchData[Catch.INDEX_HAUL]); + catchYearHaulSpecies.add(catchData[Catch.INDEX_YEAR] + "|" + catchData[Catch.INDEX_HAUL] + "|" + catchData[Catch.INDEX_SPECIES]); + catchYearHaul.add(catchData[Catch.INDEX_YEAR] + "|" + catchData[Catch.INDEX_HAUL]); // Contrôle des noms d'espèces dans fichiers CAPTURES et TAILLES qui // doivent être dans le référentiel "reftax": CAPTURES$Espece et @@ -859,9 +863,9 @@ String[] lengthData = itLength.next(); campagneNames.add(lengthData[Length.INDEX_SURVEY]); lengthYear.add(lengthData[Length.INDEX_YEAR]); - lengthYearHaulSpecies.add(lengthData[Length.INDEX_YEAR] + ";" + - lengthData[Length.INDEX_HAUL] + ";" + lengthData[Length.INDEX_SPECIES]); - lengthYearHaul.add(lengthData[Length.INDEX_YEAR] + ";" + lengthData[Length.INDEX_HAUL]); + lengthYearHaulSpecies.add(lengthData[Length.INDEX_YEAR] + "|" + + lengthData[Length.INDEX_HAUL] + "|" + lengthData[Length.INDEX_SPECIES]); + lengthYearHaul.add(lengthData[Length.INDEX_YEAR] + "|" + lengthData[Length.INDEX_HAUL]); // Contrôle des noms d'espèces dans fichiers CAPTURES et TAILLES qui // doivent être dans le référentiel "reftax": CAPTURES$Espece et @@ -882,11 +886,10 @@ progress.setCurrent(50); } - /*while (itStrata.hasNext()) { + while (itStrata.hasNext()) { String[] strataData = itStrata.next(); campagneNames.add(strataData[Strata.INDEX_SURVEY]); - catchYear.add(strataData[Strata.INDEX_YEAR]); - }*/ + } if (progress != null) { progress.setText(_("coser.business.control.step.crossFileChech", 75)); @@ -897,7 +900,7 @@ String[] haulData = itHaul.next(); campagneNames.add(haulData[Haul.INDEX_SURVEY]); haulYear.add(haulData[Haul.INDEX_YEAR]); - haulYearHaul.add(haulData[Haul.INDEX_YEAR] + ";" + haulData[Haul.INDEX_HAUL]); + haulYearHaul.add(haulData[Haul.INDEX_YEAR] + "|" + haulData[Haul.INDEX_HAUL]); } // Vérifier que les mêmes années sont présentes dans fichiers captures @@ -906,7 +909,7 @@ ValidationError error = new ValidationError(); error.setLevel(ValidationLevel.FATAL); error.setMessage(_("coser.business.control.error.yearsNotEquals")); - error.setDetailMessage(_("coser.business.control.error.yearsNotEquals")); + //error.setDetailMessage(_("coser.business.control.error.yearsNotEquals")); crossFilesErrors.add(error); } @@ -922,33 +925,39 @@ // Vérifier que pour chaque espèce présent dans un trait d'une année // dans le fichier tailles (noté Annee|Trait|Espece) il y a une donnée // dans le fichier captures (le contraire n'est pas vraie) - if (!catchYearHaulSpecies.contains(lengthYearHaulSpecies)) { + Collection<String> missingSpeciesCatchTuples = CollectionUtils.subtract(lengthYearHaulSpecies, catchYearHaulSpecies); + for (String missingSpeciesCatchTuple : missingSpeciesCatchTuples) { ValidationError error = new ValidationError(); error.setLevel(ValidationLevel.FATAL); - error.setMessage(_("coser.business.control.error.incompleteHaulSpeciesData")); - //error.setDetailMessage(_("coser.business.control.error.incompleteHaulSpeciesData")); + error.setMessage(_("coser.business.control.error.missingYearHaulSpeciesForCatchData")); + error.setDetailMessage(_("coser.business.control.error.missingYearHaulSpeciesForCatchDataDetail", missingSpeciesCatchTuple)); + error.setTipMessage(_("coser.business.control.error.missingYearHaulSpeciesForCatchDataTip")); crossFilesErrors.add(error); } // Vérifier que pour chaque trait présent une année (noté Annee|Trait) // dans les fichiers tailles et capt il y a une donnée dans le fichier // traits - if (!lengthYearHaul.containsAll(haulYearHaul)) { + Collection<String> missingHaulLengthTuples = CollectionUtils.subtract(lengthYearHaul, haulYearHaul); + for (String missingHaulLengthTuple : missingHaulLengthTuples) { ValidationError error = new ValidationError(); error.setLevel(ValidationLevel.FATAL); - error.setMessage(_("coser.business.control.error.incompleteHaulDataLength")); - //error.setDetailMessage(_("coser.business.control.error.incompleteHaulDataLength")); + error.setMessage(_("coser.business.control.error.missingYearHaulForLengthData")); + error.setDetailMessage(_("coser.business.control.error.missingYearHaulForLengthDataDetail", missingHaulLengthTuple)); + error.setTipMessage(_("coser.business.control.error.missingYearHaulForLengthDataTip")); crossFilesErrors.add(error); } // Vérifier que pour chaque trait présent une année (noté Annee|Trait) // dans les fichiers tailles et capt il y a une donnée dans le fichier // traits - if (!catchYearHaul.containsAll(haulYearHaul)) { + Collection<String> missingHaulCatchTuples = CollectionUtils.subtract(catchYearHaul, haulYearHaul); + for (String missingHaulCatchTuple : missingHaulCatchTuples) { ValidationError error = new ValidationError(); error.setLevel(ValidationLevel.FATAL); - error.setMessage(_("coser.business.control.error.incompleteHaulDataCatch")); - //error.setDetailMessage(_("coser.business.control.error.incompleteHaulDataCatch")); + error.setMessage(_("coser.business.control.error.missingYearHaulForCatchData")); + error.setDetailMessage(_("coser.business.control.error.missingYearHaulForCatchDataDetail", missingHaulCatchTuple)); + error.setTipMessage(_("coser.business.control.error.missingYearHaulForCatchDataTip")); crossFilesErrors.add(error); } Modified: trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties =================================================================== --- trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties 2010-11-24 11:11:17 UTC (rev 262) +++ trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties 2010-11-24 13:57:47 UTC (rev 263) @@ -37,6 +37,15 @@ coser.business.control.error.invalidLengthLengthStep= coser.business.control.error.minObservationCount= coser.business.control.error.minObservationCountDetail= +coser.business.control.error.missingYearHaulForCatchData= +coser.business.control.error.missingYearHaulForCatchDataDetail= +coser.business.control.error.missingYearHaulForCatchDataTip= +coser.business.control.error.missingYearHaulForLengthData= +coser.business.control.error.missingYearHaulForLengthDataDetail= +coser.business.control.error.missingYearHaulForLengthDataTip= +coser.business.control.error.missingYearHaulSpeciesForCatchData= +coser.business.control.error.missingYearHaulSpeciesForCatchDataDetail= +coser.business.control.error.missingYearHaulSpeciesForCatchDataTip= coser.business.control.error.noCatchNumberWithWeight= coser.business.control.error.nonExistantSpecies= coser.business.control.error.nonExistantSpeciesDetail= Modified: trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties =================================================================== --- trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties 2010-11-24 11:11:17 UTC (rev 262) +++ trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties 2010-11-24 13:57:47 UTC (rev 263) @@ -33,15 +33,23 @@ coser.business.control.error.duplicatedLineDetails=Ligne en doublon pour la cl\u00E9 \: %s coser.business.control.error.incompleteHaulDataCatch=Certains couples Annee|Trait ne sont pas pr\u00E9sents dans les captures coser.business.control.error.incompleteHaulDataLength=Certains couples Annee|Trait ne sont pas pr\u00E9sents dans les tailles -coser.business.control.error.incompleteHaulSpeciesData=Certains couples Annee|Trait|Espece ne sont pas pr\u00E9sents dans les captures coser.business.control.error.invalidLengthLengthStep=Pas de longeur invalide (autoris\u00E9 centim\u00E8tre et demi-centim\u00E8tre) coser.business.control.error.minObservationCount=Nombre minimal d'observation non atteint coser.business.control.error.minObservationCountDetail=Nombre minimal d'observation non atteint (%s) \: %.2f +coser.business.control.error.missingYearHaulForCatchData=Traits manquants dans les traits pour certaines captures +coser.business.control.error.missingYearHaulForCatchDataDetail=Couple %s manquant dans les traits +coser.business.control.error.missingYearHaulForCatchDataTip=V\u00E9rifier que pour chaque trait pr\u00E9sent une ann\u00E9e (not\u00E9 Annee|Trait) dans le fichier et capture, il y a une donn\u00E9e dans le fichier traits +coser.business.control.error.missingYearHaulForLengthData=Traits manquants dans les taits pour certaines tailles +coser.business.control.error.missingYearHaulForLengthDataDetail=Couple %s manquant dans les traits +coser.business.control.error.missingYearHaulForLengthDataTip=V\u00E9rifier que pour chaque trait pr\u00E9sent une ann\u00E9e (not\u00E9 Annee|Trait) dans le fichier tailles, il y a une donn\u00E9e dans le fichier traits +coser.business.control.error.missingYearHaulSpeciesForCatchData=Especes manquantes dans les captures pour certaines tailles +coser.business.control.error.missingYearHaulSpeciesForCatchDataDetail=Couple %s manquant dans les captures +coser.business.control.error.missingYearHaulSpeciesForCatchDataTip=V\u00E9rifier que pour chaque esp\u00E8ce pr\u00E9sent dans un trait d'une ann\u00E9e dans le fichier tailles (not\u00E9 Annee|Trait|Espece) il y a une donn\u00E9e dans le fichier captures (le contraire n'est pas vrai, i.e. il y a des esp\u00E8ces dans captures pour lesquelles il n'y a pas d'information dans le fichier tailles) coser.business.control.error.noCatchNumberWithWeight=Poids sp\u00E9cifi\u00E9, mais nombre non d\u00E9finit coser.business.control.error.nonExistantSpecies=Esp\u00E8ces non existantes dans le reftax coser.business.control.error.nonExistantSpeciesDetail=Esp\u00E8ce %s non existante dans le reftax -coser.business.control.error.surveyNotEquals=Les noms de campagnes de sont pas \u00E9gaux -coser.business.control.error.yearsNotEquals=Les ann\u00E9es ne sont pas identiques +coser.business.control.error.surveyNotEquals=Les noms de campagnes de sont pas \u00E9gaux dans les 4 fichiers +coser.business.control.error.yearsNotEquals=Les ann\u00E9es ne sont pas identiques dans les 4 fichiers coser.business.control.noerrorfound=Aucune erreur d\u00E9tect\u00E9e coser.business.control.step.crossFileChech=V\u00E9rification par croisement de fichiers (%d%%) coser.business.control.step.observation=V\u00E9rification du nombre d'observation (%d%%) @@ -58,7 +66,7 @@ coser.config.validator.directory.description=Emplacement des fichiers de validations depth\ attribute\ is\ not\ a\ valid\ double=L'attribut ProfMoy n'est pas un r\u00E9el valide lat\ attribute\ is\ not\ a\ valid\ double=L'attribut Lat n'est pas un r\u00E9el valide -lat\ must\ contain\ at\ least\ 5\ decimals=L'attibut Lat doit contenir au moins 5 decimales +lat\ must\ contain\ at\ least\ 5\ decimals=L'attribut Lat doit contenir au moins 5 decimales length\ attribute\ is\ not\ a\ valid\ double=L'attribut Longueur n'est pas un r\u00E9el valide long\ attribute\ is\ not\ a\ valid\ double=L'attribut Long n'est pas un r\u00E9el valide long\ must\ contain\ at\ least\ 5\ decimals=L'attribut Long doit contenir au moins 5 decimales Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlValidationRenderer.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlValidationRenderer.java 2010-11-24 11:11:17 UTC (rev 262) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlValidationRenderer.java 2010-11-24 13:57:47 UTC (rev 263) @@ -74,6 +74,7 @@ ImageIcon icon = null; String text = null; + String tooltipText = null; if (value instanceof String) { text = _((String)value) + " (" + model.getChildCount(value) + ")"; @@ -125,10 +126,12 @@ message = validationError.getMessage(); } text = _(message); + tooltipText = validationError.getTipMessage(); } component.setText(text); component.setIcon(icon); + component.setToolTipText(tooltipText); return component; }