This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 93bdff5504d49a220b35430ac66eadff0947de7c Author: Kevin Morin <morin@codelutin.com> Date: Mon Nov 3 10:33:45 2014 +0100 refs #5038 [IMPORT] afficher le résultat de l'import d'un fichier de référence temporaire : nb lignes lues et importées refs #5997 --- .../entities/referential/VesselBean.java | 11 ++++ .../service/ReferentialPersistenceServiceImpl.java | 65 ++++++++++++++-------- .../referential/ReferentialImportService.java | 57 +++++++++++++++---- .../resources/i18n/tutti-service_en_GB.properties | 2 + .../resources/i18n/tutti-service_fr_FR.properties | 2 + .../ExportExistingTemporaryVesselAction.java | 2 +- 6 files changed, 102 insertions(+), 37 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/VesselBean.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/VesselBean.java new file mode 100644 index 0000000..51cff83 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/VesselBean.java @@ -0,0 +1,11 @@ +package fr.ifremer.tutti.persistence.entities.referential; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class VesselBean extends AbstractVesselBean { + + private static final long serialVersionUID = 7220732795288760932L; + +} diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java index 1808f1f..be73b89 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java @@ -712,7 +712,10 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic Preconditions.checkNotNull(entity); Preconditions.checkNotNull(entity.getId()); Preconditions.checkNotNull(entity.getStatus()); - return StatusCode.TEMPORARY.getValue().equals(entity.getStatus().getId()) && entity.getIdAsInt() < 0; + + return StatusCode.TEMPORARY.getValue().equals(entity.getStatus().getId()) && + (entity.getIdAsInt() != null && entity.getIdAsInt() < 0 + || entity.getId() != null && entity.getId().startsWith(TemporaryDataHelper.TEMPORARY_NAME_PREFIX)); } @Override @@ -1047,21 +1050,21 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic @Override public boolean isTemporaryPersonUsed(Integer id) { - Long count = queryUniqueTyped("replaceManagerPersonInScientificCruise", "id", IntegerType.INSTANCE, id); + Long count = queryUniqueTyped("countManagerPersonInScientificCruise", "id", IntegerType.INSTANCE, id); boolean result = count > 0; if (!result) { - count = queryUniqueTyped("replaceRecorderPersonInScientificCruise", "id", IntegerType.INSTANCE, id); + count = queryUniqueTyped("countRecorderPersonInScientificCruise", "id", IntegerType.INSTANCE, id); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceRecorderPersonInFishingTrip", "id", IntegerType.INSTANCE, id); + count = queryUniqueTyped("countRecorderPersonInFishingTrip", "id", IntegerType.INSTANCE, id); result = count > 0; } if (!result) { - count = queryUniqueTyped("replacePersonInVesselPersonFeatures", "id", IntegerType.INSTANCE, id); + count = queryUniqueTyped("countPersonInVesselPersonFeatures", "id", IntegerType.INSTANCE, id); result = count > 0; } @@ -1082,11 +1085,11 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic @Override public boolean isTemporaryGearUsed(Integer id) { - Long count = queryUniqueTyped("replaceGearInGearPhysicalFeatures", "id", IntegerType.INSTANCE, id); + Long count = queryUniqueTyped("countGearInGearPhysicalFeatures", "id", IntegerType.INSTANCE, id); boolean result = count > 0; if (!result) { - count = queryUniqueTyped("replaceGearInGearUseFeatures", "id", IntegerType.INSTANCE, id); + count = queryUniqueTyped("countGearInGearUseFeatures", "id", IntegerType.INSTANCE, id); result = count > 0; } return result; @@ -1094,46 +1097,46 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic @Override public boolean isTemporaryVesselUsed(String code) { - Long count = queryUniqueTyped("replaceVesselInCruise", "id", StringType.INSTANCE, code); + Long count = queryUniqueTyped("countVesselInCruise", "id", StringType.INSTANCE, code); boolean result = count > 0; if (!result) { - count = queryUniqueTyped("replaceVesselInFishingOperation", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInFishingOperation", "id", StringType.INSTANCE, code); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceVesselInOperationVesselAssociation", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInOperationVesselAssociation", "id", StringType.INSTANCE, code); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceVesselInDailyActivityCalendar", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInDailyActivityCalendar", "id", StringType.INSTANCE, code); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceVesselInLanding", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInLanding", "id", StringType.INSTANCE, code); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceVesselInFishingtrip", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInFishingtrip", "id", StringType.INSTANCE, code); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceVesselInVesselUseFeatures", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInVesselUseFeatures", "id", StringType.INSTANCE, code); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceVesselInGearUseFeatures", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInGearUseFeatures", "id", StringType.INSTANCE, code); result = count > 0; } if (!result) { - count = queryUniqueTyped("replaceVesselInGearPhysicalFeatures", "id", StringType.INSTANCE, code); + count = queryUniqueTyped("countVesselInGearPhysicalFeatures", "id", StringType.INSTANCE, code); result = count > 0; } @@ -1180,11 +1183,19 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic Preconditions.checkNotNull(source.getFirstName()); Preconditions.checkNotNull(source.getLastName()); - fr.ifremer.adagio.core.dao.administration.user.Person target = personDao.createAsTemporary(source.getLastName(), source.getFirstName(), DepartmentId.UNKNOWN_RECORDER_DEPARTMENT.getValue()); + Person result; + if (source.getId() != null) { + result = getPerson(source.getIdAsInt()); + + } else { + fr.ifremer.adagio.core.dao.administration.user.Person target = + personDao.createAsTemporary(source.getLastName(), source.getFirstName(), + DepartmentId.UNKNOWN_RECORDER_DEPARTMENT.getValue()); + result = Persons.newPerson(); + result.setId(target.getId()); + } // Fill the result bean - Person result = Persons.newPerson(); - result.setId(target.getId()); result.setLastName(source.getLastName()); result.setFirstName(source.getFirstName()); setStatus(status, result); @@ -1197,8 +1208,8 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic Preconditions.checkArgument(source.getIdAsInt() == null || source.getIdAsInt() < 0); TaxonRefVO taxonRefVO = null; - if (source.getId() != null) { - taxonRefVO = taxonNameDao.getTaxonNameReferent(source.getIdAsInt()); + if (source.getReferenceTaxonId() != null) { + taxonRefVO = taxonNameDao.getTaxonNameReferent(source.getReferenceTaxonId()); } if (taxonRefVO == null) { taxonRefVO = new TaxonRefVO(); @@ -1236,11 +1247,17 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic gearClassificationId = GearClassificationId.FAO.getValue(); } - fr.ifremer.adagio.core.dao.referential.gear.Gear target = fishingGearDao.createAsTemporary(source.getLabel(), source.getName(), gearClassificationId); + Gear result; + if (source.getId() != null) { + result = getGear(source.getIdAsInt()); + + } else { + fr.ifremer.adagio.core.dao.referential.gear.Gear target = fishingGearDao.createAsTemporary(source.getLabel(), source.getName(), gearClassificationId); + result = Gears.newGear(); + result.setId(target.getId()); + } // Fill the result bean - Gear result = Gears.newGear(); - result.setId(target.getId()); result.setLabel(source.getLabel()); result.setName(source.getName()); result.setScientificGear(source.isScientificGear()); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialImportService.java index 16ff873..aee5192 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialImportService.java @@ -55,8 +55,10 @@ import java.io.File; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -98,8 +100,8 @@ public class ReferentialImportService extends AbstractTuttiService { return input.getName(); } })); - - Set<Integer> existingSpeciesIds = new HashSet<>(TuttiEntities.toIntegerIds(allSpecies)); + Map<Integer, Species> existingSpeciesById = TuttiEntities.splitByIdAsInt(allSpecies); + Set<Integer> existingSpeciesIds = new HashSet<>(existingSpeciesById.keySet()); List<Species> toAdd = Lists.newArrayList(); List<Species> toUpdate = Lists.newArrayList(); @@ -116,6 +118,7 @@ public class ReferentialImportService extends AbstractTuttiService { Integer id = bean.getIdAsInt(); String name = bean.getName(); + Species species = existingSpeciesById.get(id); boolean delete = BooleanUtils.isTrue(bean.getToDelete()); if (id != null && existingSpeciesIds.add(id)) { @@ -124,7 +127,8 @@ public class ReferentialImportService extends AbstractTuttiService { } else if (StringUtils.isBlank(name)) { throw new IllegalArgumentException(t("tutti.service.referential.import.species.noName.error", id)); - } else if (!delete && !existingSpeciesNames.add(name)) { + } else if (!delete && !existingSpeciesNames.add(name) && + (id == null || species != null && !species.getName().equals(name))) { throw new IllegalArgumentException(t("tutti.service.referential.import.species.existingName.error", name)); } @@ -133,12 +137,14 @@ public class ReferentialImportService extends AbstractTuttiService { throw new IllegalArgumentException(t("tutti.service.referential.import.species.used.error", id)); } toDelete.add(id); + existingSpeciesNames.remove(name); } else { if (bean.getId() == null) { toAdd.add(bean); } else { + bean.setReferenceTaxonId(species.getReferenceTaxonId()); toUpdate.add(bean); } } @@ -191,12 +197,11 @@ public class ReferentialImportService extends AbstractTuttiService { Function<Vessel, String> vesselToId = new Function<Vessel, String>() { @Override public String apply(Vessel input) { - return input.getName() + "#" + input.getInternationalRegistrationCode(); + return input.getRegistrationCode(); } }; - Set<String> existingIds = Sets.newHashSet( - Lists.transform(existingVessels, vesselToId)); + Set<String> existingIds = Sets.newHashSet(Lists.transform(existingVessels, vesselToId)); List<Vessel> toAdd = Lists.newArrayList(); List<Vessel> toUpdate = Lists.newArrayList(); @@ -211,10 +216,10 @@ public class ReferentialImportService extends AbstractTuttiService { for (final VesselRow bean : importer) { - String currentId = vesselToId.apply(bean); + String currentId = bean.getId(); boolean delete = BooleanUtils.isTrue(bean.getToDelete()); - if (!existingIds.add(currentId)) { + if (existingIds.add(currentId)) { // id was already in universe throw new ApplicationTechnicalException( @@ -281,7 +286,16 @@ public class ReferentialImportService extends AbstractTuttiService { List<Person> allPersons = persistenceService.getAllPerson(); - Set<Integer> existingPersonIds = new HashSet<>(TuttiEntities.toIntegerIds(allPersons)); + // get all species names + Set<String> existingPersonFullNames = Sets.newHashSet(Iterables.transform(allPersons, new Function<Person, String>() { + @Override + public String apply(Person input) { + return getPersonFullName(input); + } + })); + Map<Integer, Person> existingPersonsById = TuttiEntities.splitByIdAsInt(allPersons); + + Set<Integer> existingPersonIds = new HashSet<>(existingPersonsById.keySet()); List<Person> toAdd = Lists.newArrayList(); List<Person> toUpdate = Lists.newArrayList(); @@ -297,11 +311,19 @@ public class ReferentialImportService extends AbstractTuttiService { for (PersonRow bean : importer) { Integer id = bean.getIdAsInt(); - String name = bean.getName(); + Person person = existingPersonsById.get(id); + String name = getPersonFullName(bean); boolean delete = BooleanUtils.isTrue(bean.getToDelete()); if (id != null && existingPersonIds.add(id)) { throw new IllegalArgumentException(t("tutti.service.referential.import.person.notExistingId.error", id)); + + } else if (StringUtils.isBlank(name)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.person.noName.error", id)); + + } else if (!delete && !existingPersonFullNames.add(name) && + (id == null || person != null && !person.getName().equals(name))) { + throw new IllegalArgumentException(t("tutti.service.referential.import.person.existingName.error", name)); } if (delete) { @@ -309,6 +331,7 @@ public class ReferentialImportService extends AbstractTuttiService { throw new IllegalArgumentException(t("tutti.service.referential.import.person.used.error", id)); } toDelete.add(id); + existingPersonFullNames.remove(name); } else { if (bean.getId() == null) { @@ -352,6 +375,12 @@ public class ReferentialImportService extends AbstractTuttiService { return result; } + protected String getPersonFullName(Person person) { + return StringUtils.lowerCase( + StringUtils.trimToEmpty(person.getFirstName()) + + StringUtils.trimToEmpty(person.getLastName())); + } + public ReferentialImportResult<Gear> importTemporaryGear(File file) throws IOException { ReferentialImportResult<Gear> result = new ReferentialImportResult<>(); @@ -371,7 +400,8 @@ public class ReferentialImportService extends AbstractTuttiService { } })); - Set<Integer> existingGearIds = new HashSet<>(TuttiEntities.toIntegerIds(allGears)); + Map<Integer, Gear> existingGearsById = TuttiEntities.splitByIdAsInt(allGears); + Set<Integer> existingGearIds = new HashSet<>(existingGearsById.keySet()); List<Gear> toAdd = Lists.newArrayList(); List<Gear> toUpdate = Lists.newArrayList(); @@ -387,6 +417,7 @@ public class ReferentialImportService extends AbstractTuttiService { for (GearRow bean : importer) { Integer id = bean.getIdAsInt(); + Gear gear = existingGearsById.get(id); String name = bean.getName(); boolean delete = BooleanUtils.isTrue(bean.getToDelete()); @@ -396,7 +427,8 @@ public class ReferentialImportService extends AbstractTuttiService { } else if (StringUtils.isBlank(name)) { throw new IllegalArgumentException(t("tutti.service.referential.import.gear.noName.error", id)); - } else if (!delete && !existingGearNames.add(name)) { + } else if (!delete && !existingGearNames.add(name) && + (id == null || gear != null && !gear.getName().equals(name))) { throw new IllegalArgumentException(t("tutti.service.referential.import.gear.existingName.error", name)); } @@ -405,6 +437,7 @@ public class ReferentialImportService extends AbstractTuttiService { throw new IllegalArgumentException(t("tutti.service.referential.import.species.used.error", id)); } toDelete.add(id); + existingGearNames.remove(name); } else { if (bean.getId() == null) { diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 7280f5c..ef1186d 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -222,7 +222,9 @@ tutti.service.referential.import.gear.idNotNegative.error= tutti.service.referential.import.gear.noName.error= tutti.service.referential.import.gear.notExistingId.error= tutti.service.referential.import.gears.error= +tutti.service.referential.import.person.existingName.error= tutti.service.referential.import.person.idNotNegative.error= +tutti.service.referential.import.person.noName.error= tutti.service.referential.import.person.notExistingId.error= tutti.service.referential.import.person.used.error= tutti.service.referential.import.persons.error= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 41648ed..480f3b6 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -202,7 +202,9 @@ tutti.service.referential.import.gear.idNotNegative.error=L'identifiant d'un eng tutti.service.referential.import.gear.noName.error= tutti.service.referential.import.gear.notExistingId.error=L'identifiant '%s' n'a pas été trouvé parmi les engins temporaires tutti.service.referential.import.gears.error=Erreur lors de l'import des engins du fichier %s +tutti.service.referential.import.person.existingName.error= tutti.service.referential.import.person.idNotNegative.error=L'identifiant d'une personne temporaire doit être négatif \: %s +tutti.service.referential.import.person.noName.error= tutti.service.referential.import.person.notExistingId.error=L'identifiant '%s' n'a pas été trouvé parmi les personnes temporaires tutti.service.referential.import.person.used.error= tutti.service.referential.import.persons.error=Erreur lors de l'import des personnes du fichier %s diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportExistingTemporaryVesselAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportExistingTemporaryVesselAction.java index 314d4f5..a759de1 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportExistingTemporaryVesselAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportExistingTemporaryVesselAction.java @@ -61,7 +61,7 @@ public class ExportExistingTemporaryVesselAction extends AbstractTuttiAction<Tut // choose file to export file = saveFile( - "exportTemporaryExample", + "exportTemporaryVessels", "csv", t("tutti.manageTemporaryReferential.title.choose.exportExistingTemporaryVesselFile"), t("tutti.manageTemporaryReferential.action.chooseExistingReferentialVesselFile.export"), -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.