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