This is an automated email from the git hooks/post-receive script. New commit to branch feature/5954 in repository tutti. See http://git.codelutin.com/tutti.git commit f2c5c8ded885c5c57ab1da5e97d74d5e4bab0a8a Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 11:10:25 2014 +0100 - error management - check the operation key to enable or not the import - import locations --- .../swing/action/ImportFromColumnFileAction.java | 75 ++++++++++++++++------ .../content/operation/EditFishingOperationUI.css | 1 + .../operation/EditFishingOperationUIHandler.java | 18 ++++++ .../operation/EditFishingOperationUIModel.java | 10 +++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 3 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 3 + 6 files changed, 89 insertions(+), 21 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index 87f9359..17c7b18 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -16,20 +16,26 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiCsvUtil; +import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.AbstractImportErrorInfo; import org.nuiton.csv.Import2; import org.nuiton.csv.ImportConf; import org.nuiton.csv.ImportRow; +import org.nuiton.csv.ImportRuntimeException; import org.nuiton.csv.ValueParser; import org.nuiton.csv.ValueSetter; import org.nuiton.csv.ext.CsvReaders; +import org.nuiton.util.DateUtil; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; @@ -38,6 +44,7 @@ import java.io.FileInputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -65,7 +72,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO @Override public boolean prepareAction() throws Exception { - boolean result = super.prepareAction(); + boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); if (result) { columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), @@ -86,7 +93,6 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); ImportConf conf = new ImportConf(); conf.setStrictMode(false); -// conf.setIgnoreUnknownHeader(true); Import2<FishingOperation> operationUIModelImport = Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); @@ -116,7 +122,16 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO EditFishingOperationUIModel model = getModel(); boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); - boolean sameGearShootingStartDate = Objects.equals(fishingOperation.getGearShootingStartDate(), model.getGearShootingStartDate()); + // check if the dates (not time) are equals, but push the time to the model + Date modelGearShootingStartDate = model.getGearShootingStartDate(); + if (modelGearShootingStartDate != null) { + modelGearShootingStartDate = DateUtil.getDay(modelGearShootingStartDate); + } + Date gearShootingStartDate = fishingOperation.getGearShootingStartDate(); + if (gearShootingStartDate != null) { + gearShootingStartDate = DateUtil.getDay(gearShootingStartDate); + } + boolean sameGearShootingStartDate = Objects.equals(modelGearShootingStartDate, gearShootingStartDate); return (StringUtils.isBlank(stationColumn) || sameStationNumber) && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) @@ -137,10 +152,13 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO getUI().getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); } else { - if (log.isErrorEnabled()) { - log.error(next.getErrors()); + error = ""; + for (AbstractImportErrorInfo<FishingOperation> errorInfo : next.getErrors()) { + if (log.isErrorEnabled()) { + log.error(errorInfo.getCause().getLocalizedMessage()); + } + error += "<li>" + errorInfo.getCause().getLocalizedMessage() + "</li>"; } - error = next.getErrors().toString(); } found = true; } @@ -155,7 +173,8 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO public void postSuccessAction() { super.postSuccessAction(); if (error != null) { - displayErrorMessage("error", error); + displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), + t("tutti.editFishingOperation.action.importColumns.error", error)); } else { sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); } @@ -171,12 +190,18 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO public ImportFromColumnFileModel(char separator, Set<String> headers) { super(separator); - TuttiProtocol protocol = getDataContext().getProtocol(); + PersistenceService persistenceService = getContext().getPersistenceService(); + TuttiDataContext dataContext = getDataContext(); + + TuttiProtocol protocol = dataContext.getProtocol(); Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); + String zoneId = dataContext.getProgram().getZone().getId(); + for (OperationFieldMappingRow mappingRow : operationFieldMapping) { String importColumn = mappingRow.getImportColumn(); - if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { + boolean importColumnsInHeaders = headers.remove(importColumn); + if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) { String field = mappingRow.getField(); ValueParser valueParser; @@ -207,29 +232,34 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO break; case EditFishingOperationUIModel.PROPERTY_GEAR: - List<Gear> gears = new ArrayList<>(getDataContext().getFishingGears()); - gears.addAll(getDataContext().getScientificGears()); + List<Gear> gears = new ArrayList<>(dataContext.getFishingGears()); + gears.addAll(dataContext.getScientificGears()); Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears); valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); break; case EditFishingOperationUIModel.PROPERTY_VESSEL: case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: - List<Vessel> vessels = new ArrayList<>(getDataContext().getFishingVessels()); - vessels.addAll(getDataContext().getScientificVessels()); + List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels()); + vessels.addAll(dataContext.getScientificVessels()); Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); break; - //TODO comment on recupere les tuttilocation qui vont bien ? -// case EditFishingOperationUIModel.PROPERTY_STRATA: -// case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: -// Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById(getDataContext().getL); -// valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); -// break; + case EditFishingOperationUIModel.PROPERTY_STRATA: + Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationStrata(zoneId)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, strataUniverse); + break; + + case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: + Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationSubStrata(zoneId, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); + break; case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: - Map<String, Person> personUniverse = TuttiEntities.splitById(getDataContext().getPersons()); + Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); valueParser = newForeignKeyValue(Person.class, field, personUniverse); break; @@ -238,6 +268,9 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO } newMandatoryColumn(importColumn, field, valueParser); + + } else if (!importColumnsInHeaders) { + throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); } } @@ -247,7 +280,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); - final Caracteristic caracteristic = getContext().getPersistenceService().getCaracteristic(pmfmId); + final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId); ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css index fe79d09..d5a42ed 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css @@ -87,6 +87,7 @@ JXDatePicker { i18nMnemonic: "tutti.editFishingOperation.action.importFromColumnFile.mnemonic"; _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFromColumnFileAction.class}; _help: {"tutti.editFishingOperation.action.importFromColumnFile.help"}; + enabled: {model.isImportFromColumnFileEnabled()} } #fishingOperationAttachmentsButton { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java index 3105fe4..3a2ec3c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java @@ -28,6 +28,7 @@ import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Program; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; @@ -49,6 +50,7 @@ import fr.ifremer.tutti.util.Distances; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -70,6 +72,7 @@ import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; @@ -308,6 +311,21 @@ public class EditFishingOperationUIHandler extends AbstractTuttiTabContainerUIHa } }); + // enable or not the import from column file + if (getDataContext().isProtocolFilled()) { + Collection<OperationFieldMappingRow> operationFieldMapping = getDataContext().getProtocol().getOperationFieldMapping(); + for (OperationFieldMappingRow row : operationFieldMapping) { + if ((EditFishingOperationUIModel.PROPERTY_STATION_NUMBER.equals(row.getField()) + || EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_NUMBER.equals(row.getField()) + || EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE.equals(row.getField())) + && StringUtils.isNotBlank(row.getImportColumn())) { + + model.setImportFromColumnFileEnabled(true); + break; + } + } + } + ui.setContextValue(model); fishingOperationMonitor.setBean(model); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java index 4f8adac..477c76a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java @@ -256,6 +256,8 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin protected SecondaryVesselTypeEnum secondaryVesselType; + protected boolean importFromColumnFileEnabled; + protected static Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); @@ -1462,4 +1464,12 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin public boolean containsAllRecorderPerson(Collection<Person> recorderPerson) { return false; } + + public boolean isImportFromColumnFileEnabled() { + return importFromColumnFileEnabled; + } + + public void setImportFromColumnFileEnabled(boolean importFromColumnFileEnabled) { + this.importFromColumnFileEnabled = importFromColumnFileEnabled; + } } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 5dc2c6d..ba95198 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -695,6 +695,9 @@ tutti.editFishingOperation.action.deleteFishingOperation.message= tutti.editFishingOperation.action.deleteFishingOperation.tip= tutti.editFishingOperation.action.deleteFishingOperation.title= tutti.editFishingOperation.action.editFishingOperation.tip= +tutti.editFishingOperation.action.importColumns.error= +tutti.editFishingOperation.action.importColumns.error.title= +tutti.editFishingOperation.action.importColumns.missingHeader= tutti.editFishingOperation.action.importColumns.operationNotFound= tutti.editFishingOperation.action.importColumns.success= tutti.editFishingOperation.action.importFromColumnFile= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index a7b8c80..cc9d217 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -679,6 +679,9 @@ tutti.editFishingOperation.action.deleteFishingOperation.message=Vous êtes sur tutti.editFishingOperation.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.deleteFishingOperation.title=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.editFishingOperation.tip=Éditer l'opération de pêche +tutti.editFishingOperation.action.importColumns.error=<html><body>L'import des paramètres a échoué pour les raisons suivantes \:<ul>%s</ul></body></html> +tutti.editFishingOperation.action.importColumns.error.title=Erreur lors de l'import des paramètres +tutti.editFishingOperation.action.importColumns.missingHeader=Le fichier de paramètre ne contient pas la colonne '%s'. tutti.editFishingOperation.action.importColumns.operationNotFound=Le trait n'a pas été trouvé dans le fichier importé tutti.editFishingOperation.action.importColumns.success=Les données du fichier ont été importées dans le trait tutti.editFishingOperation.action.importFromColumnFile=Import du fichier de paramètre -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.