branch feature/5954 updated (e42f4dd -> f3570e7)
This is an automated email from the git hooks/post-receive script. New change to branch feature/5954 in repository tutti. See http://git.codelutin.com/tutti.git from e42f4dd fix import of lists new 21ce8ea ajout javadoc + nettoyage imports new 8011271 ajout service d'import des caractéristicques d'un trait new 4bfd259 renommage de l'action d'import de caracteristiques d'un trait + utilisation du service dédié new f3570e7 utilisation d'une exception si colonne non trouvee dans le header The 4 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit f3570e7999496d1da30a99852283fcded556c25d Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:58:19 2014 +0100 utilisation d'une exception si colonne non trouvee dans le header commit 4bfd2593e8b7ad33ddb43025d311485c631a0a93 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:44 2014 +0100 renommage de l'action d'import de caracteristiques d'un trait + utilisation du service dédié commit 80112711ac70a6b2416433c3ca73367cd79aa753 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:11 2014 +0100 ajout service d'import des caractéristicques d'un trait commit 21ce8ea10e64f90d222976c35b2a74fb6b9ad4c3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:49:30 2014 +0100 ajout javadoc + nettoyage imports Summary of changes: .../entities/protocol/v2/TuttiProtocol2.java | 4 + .../entities/protocol/v2/TuttiProtocolBean2.java | 2 - .../FishingOperationImportService.java | 167 ++++++++++ ...olumnFileFishingOperationNotFoundException.java | 15 + .../ImportFromColumnFileInvalidRowException.java | 29 ++ ...ImportFromColumnFileMissingHeaderException.java | 24 ++ .../operationimport/ImportFromColumnFileModel.java | 210 ++++++++++++ .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 5 + ...perationCaracteristicsFromColumnFileAction.java | 142 ++++++++ .../swing/action/ImportFromColumnFileAction.java | 367 --------------------- .../content/operation/EditFishingOperationUI.css | 2 +- 11 files changed, 597 insertions(+), 370 deletions(-) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java delete mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 21ce8ea10e64f90d222976c35b2a74fb6b9ad4c3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:49:30 2014 +0100 ajout javadoc + nettoyage imports --- .../tutti/persistence/entities/protocol/v2/TuttiProtocol2.java | 4 ++++ .../tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java index a67f592..df7322c 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java @@ -8,6 +8,10 @@ import javax.annotation.Generated; import java.util.Collection; import java.util.List; +/** + * @author kmorin - morin@codelutin.com + * @since 3.9 + */ @Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Mon Nov 24 12:54:48 CET 2014") public interface TuttiProtocol2 extends CommentAware, TuttiEntity { diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java index 0405b21..76ac378 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java @@ -1,9 +1,7 @@ package fr.ifremer.tutti.persistence.entities.protocol.v2; import fr.ifremer.tutti.persistence.entities.TuttiEntityBean; -import fr.ifremer.tutti.persistence.entities.protocol.AbstractTuttiProtocolBean; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import javax.annotation.Generated; import java.util.Collection; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 80112711ac70a6b2416433c3ca73367cd79aa753 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:11 2014 +0100 ajout service d'import des caractéristicques d'un trait --- .../FishingOperationImportService.java | 167 ++++++++++++++++ ...olumnFileFishingOperationNotFoundException.java | 15 ++ .../ImportFromColumnFileInvalidRowException.java | 29 +++ .../operationimport/ImportFromColumnFileModel.java | 213 +++++++++++++++++++++ 4 files changed, 424 insertions(+) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java new file mode 100644 index 0000000..89709e4 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java @@ -0,0 +1,167 @@ +package fr.ifremer.tutti.service.operationimport; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiDataContext; +import fr.ifremer.tutti.service.TuttiServiceContext; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.csv.AbstractImportErrorInfo; +import org.nuiton.csv.Import2; +import org.nuiton.csv.ImportConf; +import org.nuiton.csv.ImportRow; +import org.nuiton.csv.ext.CsvReaders; +import org.nuiton.jaxx.application.ApplicationTechnicalException; +import org.nuiton.util.DateUtil; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.Date; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class FishingOperationImportService extends AbstractTuttiService { + + protected PersistenceService persistenceService; + + private TuttiDataContext dataContext; + + @Override + public void setServiceContext(TuttiServiceContext context) { + super.setServiceContext(context); + persistenceService = getService(PersistenceService.class); + dataContext = context.getDataContext(); + } + + public void importCaracteristicsFromColumnFile(File columnsFile, FishingOperation fishingoperation) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + + // Get import file headers + Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); + + // Create import model + ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers), persistenceService, dataContext, fishingoperation); + ImportConf conf = new ImportConf(); + conf.setStrictMode(false); + + // Create matching row predicate + MatchingFishingOperationNaturalIdPredicate matchingRowPredicate = new MatchingFishingOperationNaturalIdPredicate( + fishingoperation.getStationNumber(), + fishingoperation.getFishingOperationNumber(), + fishingoperation.getGearShootingStartDate(), + dataContext.getProtocol()); + + try (Import2<FishingOperation> operationUIModelImport = Import2.newImport(conf, importModel, new FileInputStream(columnsFile))) { + + doImport(operationUIModelImport, matchingRowPredicate); + + } catch (FileNotFoundException e) { + throw new ApplicationTechnicalException("Could not find import file " + columnsFile); + } + + } + + protected void doImport(Import2<FishingOperation> operationUIModelImport, + MatchingFishingOperationNaturalIdPredicate matchingRowPredicate) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + + + boolean found = false; + for (ImportRow<FishingOperation> next : operationUIModelImport) { + + FishingOperation fishingOperation = next.getBean(); + + if (matchingRowPredicate.apply(fishingOperation)) { + if (!next.isValid()) { + + Set<AbstractImportErrorInfo<FishingOperation>> errors = next.getErrors(); + throw new ImportFromColumnFileInvalidRowException(errors); + + } + + // valid row was found + // can quit right now the import + found = true; + + break; + } + + } + + if (!found) { + throw new ImportFromColumnFileFishingOperationNotFoundException(); + } + + } + + protected static class MatchingFishingOperationNaturalIdPredicate implements Predicate<FishingOperation> { + + protected final String stationNumber; + + protected final Integer fishingOperationNumber; + + protected final Date modelGearShootingStartOnlyDate; + + protected final Map<String, OperationFieldMappingRow> mappingRowsByField; + + MatchingFishingOperationNaturalIdPredicate(String stationNumber, + Integer fishingOperationNumber, + Date modelGearShootingStartDate, + TuttiProtocol protocol) { + this.stationNumber = stationNumber; + this.fishingOperationNumber = fishingOperationNumber; + + if (modelGearShootingStartDate != null) { + this.modelGearShootingStartOnlyDate = DateUtil.getDay(modelGearShootingStartDate); + } else { + this.modelGearShootingStartOnlyDate = null; + } + + this.mappingRowsByField = Maps.uniqueIndex(protocol.getOperationFieldMapping(), new Function<OperationFieldMappingRow, String>() { + @Override + public String apply(OperationFieldMappingRow operationFieldMappingRow) { + return operationFieldMappingRow.getField(); + } + }); + } + + @Override + public boolean apply(FishingOperation fishingOperation) { + + OperationFieldMappingRow operationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); + OperationFieldMappingRow stationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER); + OperationFieldMappingRow startDateRow = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); + + String operationNumberColumn = operationNumberRow != null ? operationNumberRow.getImportColumn() : null; + String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; + String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; + + boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), stationNumber); + boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), fishingOperationNumber); + // check if the dates (not time) are equals, but push the time to the model + Date gearShootingStartDate = fishingOperation.getGearShootingStartDate(); + if (gearShootingStartDate != null) { + gearShootingStartDate = DateUtil.getDay(gearShootingStartDate); + } + boolean sameGearShootingStartDate = Objects.equals(modelGearShootingStartOnlyDate, gearShootingStartDate); + + return (StringUtils.isBlank(stationColumn) || sameStationNumber) + && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) + && (StringUtils.isBlank(startDateColumn) || sameGearShootingStartDate); + } + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java new file mode 100644 index 0000000..66cb57e --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java @@ -0,0 +1,15 @@ +package fr.ifremer.tutti.service.operationimport; + +/** + * When no matching fishing operation was found in from column file import file. + * + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileFishingOperationNotFoundException extends Exception { + + private static final long serialVersionUID = 1L; + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java new file mode 100644 index 0000000..03771fe --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java @@ -0,0 +1,29 @@ +package fr.ifremer.tutti.service.operationimport; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import org.nuiton.csv.AbstractImportErrorInfo; + +import java.util.Set; + +/** + * When the row to match in fishing operation import from column file is not valid. + * + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileInvalidRowException extends Exception { + + private static final long serialVersionUID = 1L; + + private final Set<AbstractImportErrorInfo<FishingOperation>> errors; + + public ImportFromColumnFileInvalidRowException(Set<AbstractImportErrorInfo<FishingOperation>> errors) { + this.errors = errors; + } + + public Set<AbstractImportErrorInfo<FishingOperation>> getErrors() { + return errors; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java new file mode 100644 index 0000000..fdfb2ed --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java @@ -0,0 +1,213 @@ +package fr.ifremer.tutti.service.operationimport; + +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +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 org.apache.commons.lang3.StringUtils; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.csv.ValueParser; +import org.nuiton.csv.ValueSetter; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 12/11/14. + * + * @author Kevin Morin - morin@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { + + private final FishingOperation fishingOperation; + + public ImportFromColumnFileModel(char separator, Set<String> headers, + PersistenceService persistenceService, + TuttiDataContext dataContext, + FishingOperation fishingOperation) { + super(separator); + this.fishingOperation = fishingOperation; + + TuttiProtocol protocol = dataContext.getProtocol(); + Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); + + String zoneId = dataContext.getProgram().getZone().getId(); + + for (OperationFieldMappingRow mappingRow : operationFieldMapping) { + String importColumn = mappingRow.getImportColumn(); + boolean importColumnsInHeaders = headers.remove(importColumn); + if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) { + + String field = mappingRow.getField(); + ValueParser valueParser; + switch (field) { + case FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER: + valueParser = TuttiCsvUtil.INTEGER; + break; + + case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE: + case FishingOperation.PROPERTY_TRAWL_DISTANCE: + valueParser = TuttiCsvUtil.FLOAT; + break; + + case FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_END_DATE: + valueParser = TuttiCsvUtil.DAY_TIME; + break; + + case FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE: + valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; + break; + + case FishingOperation.PROPERTY_FISHING_OPERATION_VALID: + valueParser = TuttiCsvUtil.BOOLEAN; + break; + + case FishingOperation.PROPERTY_GEAR: + 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 FishingOperation.PROPERTY_VESSEL: + 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; + + case FishingOperation.PROPERTY_SECONDARY_VESSEL: + vessels = new ArrayList<>(dataContext.getFishingVessels()); + vessels.addAll(dataContext.getScientificVessels()); + vesselUniverse = TuttiEntities.splitById(vessels); + valueParser = newForeignKeyListValue(Vessel.class, field, vesselUniverse); + break; + + case FishingOperation.PROPERTY_STRATA: + Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationStrata(zoneId)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, strataUniverse); + break; + + case FishingOperation.PROPERTY_SUB_STRATA: + Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationSubStrata(zoneId, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); + break; + + case FishingOperation.PROPERTY_LOCATION: + Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationLocation(zoneId, null, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); + break; + + case FishingOperation.PROPERTY_RECORDER_PERSON: + Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); + valueParser = newForeignKeyListValue(Person.class, field, personUniverse); + break; + + default: + valueParser = TuttiCsvUtil.STRING; + + } + newMandatoryColumn(importColumn, field, valueParser); + + } else if (!importColumnsInHeaders) { + throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); + } + } + + Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping(); + for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) { + String importColumn = mappingRow.getImportColumn(); + if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { + + int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); + final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId); + + ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { + @Override + public void set(FishingOperation fishingOperation, String value) throws Exception { + + Serializable realValue = null; + if (StringUtils.isNotBlank(value)) { + switch (caracteristic.getCaracteristicType()) { + case QUALITATIVE: + for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) { + if (value.equals(cqv.getId())) { + realValue = cqv; + break; + } + } + break; + + case NUMBER: + realValue = Float.parseFloat(value); + break; + + default: + realValue = value; + } + } + + CaracteristicMap caracteristicMap; + if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) { + caracteristicMap = fishingOperation.getGearUseFeatures(); + if (caracteristicMap == null) { + caracteristicMap = new CaracteristicMap(); + fishingOperation.setGearUseFeatures(caracteristicMap); + } + + } else { + caracteristicMap = fishingOperation.getVesselUseFeatures(); + if (caracteristicMap == null) { + caracteristicMap = new CaracteristicMap(); + fishingOperation.setVesselUseFeatures(caracteristicMap); + } + } + caracteristicMap.put(caracteristic, realValue); + + } + }; + newMandatoryColumn(importColumn, setter); + + } + } + + + for (String header : headers) { + newIgnoredColumn(header); + } + } + + @Override + public FishingOperation newEmptyInstance() { +// FishingOperation fishingOperation = FishingOperations.newFishingOperation(); +// EditFishingOperationUIModel model = getModel(); +// toBeanBinder.copy(model, fishingOperation); + return fishingOperation; + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 4bfd2593e8b7ad33ddb43025d311485c631a0a93 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:44 2014 +0100 renommage de l'action d'import de caracteristiques d'un trait + utilisation du service dédié --- .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 5 + ...perationCaracteristicsFromColumnFileAction.java | 138 ++++++++ .../swing/action/ImportFromColumnFileAction.java | 367 --------------------- .../content/operation/EditFishingOperationUI.css | 2 +- 4 files changed, 144 insertions(+), 368 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java index 3a0e46b..4a48eed 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java @@ -42,6 +42,7 @@ import fr.ifremer.tutti.service.catches.multipost.MultiPostImportService; import fr.ifremer.tutti.service.export.generic.TuttiExportService; import fr.ifremer.tutti.service.export.pdf.CatchesPdfExportService; import fr.ifremer.tutti.service.export.sumatra.CatchesSumatraExportService; +import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; import fr.ifremer.tutti.service.psionimport.PsionImportService; import fr.ifremer.tutti.service.pupitri.PupitriImportExportService; @@ -731,6 +732,10 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage return serviceContext.getService(MultiPostExportService.class); } + public FishingOperationImportService getFishingOperationImportService() { + return serviceContext.getService(FishingOperationImportService.class); + } + public ReportService getReportService() { return serviceContext.getService(ReportService.class); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java new file mode 100644 index 0000000..c3382d2 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java @@ -0,0 +1,138 @@ +package fr.ifremer.tutti.ui.swing.action; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileFishingOperationNotFoundException; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileInvalidRowException; +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.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.AbstractImportErrorInfo; +import org.nuiton.jaxx.application.ApplicationBusinessException; + +import java.io.File; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class ImportFishingOperationCaracteristicsFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { + + private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); + + /** + * File to import. + */ + protected File columnsFile; + + /** + * Result fishing operation after import to merge back to ui model. + */ + protected FishingOperation fishingOperationToMerge; + + public ImportFishingOperationCaracteristicsFromColumnFileAction(EditFishingOperationUIHandler handler) { + super(handler, true); + } + + @Override + public boolean prepareAction() throws Exception { + boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); + + if (result) { + columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), + t("tutti.editFishingOperation.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); + + result = columnsFile != null; + } + + return result; + } + + @Override + public void doAction() throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + + EditFishingOperationUIModel model = getModel(); + + // Create a copy of the ui model to use in the import + // this bean will be merged back after import into ui model + fishingOperationToMerge = model.toEntity(); + + //FIXME Check we don't need this ? +// fishingOperationToMerge = FishingOperations.newFishingOperation(); +// Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); +// toBeanBinder.copy(model, fishingOperationToMerge); + + FishingOperationImportService fishingOperationImportService = getContext().getFishingOperationImportService(); + + fishingOperationImportService.importCaracteristicsFromColumnFile(columnsFile, fishingOperationToMerge); + + } + + @Override + public void postSuccessAction() { + + super.postSuccessAction(); + + // Merge result to ui model + EditFishingOperationUI ui = getUI(); + EditFishingOperationUIModel model = getModel(); + + model.fromEntity(fishingOperationToMerge); + + //FIXME Find out why ? + //these 2 do not refresh correctly + ui.getRecorderPersonList().getHandler().setSelected(fishingOperationToMerge.getRecorderPerson()); + ui.getSecondaryVesselList().getHandler().setSelected(fishingOperationToMerge.getSecondaryVessel()); + + ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperationToMerge); + ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperationToMerge); + + sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + + } + + @Override + public void postFailedAction(Throwable error) { + + String errorMessage = null; + if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { + + // no matching fishing operation + errorMessage = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; + + } + + if (error instanceof ImportFromColumnFileInvalidRowException) { + + // matching row is not valid + ImportFromColumnFileInvalidRowException importFromColumnFileInvalidRowException = (ImportFromColumnFileInvalidRowException) error; + + errorMessage = ""; + for (AbstractImportErrorInfo<FishingOperation> errorInfo : importFromColumnFileInvalidRowException.getErrors()) { + if (log.isErrorEnabled()) { + log.error(errorInfo.getCause().getLocalizedMessage()); + } + errorMessage += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; + } + + } + + //TODO Check this is ok, otherwise use below code + throw new ApplicationBusinessException(t("tutti.editFishingOperation.action.importColumns.error", errorMessage)); + +// if (errorMessage != null) { +// +// displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), +// "<html><body>" + +// t("tutti.editFishingOperation.action.importColumns.error", errorMessage) +// + "</body></html>"); +// +// } + + } +} 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 deleted file mode 100644 index 4a84e47..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ /dev/null @@ -1,367 +0,0 @@ -package fr.ifremer.tutti.ui.swing.action; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.FishingOperations; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; -import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -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; - -import java.io.File; -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; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -import static org.nuiton.i18n.I18n.t; - -/** - * @author Kevin Morin (Code Lutin) - * @since 3.10 - */ -public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { - - private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); - - protected File columnsFile; - - protected String error; - - public ImportFromColumnFileAction(EditFishingOperationUIHandler handler) { - super(handler, true); - } - - @Override - public boolean prepareAction() throws Exception { - boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); - - if (result) { - columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), - t("tutti.editFishingOperation.action.chooseColumnsFile.import"), - "^.*\\.csv", t("tutti.common.file.csv")); - - result = columnsFile != null; - } - - return result; - } - - @Override - public void doAction() throws Exception { - - final EditFishingOperationUIModel model = getModel(); - - Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); - - ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); - ImportConf conf = new ImportConf(); - conf.setStrictMode(false); - - Import2<FishingOperation> operationUIModelImport = - Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); - - TuttiProtocol protocol = getDataContext().getProtocol(); - final Map<String, OperationFieldMappingRow> mappingRowsByField = - Maps.uniqueIndex(protocol.getOperationFieldMapping(), new Function<OperationFieldMappingRow, String>() { - @Override - public String apply(OperationFieldMappingRow operationFieldMappingRow) { - return operationFieldMappingRow.getField(); - } - }); - - // predicate to check if the row matches the model key defined by the protocol< - Predicate<FishingOperation> predicate = new Predicate<FishingOperation>() { - @Override - public boolean apply(FishingOperation fishingOperation) { - - OperationFieldMappingRow operationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); - OperationFieldMappingRow stationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER); - OperationFieldMappingRow startDateRow = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); - - String operationNumberColumn = operationNumberRow != null ? operationNumberRow.getImportColumn() : null; - String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; - String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; - - boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); - boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); - // 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) - && (StringUtils.isBlank(startDateColumn) || sameGearShootingStartDate); - } - }; - - boolean found = false; - Iterator<ImportRow<FishingOperation>> iterator = operationUIModelImport.iterator(); - while (!found && iterator.hasNext()) { - ImportRow<FishingOperation> next = iterator.next(); - FishingOperation fishingOperation = next.getBean(); - - if (predicate.apply(fishingOperation)) { - if (next.isValid()) { - EditFishingOperationUI ui = getUI(); - model.fromEntity(fishingOperation); - //these 2 do not refresh correctly - ui.getRecorderPersonList().getHandler().setSelected(model.getRecorderPerson()); - ui.getSecondaryVesselList().getHandler().setSelected(model.getSecondaryVessel()); - - ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - - } else { - error = ""; - for (AbstractImportErrorInfo<FishingOperation> errorInfo : next.getErrors()) { - if (log.isErrorEnabled()) { - log.error(errorInfo.getCause().getLocalizedMessage()); - } - error += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; - } - } - found = true; - } - } - - if (!found) { - error = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; - } - } - - @Override - public void postSuccessAction() { - super.postSuccessAction(); - if (error != null) { - displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), - "<html><body>" + - t("tutti.editFishingOperation.action.importColumns.error", error) - + "</body></html>"); - } else { - sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); - } - error = null; - } - - protected class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { - - protected Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = - BinderFactory.newBinder(EditFishingOperationUIModel.class, - FishingOperation.class); - - public ImportFromColumnFileModel(char separator, Set<String> headers) { - super(separator); - - 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(); - boolean importColumnsInHeaders = headers.remove(importColumn); - if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) { - - String field = mappingRow.getField(); - ValueParser valueParser; - switch (field) { - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_NUMBER: - valueParser = TuttiCsvUtil.INTEGER; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE: - case EditFishingOperationUIModel.PROPERTY_TRAWL_DISTANCE: - valueParser = TuttiCsvUtil.FLOAT; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_DATE: - valueParser = TuttiCsvUtil.DAY_TIME; - break; - - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE: - valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; - break; - - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: - valueParser = TuttiCsvUtil.BOOLEAN; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR: - 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: - 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; - - case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: - vessels = new ArrayList<>(dataContext.getFishingVessels()); - vessels.addAll(dataContext.getScientificVessels()); - vesselUniverse = TuttiEntities.splitById(vessels); - valueParser = newForeignKeyListValue(Vessel.class, field, vesselUniverse); - 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_LOCATION: - Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById( - persistenceService.getAllFishingOperationLocation(zoneId, null, null)); - valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: - Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); - valueParser = newForeignKeyListValue(Person.class, field, personUniverse); - break; - - default: - valueParser = TuttiCsvUtil.STRING; - - } - newMandatoryColumn(importColumn, field, valueParser); - - } else if (!importColumnsInHeaders) { - throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); - } - } - - Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping(); - for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) { - String importColumn = mappingRow.getImportColumn(); - if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { - - int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); - final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId); - - ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { - @Override - public void set(FishingOperation fishingOperation, String value) throws Exception { - - Serializable realValue = null; - if (StringUtils.isNotBlank(value)) { - switch (caracteristic.getCaracteristicType()) { - case QUALITATIVE: - for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) { - if (value.equals(cqv.getId())) { - realValue = cqv; - break; - } - } - break; - - case NUMBER: - realValue = Float.parseFloat(value); - break; - - default: - realValue = value; - } - } - - CaracteristicMap caracteristicMap; - if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) { - caracteristicMap = fishingOperation.getGearUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - fishingOperation.setGearUseFeatures(caracteristicMap); - } - - } else { - caracteristicMap = fishingOperation.getVesselUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - fishingOperation.setVesselUseFeatures(caracteristicMap); - } - } - caracteristicMap.put(caracteristic, realValue); - - } - }; - newMandatoryColumn(importColumn, setter); - - } - } - - - for (String header : headers) { - newIgnoredColumn(header); - } - } - - @Override - public FishingOperation newEmptyInstance() { - FishingOperation fishingOperation = FishingOperations.newFishingOperation(); - toBeanBinder.copy(getModel(), fishingOperation); - return fishingOperation; - } - } -} 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 d5a42ed..dede964 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 @@ -85,7 +85,7 @@ JXDatePicker { text: "tutti.editFishingOperation.action.importFromColumnFile"; toolTipText: "tutti.editFishingOperation.action.importFromColumnFile.tip"; i18nMnemonic: "tutti.editFishingOperation.action.importFromColumnFile.mnemonic"; - _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFromColumnFileAction.class}; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFishingOperationCaracteristicsFromColumnFileAction.class}; _help: {"tutti.editFishingOperation.action.importFromColumnFile.help"}; enabled: {model.isImportFromColumnFileEnabled()} } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 f3570e7999496d1da30a99852283fcded556c25d Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:58:19 2014 +0100 utilisation d'une exception si colonne non trouvee dans le header --- .../FishingOperationImportService.java | 2 +- ...ImportFromColumnFileMissingHeaderException.java | 24 +++++++++++++++++ .../operationimport/ImportFromColumnFileModel.java | 7 ++--- ...perationCaracteristicsFromColumnFileAction.java | 30 ++++++++++++---------- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java index 89709e4..a68cbb2 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java @@ -48,7 +48,7 @@ public class FishingOperationImportService extends AbstractTuttiService { dataContext = context.getDataContext(); } - public void importCaracteristicsFromColumnFile(File columnsFile, FishingOperation fishingoperation) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + public void importCaracteristicsFromColumnFile(File columnsFile, FishingOperation fishingoperation) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException, ImportFromColumnFileMissingHeaderException { // Get import file headers Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java new file mode 100644 index 0000000..21702e2 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java @@ -0,0 +1,24 @@ +package fr.ifremer.tutti.service.operationimport; + +/** + * when a column header is missing in the import file. + * + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileMissingHeaderException extends Exception { + + private static final long serialVersionUID = 1L; + + private final String importColumn; + + public ImportFromColumnFileMissingHeaderException(String importColumn) { + this.importColumn = importColumn; + } + + public String getImportColumn() { + return importColumn; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java index fdfb2ed..742a381 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java @@ -17,7 +17,6 @@ import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiCsvUtil; import fr.ifremer.tutti.service.TuttiDataContext; import org.apache.commons.lang3.StringUtils; -import org.nuiton.csv.ImportRuntimeException; import org.nuiton.csv.ValueParser; import org.nuiton.csv.ValueSetter; @@ -28,8 +27,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static org.nuiton.i18n.I18n.t; - /** * Created on 12/11/14. * @@ -43,7 +40,7 @@ public class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportM public ImportFromColumnFileModel(char separator, Set<String> headers, PersistenceService persistenceService, TuttiDataContext dataContext, - FishingOperation fishingOperation) { + FishingOperation fishingOperation) throws ImportFromColumnFileMissingHeaderException { super(separator); this.fishingOperation = fishingOperation; @@ -136,7 +133,7 @@ public class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportM newMandatoryColumn(importColumn, field, valueParser); } else if (!importColumnsInHeaders) { - throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); + throw new ImportFromColumnFileMissingHeaderException(importColumn); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java index c3382d2..b1eadc7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java @@ -4,6 +4,7 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileFishingOperationNotFoundException; import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileInvalidRowException; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileMissingHeaderException; 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; @@ -27,7 +28,7 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab /** * File to import. */ - protected File columnsFile; + protected File importFile; /** * Result fishing operation after import to merge back to ui model. @@ -43,18 +44,18 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); if (result) { - columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), - t("tutti.editFishingOperation.action.chooseColumnsFile.import"), - "^.*\\.csv", t("tutti.common.file.csv")); + importFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), + t("tutti.editFishingOperation.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); - result = columnsFile != null; + result = importFile != null; } return result; } @Override - public void doAction() throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + public void doAction() throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException, ImportFromColumnFileMissingHeaderException { EditFishingOperationUIModel model = getModel(); @@ -67,9 +68,8 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab // Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); // toBeanBinder.copy(model, fishingOperationToMerge); - FishingOperationImportService fishingOperationImportService = getContext().getFishingOperationImportService(); - - fishingOperationImportService.importCaracteristicsFromColumnFile(columnsFile, fishingOperationToMerge); + FishingOperationImportService importService = getContext().getFishingOperationImportService(); + importService.importCaracteristicsFromColumnFile(importFile, fishingOperationToMerge); } @@ -100,14 +100,18 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab public void postFailedAction(Throwable error) { String errorMessage = null; - if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { + + if (error instanceof ImportFromColumnFileMissingHeaderException) { + ImportFromColumnFileMissingHeaderException importFromColumnFileMissingHeaderException = (ImportFromColumnFileMissingHeaderException) error; + + errorMessage = t("tutti.editFishingOperation.action.importColumns.missingHeader", importFromColumnFileMissingHeaderException.getImportColumn()); + + } else if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { // no matching fishing operation errorMessage = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; - } - - if (error instanceof ImportFromColumnFileInvalidRowException) { + } else if (error instanceof ImportFromColumnFileInvalidRowException) { // matching row is not valid ImportFromColumnFileInvalidRowException importFromColumnFileInvalidRowException = (ImportFromColumnFileInvalidRowException) error; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm