r255 - in trunk: coser-business/src/main/java/fr/ifremer/coser/control coser-business/src/main/java/fr/ifremer/coser/services coser-business/src/main/resources/i18n coser-ui/src/main/java/fr/ifremer/coser/ui/control coser-ui/src/main/resources/i18n
Author: chatellier Date: 2010-11-24 10:06:13 +0000 (Wed, 24 Nov 2010) New Revision: 255 Log: Ajout de plusieurs lignes pour une erreur. Selection des lignes en doublon Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/control/ValidationError.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 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/ControlHandler.java trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/control/ValidationError.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/control/ValidationError.java 2010-11-23 13:09:58 UTC (rev 254) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/control/ValidationError.java 2010-11-24 10:06:13 UTC (rev 255) @@ -26,6 +26,8 @@ package fr.ifremer.coser.control; import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; import fr.ifremer.coser.CoserConstants.Category; import fr.ifremer.coser.CoserConstants.ValidationLevel; @@ -59,14 +61,16 @@ protected String detailMessage; /** - * Numero de la ligne dans le fichier CSV. + * Numero des lignes dans le fichier CSV. * - * Peut être {@code null} si l'erreur n'est pas associé à une ligne specifiques. + * Peut être vide si l'erreur n'est pas associé à une ligne specifiques. */ - protected String lineNumber; + protected Set<String> lineNumbers; public ValidationError() { super(); + + lineNumbers = new HashSet<String>(); } /** @@ -150,30 +154,30 @@ } /** - * Numero de la ligne dans le fichier CSV. + * Numero des lignes dans le fichier CSV. * - * Peut être {@code null} si l'erreur n'est pas associé a une ligne specifiques. + * Peut être vide si l'erreur n'est pas associé a une ligne specifiques. * * @return line number */ - public String getLineNumber() { - return lineNumber; + public Set<String> getLineNumbers() { + return lineNumbers; } /** - * Numero de la ligne dans le fichier CSV. + * Numero des lignes dans le fichier CSV. * - * Peut être {@code null} si l'erreur n'est pas associé a une ligne specifiques. + * Peut être vide si l'erreur n'est pas associé a une ligne specifiques. * * @param lineNumber line number */ - public void setLineNumber(String lineNumber) { - this.lineNumber = lineNumber; + public void addLineNumber(String lineNumber) { + lineNumbers.add(lineNumber); } @Override public String toString() { return "ValidationError [level=" + level + ", message=" + message - + ", lineNumber=" + lineNumber + "]"; + + ", lineNumber=" + lineNumbers + "]"; } } 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-23 13:09:58 UTC (rev 254) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-24 10:06:13 UTC (rev 255) @@ -1482,7 +1482,6 @@ String[] tuple = itTuple.next(); // Campagne;Annee;Trait;Mois;Strate;SurfaceBalayee;Lat;Long;ProfMoy - String annee = tuple[Haul.INDEX_YEAR]; String strataName = tuple[Haul.INDEX_STRATUM]; if (strataNames.contains(strataName)) { String traitsName = tuple[Haul.INDEX_HAUL]; 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-23 13:09:58 UTC (rev 254) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-11-24 10:06:13 UTC (rev 255) @@ -148,7 +148,7 @@ error.setLevel(validationLevel); // add error line - error.setLineNumber(bean.getLine()); + error.addLineNumber(bean.getLine()); result.add(error); } @@ -162,7 +162,7 @@ error.setLevel(validationLevel); // add error line - error.setLineNumber(bean.getLine()); + error.addLineNumber(bean.getLine()); result.add(error); } @@ -298,7 +298,7 @@ progress.setTotal(total); } - Set<String> uniqueDataKeys = new HashSet<String>(); + Map<String, String> uniqueDataKeys = new HashMap<String, String>(); List<ValidationError> validationErrors = new ArrayList<ValidationError>(); Iterator<String[]> itDataToCheck = dataToCheck.iterator(); int lineIndex = 1; // 1 = skip header @@ -339,17 +339,20 @@ } // check for duplicated lines + String lineNumber = line[AbstractDataEntity.INDEX_LINE]; String uniqueDataKey = getSignificantData(category, line); - if (uniqueDataKeys.contains(uniqueDataKey)) { + if (uniqueDataKeys.containsKey(uniqueDataKey)) { ValidationError error = new ValidationError(); error.setCategory(category); error.setLevel(ValidationLevel.ERROR); - error.setLineNumber(line[AbstractDataEntity.INDEX_LINE]); - error.setMessage(_("coser.business.control.error.duplicatedLine")); + error.addLineNumber(uniqueDataKeys.get(uniqueDataKey)); + error.addLineNumber(lineNumber); + error.setMessage(_("coser.business.control.error.duplicatedLine", uniqueDataKey)); + error.setMessage(_("coser.business.control.error.duplicatedLineDetails", uniqueDataKey)); validationErrors.add(error); } else { - uniqueDataKeys.add(uniqueDataKey); + uniqueDataKeys.put(uniqueDataKey, lineNumber); } } @@ -529,7 +532,7 @@ ValidationError error = new ValidationError(); error.setCategory(Category.CATCH); error.setLevel(ValidationLevel.WARNING); - error.setLineNumber(lineNumber); + error.addLineNumber(lineNumber); error.setMessage(_("coser.business.control.error.minObservationCount")); error.setDetailMessage(_("coser.business.control.error.minObservationCountDetail", key, value)); validationErrors.add(error); @@ -749,7 +752,7 @@ ValidationError error = new ValidationError(); error.setCategory(Category.LENGTH); error.setLevel(ValidationLevel.WARNING); - error.setLineNumber(lineNumber); + error.addLineNumber(lineNumber); error.setMessage(_("coser.business.control.error.minObservationCount")); error.setDetailMessage(_("coser.business.control.error.minObservationCountDetail", key, value)); validationErrors.add(error); @@ -766,7 +769,6 @@ */ protected List<ValidationError> validateCategorySpecificHaul(Control control, ProgressMonitor progress) { - // TODO Auto-generated method stub return null; } @@ -840,7 +842,7 @@ if (!refTaxSpecies.contains(catchData[Catch.INDEX_SPECIES])) { ValidationError error = new ValidationError(); error.setCategory(Category.CATCH); - error.setLineNumber(catchData[Catch.INDEX_LINE]); + error.addLineNumber(catchData[Catch.INDEX_LINE]); error.setLevel(ValidationLevel.ERROR); error.setMessage(_("coser.business.control.error.nonExistantSpecies")); error.setDetailMessage(_("coser.business.control.error.nonExistantSpeciesDetail", catchData[Catch.INDEX_SPECIES])); @@ -867,7 +869,7 @@ if (!refTaxSpecies.contains(lengthData[Length.INDEX_SPECIES])) { ValidationError error = new ValidationError(); error.setCategory(Category.LENGTH); - error.setLineNumber(lengthData[Length.INDEX_LINE]); + error.addLineNumber(lengthData[Length.INDEX_LINE]); error.setLevel(ValidationLevel.ERROR); error.setMessage(_("coser.business.control.error.nonExistantSpecies")); error.setDetailMessage(_("coser.business.control.error.nonExistantSpeciesDetail", lengthData[Length.INDEX_SPECIES])); 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-23 13:09:58 UTC (rev 254) +++ trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties 2010-11-24 10:06:13 UTC (rev 255) @@ -37,6 +37,7 @@ coser.business.control.error.diffCatchLength= coser.business.control.error.diffCatchLengthDetail= coser.business.control.error.duplicatedLine= +coser.business.control.error.duplicatedLineDetails= coser.business.control.error.incompleteHaulDataCatch= coser.business.control.error.incompleteHaulDataLength= coser.business.control.error.incompleteHaulSpeciesData= @@ -54,7 +55,6 @@ coser.business.control.step.xworks= coser.business.line=Line coser.business.result.rsufiResultAlreadyExists= -coser.business.selection.noControlForSelection= coser.business.selection.notValidatedControl= coser.config.control.diffcatchlength.description= coser.config.database.directory.description= @@ -64,15 +64,11 @@ coser.config.reference.typeEspeces.description= coser.config.validator.directory.description= lat\ attribute\ is\ not\ a\ valid\ double= -lat\ must\ contains\ at\ least\ 3\ decimal= lat\ must\ contains\ at\ least\ 3\ decimals= -lat\ must\ contains\ at\ least\ 3\ decimasl= length\ attribute\ is\ not\ a\ valid\ double= long\ attribute\ is\ not\ a\ valid\ double= -long\ must\ contains\ at\ least\ 3\ decimal= long\ must\ contains\ at\ least\ 3\ decimals= number\ attribute\ is\ not\ a\ valid\ double= sweptSurface\ attribute\ is\ not\ a\ valid\ double= -sweptSurface\ must\ contains\ at\ least\ 3\ decimal= sweptSurface\ must\ contains\ at\ least\ 3\ decimals= year\ is\ not\ valid= 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-23 13:09:58 UTC (rev 254) +++ trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties 2010-11-24 10:06:13 UTC (rev 255) @@ -37,6 +37,7 @@ coser.business.control.error.diffCatchLength=Diff\u00E9rence entre les captures et taille coser.business.control.error.diffCatchLengthDetail=Diff\u00E9rence entre les captures et taille pour l'esp\u00E8ce %s (ann\u00E9e %s) coser.business.control.error.duplicatedLine=Ligne en doublon +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 @@ -54,7 +55,6 @@ coser.business.control.step.xworks=Validation par lignes (%d%%) coser.business.line=Ligne coser.business.result.rsufiResultAlreadyExists=Le r\u00E9sultat %D existe d\u00E9j\u00E0 \! -coser.business.selection.noControlForSelection=Impossible de creer une s\u00E9lection sans donn\u00E9es control\u00E9es. coser.business.selection.notValidatedControl=Contr\u00F4le non valid\u00E9 \! coser.config.control.diffcatchlength.description=Pourcentage d'\u00E9cart tol\u00E9r\u00E9 entre les captures et les tailles coser.config.database.directory.description=Emplacement de la base de campagnes de coser @@ -64,15 +64,11 @@ coser.config.reference.typeEspeces.description=Emplacement du fichier de code type des esp\u00E8ces coser.config.validator.directory.description=Emplacement des fichiers de validations lat\ attribute\ is\ not\ a\ valid\ double= -lat\ must\ contains\ at\ least\ 3\ decimal= lat\ must\ contains\ at\ least\ 3\ decimals= -lat\ must\ contains\ at\ least\ 3\ decimasl= length\ attribute\ is\ not\ a\ valid\ double= long\ attribute\ is\ not\ a\ valid\ double= -long\ must\ contains\ at\ least\ 3\ decimal= long\ must\ contains\ at\ least\ 3\ decimals= number\ attribute\ is\ not\ a\ valid\ double= sweptSurface\ attribute\ is\ not\ a\ valid\ double= -sweptSurface\ must\ contains\ at\ least\ 3\ decimal= sweptSurface\ must\ contains\ at\ least\ 3\ decimals= year\ is\ not\ valid= Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-11-23 13:09:58 UTC (rev 254) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-11-24 10:06:13 UTC (rev 255) @@ -38,6 +38,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import javax.swing.JLabel; @@ -441,15 +442,23 @@ view.getCategoryComboBoxModel().setSelectedItem(category); ValidationError error = (ValidationError)pathWay[3]; - String errorLineNumber = error.getLineNumber(); - // peut être null, si l'erreur ne porte pas sur un bean en particulier - if (errorLineNumber != null) { - int errorLineIndex = view.getControlDataTableModel().getRealIndexOfLine(errorLineNumber); - - // ca peut arriver si la ligne a été supprimée - if (errorLineIndex >= 0) { - view.getControlDataTableSelectionModel().setSelectionInterval(errorLineIndex, errorLineIndex); - scrollToVisible(view.getControlDataTable(), errorLineIndex, 0); + Set<String> errorLineNumbers = error.getLineNumbers(); + // peut être vide, si l'erreur ne porte pas sur un bean en particulier + if (errorLineNumbers != null) { + view.getControlDataTableSelectionModel().clearSelection(); + + boolean first = true; + for (String errorLineNumber : errorLineNumbers) { + int errorLineIndex = view.getControlDataTableModel().getRealIndexOfLine(errorLineNumber); + + // ca peut arriver si la ligne a été supprimée + if (errorLineIndex >= 0) { + view.getControlDataTableSelectionModel().addSelectionInterval(errorLineIndex, errorLineIndex); + if (first) { + scrollToVisible(view.getControlDataTable(), errorLineIndex, 0); + first = false; + } + } } } } @@ -507,17 +516,22 @@ // select all lines GlobalValidationModel model = controlView.getGlobalValidationModel(); controlView.getControlDataTableSelectionModel().clearSelection(); + boolean first = true; int childCount = model.getChildCount(validationGroup); for (int indexChild = 0 ; indexChild < childCount ; ++indexChild) { ValidationError validationError = (ValidationError)model.getChild(validationGroup, indexChild); - String errorLineNumber = validationError.getLineNumber(); - int errorLineIndex = controlView.getControlDataTableModel().getRealIndexOfLine(errorLineNumber); + Set<String> errorLineNumbers = validationError.getLineNumbers(); + + for (String errorLineNumber : errorLineNumbers) { + int errorLineIndex = controlView.getControlDataTableModel().getRealIndexOfLine(errorLineNumber); - // ca peut arriver si la ligne a été supprimée - if (errorLineIndex >= 0) { - controlView.getControlDataTableSelectionModel().addSelectionInterval(errorLineIndex, errorLineIndex); - if (indexChild == 0) { - scrollToVisible(controlView.getControlDataTable(), errorLineIndex, 0); + // ca peut arriver si la ligne a été supprimée + if (errorLineIndex >= 0) { + controlView.getControlDataTableSelectionModel().addSelectionInterval(errorLineIndex, errorLineIndex); + if (first) { + scrollToVisible(controlView.getControlDataTable(), errorLineIndex, 0); + first = false; + } } } } Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties =================================================================== --- trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-11-23 13:09:58 UTC (rev 254) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-11-24 10:06:13 UTC (rev 255) @@ -96,10 +96,8 @@ coser.ui.result.extractDataButton=Extract coser.ui.result.extractDataLabel=Extraction directory coser.ui.result.extractDataTitle=Extract RSufi data -coser.ui.result.newDataTitle=New result coser.ui.result.newResult= coser.ui.result.otherDataFile=Other files \: -coser.ui.result.requiredauthor= coser.ui.result.requiredname= coser.ui.result.requiredrsufiVersion= coser.ui.result.resultName=Result name \: @@ -113,18 +111,15 @@ coser.ui.selection.allSpecies=L1 \: All species coser.ui.selection.comment= coser.ui.selection.createError=Creation error -coser.ui.selection.details.beginDate=Begin date \: coser.ui.selection.details.comment=Comments coser.ui.selection.details.dates= coser.ui.selection.details.description=Description \: -coser.ui.selection.details.endDate=End date \: coser.ui.selection.details.filteredSpecies= coser.ui.selection.details.name=Selection name \: coser.ui.selection.details.saveSelection=Save selection coser.ui.selection.details.selectedSpecies= coser.ui.selection.details.showMapTip= coser.ui.selection.details.showSpreciesTip= -coser.ui.selection.details.species=Species \: coser.ui.selection.details.strata=Strata \: coser.ui.selection.details.type= coser.ui.selection.details.validDates= Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties =================================================================== --- trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties 2010-11-23 13:09:58 UTC (rev 254) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties 2010-11-24 10:06:13 UTC (rev 255) @@ -96,7 +96,6 @@ coser.ui.result.extractDataButton=Extraire coser.ui.result.extractDataLabel=Dossier d'extraction \: coser.ui.result.extractDataTitle=Extraction des donn\u00E9es d'entr\u00E9e de RSufi -coser.ui.result.newDataTitle=Nouveau r\u00E9sultat coser.ui.result.newResult=Nouveau r\u00E9sultat coser.ui.result.otherDataFile=Autre fichiers \: coser.ui.result.requiredname=Le champ 'name' est requis @@ -121,7 +120,6 @@ coser.ui.selection.details.selectedSpecies=Esp\u00E8ces s\u00E9lectionn\u00E9es \: coser.ui.selection.details.showMapTip=Afficher la carte des zones coser.ui.selection.details.showSpreciesTip=Afficher la table des esp\u00E8ces -coser.ui.selection.details.species=Esp\u00E8ces \: coser.ui.selection.details.strata=Strates \: coser.ui.selection.details.type=Filtrer par type \: coser.ui.selection.details.validDates=Valider les ann\u00E9es
participants (1)
-
chatellier@users.labs.libre-entreprise.org