Author: chatellier Date: 2010-11-08 13:43:33 +0000 (Mon, 08 Nov 2010) New Revision: 184 Log: Fix duplicated line detection. Fix tests Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-11-08 13:38:54 UTC (rev 183) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-11-08 13:43:33 UTC (rev 184) @@ -39,7 +39,6 @@ import fr.ifremer.coser.CoserBusinessException; import fr.ifremer.coser.CoserConstants; import fr.ifremer.coser.CoserUtils; -import fr.ifremer.coser.CoserConstants.Category; import fr.ifremer.coser.bean.AbstractDataContainer; import fr.ifremer.coser.bean.Project; import fr.ifremer.coser.data.Catch; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-08 13:38:54 UTC (rev 183) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-08 13:43:33 UTC (rev 184) @@ -587,6 +587,8 @@ // copie des données (csv) File selectionDataDirectory = new File(selectionDirectory, CoserConstants.STORAGE_DATA_SELECTION_DIRECTORY); + selectionDataDirectory.mkdirs(); + for (Category category : Category.values()) { if (category.isDataCategory()) { File dataFile = new File(selectionDataDirectory, 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-08 13:38:54 UTC (rev 183) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-11-08 13:43:33 UTC (rev 184) @@ -190,12 +190,14 @@ * @return les erreurs de validation */ public List<ValidationError> validateCategory(Control control, Category category, ProgressMonitor progress) { + // validation de la category seule (generique) List<ValidationError> errors = validateCategoryXWork(control, category, progress); + // validation specifique de la category List<ValidationError> specificErrors = validateCategorySpecific(control, category, progress); if (specificErrors != null) { errors.addAll(specificErrors); } - + // cas particulier, s'il n'y a aucune erreur, on ajout une erreur de // type info pour dire qu'il n'y a pas d'erreur if (errors.isEmpty()) { @@ -288,7 +290,7 @@ } // check for duplicated lines - String uniqueDataKey = getSignificantData(line); + String uniqueDataKey = getSignificantData(category, line); if (uniqueDataKeys.contains(uniqueDataKey)) { ValidationError error = new ValidationError(); error.setLevel(ValidationLevel.ERROR); @@ -306,18 +308,57 @@ /** * Retourne sous forme de clé la partie significative des données. - * Donc sans le numéro de ligne. + * Donc sans le numéro de ligne suivant la catégorie. + * * Utilisé pour la detection des doublons. * + * CAPTURES + * Vérifier l'unicité sur : "Campagne", "Annee", "Trait", "Espece" + * + * STRATES + * Vérifier l'unicité sur : "Campagne", "Strate" + * + * TAILLES + * Vérifier l'unicité sur : Campagne", "Annee", "Trait", "Espece", "Sexe", "Maturite", "Longueur" + * + * TRAITS + * Vérifier l'unicité sur : "Campagne", "Annee", "Trait", "Mois" + * + * @param category category * @param data data * @return string key */ - protected String getSignificantData(String[] data) { + protected String getSignificantData(Category category, String[] data) { StringBuilder sb = new StringBuilder(); for (int index = 0 ; index < data.length ; ++index) { + // never count index line if (index != AbstractDataEntity.INDEX_LINE) { - sb.append(data[index]).append(';'); + 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(';'); + } + 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(';'); + } + 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(';'); + } + break; + case STRATA: + if (index == Strata.INDEX_SURVEY || index == Strata.INDEX_STRATUM) { + sb.append(data[index]).append(';'); + } + break; + } + } + } return sb.toString(); } @@ -415,27 +456,6 @@ // sauvegarde la premiere ligne qui correspond a un regroupement de clé firstLineForKey.put(key, lineNumber); } - - // autre validation (rien a voir avec le reste attention) - // Vérifier que le nombre d'individus dans CAPT$Nombre n'est pas 0 si le poids dans CAPT$Poids>0. - /*String poidsValue = tuple[Catch.INDEX_WEIGHT]; - try { - Double poids = Double.valueOf(poidsValue); - if (poids > 0 && nombre <= 0) { - ValidationError error = new ValidationError(); - error.setLevel(ValidationLevel.ERROR); - error.setLineNumber(lineNumber); - error.setMessage(_("coser.business.control.error.noCatchNumberWithWeight")); - validationErrors.add(error); - } - } - catch (NumberFormatException ex) { - // par trop grave, normalement les données deviennent - // valide au fil de la validation - if (log.isWarnEnabled()) { - log.warn("Can't parse '" + poidsValue + "' as double"); - } - }*/ } catch (NumberFormatException ex) { // par trop grave, normalement les données deviennent