This is an automated email from the git hooks/post-receive script. New commit to branch feature/5997 in repository tutti. See http://git.codelutin.com/tutti.git commit 81000e10f0bdd092863b80a765142e67b9bb2af3 Author: Kevin Morin <morin@codelutin.com> Date: Mon Oct 27 16:56:27 2014 +0100 refs #5997 [IMPORT] Améliorer la gestion des référentiels temporaires --- .../tutti/persistence/TuttiPersistenceImpl.java | 40 +++ .../persistence/TuttiPersistenceNoDbImpl.java | 40 +++ .../service/ReferentialPersistenceService.java | 85 ++++++- .../service/ReferentialPersistenceServiceImpl.java | 138 ++++++++++- .../src/main/resources/queries-failsafe.hbm.xml | 153 ++++++++++++ .../ifremer/tutti/service/PersistenceService.java | 40 +++ .../tutti/service/referential/GearModel.java | 26 +- .../ifremer/tutti/service/referential/GearRow.java | 37 +++ .../tutti/service/referential/PersonModel.java | 20 +- .../tutti/service/referential/PersonRow.java | 36 +++ .../referential/ReferentialExportService.java | 45 +++- .../referential/ReferentialImportService.java | 225 +++++++++++++---- .../tutti/service/referential/SpeciesModel.java | 18 +- .../tutti/service/referential/SpeciesRow.java | 35 +++ .../tutti/service/referential/VesselModel.java | 24 +- .../tutti/service/referential/VesselRow.java | 38 +++ .../resources/i18n/tutti-service_en_GB.properties | 10 + .../resources/i18n/tutti-service_fr_FR.properties | 12 +- .../referential/ReferentialExportServiceTest.java | 36 +-- .../referential/ReferentialImportServiceTest.java | 275 ++++++++++++++++++--- .../resources/i18n/tutti-ui-swing_fr_FR.properties | 16 +- 21 files changed, 1175 insertions(+), 174 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java index 5a41454..c47ee26 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java @@ -487,20 +487,60 @@ public class TuttiPersistenceImpl implements TuttiPersistence { } @Override + public void deleteTemporaryGears(Collection<Integer> id, boolean checkIfUsed) { + referentialService.deleteTemporaryGears(id, checkIfUsed); + } + + @Override public void deleteTemporarySpecies(Integer id, boolean checkIfUsed) { referentialService.deleteTemporarySpecies(id, checkIfUsed); } @Override + public void deleteTemporarySpecies(Collection<Integer> ids, boolean checkIfUsed) { + referentialService.deleteTemporarySpecies(ids, checkIfUsed); + } + + @Override public void deleteTemporaryPerson(Integer id, boolean checkIfUsed) { referentialService.deleteTemporaryPerson(id, checkIfUsed); } @Override + public void deleteTemporaryPersons(Collection<Integer> ids, boolean checkIfUsed) { + referentialService.deleteTemporaryPersons(ids, checkIfUsed); + } + + @Override public void deleteTemporaryVessel(String code, boolean checkIfUsed) { referentialService.deleteTemporaryVessel(code, checkIfUsed); } + @Override + public void deleteTemporaryVessels(Collection<String> codes, boolean checkIfUsed) { + referentialService.deleteTemporaryVessels(codes, checkIfUsed); + } + + @Override + public boolean isTemporaryPersonUsed(Integer id) { + return referentialService.isTemporaryPersonUsed(id); + } + + @Override + public boolean isTemporarySpeciesUsed(Integer id) { + return referentialService.isTemporarySpeciesUsed(id); + } + + @Override + public boolean isTemporaryGearUsed(Integer id) { + return referentialService.isTemporaryGearUsed(id); + } + + @Override + public boolean isTemporaryVesselUsed(String code) { + return referentialService.isTemporaryVesselUsed(code); + } + //------------------------------------------------------------------------// //-- Attachment methods --// //------------------------------------------------------------------------// diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java index 4ca7737..fa96069 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java @@ -751,20 +751,60 @@ public class TuttiPersistenceNoDbImpl implements TuttiPersistence { } @Override + public void deleteTemporaryGears(Collection<Integer> id, boolean checkIfUsed) { + throw notImplemented(); + } + + @Override public void deleteTemporarySpecies(Integer id, boolean checkIfUsed) { throw notImplemented(); } @Override + public void deleteTemporarySpecies(Collection<Integer> ids, boolean checkIfUsed) { + throw notImplemented(); + } + + @Override public void deleteTemporaryPerson(Integer id, boolean checkIfUsed) { throw notImplemented(); } @Override + public void deleteTemporaryPersons(Collection<Integer> ids, boolean checkIfUsed) { + throw notImplemented(); + } + + @Override public void deleteTemporaryVessel(String code, boolean checkIfUsed) { throw notImplemented(); } + @Override + public void deleteTemporaryVessels(Collection<String> codes, boolean checkIfUsed) { + throw notImplemented(); + } + + @Override + public boolean isTemporaryPersonUsed(Integer id) { + throw notImplemented(); + } + + @Override + public boolean isTemporarySpeciesUsed(Integer id) { + throw notImplemented(); + } + + @Override + public boolean isTemporaryGearUsed(Integer id) { + throw notImplemented(); + } + + @Override + public boolean isTemporaryVesselUsed(String code) { + throw notImplemented(); + } + protected RuntimeException notImplemented() { return new RuntimeException("method not implemented"); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java index a21b100..d7a2795 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java @@ -40,6 +40,7 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; import java.util.List; /** @@ -372,43 +373,119 @@ public interface ReferentialPersistenceService extends TuttiPersistenceServiceIm * * @param id id of the gear to remove * @param checkIfUsed to check if gear is used before trying to delete it - * @since 3.9 + * @since 3.8 */ @Transactional(readOnly = false) @CacheEvict(value = "gears", allEntries = true) void deleteTemporaryGear(Integer id, boolean checkIfUsed); /** + * Delete the temporary gears with the given {@code idss}. + * + * @param id ids of the gears to remove + * @param checkIfUsed to check if gear is used before trying to delete it + * @since 3.8 + */ + @Transactional(readOnly = false) + @CacheEvict(value = "gears", allEntries = true) + void deleteTemporaryGears(Collection<Integer> ids, boolean checkIfUsed); + + /** * Delete the temporary species with the given {@code id}. * * @param id id of the species to remove * @param checkIfUsed to check if species is used before trying to delete it - * @since 3.9 + * @since 3.8 */ @Transactional(readOnly = false) @CacheEvict(value = {"species", "referentSpecies", "referentSpeciesById", "referentSpeciesByIdVernacular"}, allEntries = true) void deleteTemporarySpecies(Integer id, boolean checkIfUsed); /** + * Delete the temporary species with the given {@code ids}. + * + * @param ids ids of the species to remove + * @param checkIfUsed to check if species is used before trying to delete it + * @since 3.8 + */ + @Transactional(readOnly = false) + @CacheEvict(value = {"species", "referentSpecies", "referentSpeciesById", "referentSpeciesByIdVernacular"}, allEntries = true) + void deleteTemporarySpecies(Collection<Integer> ids, boolean checkIfUsed); + + /** * Delete the temporary person with the given {@code id}. * * @param id id of the person to remove * @param checkIfUsed to check if person is used before trying to delete it - * @since 3.9 + * @since 3.8 */ @Transactional(readOnly = false) @CacheEvict(value = {"persons", "personById"}, allEntries = true) void deleteTemporaryPerson(Integer id, boolean checkIfUsed); /** + * Delete the temporary persons with the given {@code ids}. + * + * @param ids ids of the persons to remove + * @param checkIfUsed to check if person is used before trying to delete it + * @since 3.8 + */ + @Transactional(readOnly = false) + @CacheEvict(value = {"persons", "personById"}, allEntries = true) + void deleteTemporaryPersons(Collection<Integer> ids, boolean checkIfUsed); + + /** * Delete the temporary vessel with the given {@code code}. * * @param code code of the vessel to remove * @param checkIfUsed to check if vessel is used before trying to delete it - * @since 3.9 + * @since 3.8 */ @Transactional(readOnly = false) @CacheEvict(value = {"fishingVessels", "vesselByCode"}, allEntries = true) void deleteTemporaryVessel(String code, boolean checkIfUsed); + /** + * Delete the temporary vessels with the given {@code codes}. + * + * @param codes code of the vessels to remove + * @param checkIfUsed to check if vessel is used before trying to delete it + * @since 3.8 + */ + @Transactional(readOnly = false) + @CacheEvict(value = {"fishingVessels", "vesselByCode"}, allEntries = true) + void deleteTemporaryVessels(Collection<String> codes, boolean checkIfUsed); + + /** + * Check if the temporary person with the given {@code id} is used. + * + * @param id id of the person to check + * @since 3.8 + */ + boolean isTemporaryPersonUsed(Integer id); + + /** + * Check if the temporary species with the given {@code id} is used. + * + * @param id id of the species to check + * @since 3.8 + */ + boolean isTemporarySpeciesUsed(Integer id); + + /** + * Check if the temporary gear with the given {@code id} is used. + * + * @param id id of the gear to remove + * @since 3.8 + */ + boolean isTemporaryGearUsed(Integer id); + + /** + * Check if the temporary vessel with the given {@code id} is used. + * + * @param code code of the vessel to remove + * @since 3.8 + */ + boolean isTemporaryVesselUsed(String code); + } 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 005d110..1808f1f 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 @@ -34,6 +34,7 @@ import fr.ifremer.adagio.core.dao.data.vessel.VesselExtendDao; import fr.ifremer.adagio.core.dao.referential.StatusCode; import fr.ifremer.adagio.core.dao.referential.StatusDao; import fr.ifremer.adagio.core.dao.referential.VesselTypeId; +import fr.ifremer.adagio.core.dao.referential.gear.FishingGear; import fr.ifremer.adagio.core.dao.referential.gear.FishingGearExtendDao; import fr.ifremer.adagio.core.dao.referential.gear.GearClassification; import fr.ifremer.adagio.core.dao.referential.gear.GearClassificationId; @@ -88,8 +89,10 @@ import org.springframework.dao.DataRetrievalFailureException; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -964,6 +967,13 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic } @Override + public void deleteTemporaryGears(Collection<Integer> ids, boolean checkIfUsed) { + for (Integer id : ids) { + deleteTemporaryGear(id, checkIfUsed); + } + } + + @Override public void deleteTemporarySpecies(Integer id, boolean checkIfUsed) { Preconditions.checkNotNull(id); @@ -975,26 +985,44 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic throw new ApplicationBusinessException(String.format("Species with id %d does not exists", id)); } + if (checkIfUsed) { + isTemporarySpeciesUsed(id); + } + taxonNameDao.remove(id); } @Override + public void deleteTemporarySpecies(Collection<Integer> ids, boolean checkIfUsed) { + for (Integer id : ids) { + deleteTemporarySpecies(id, checkIfUsed); + } + } + + @Override public void deleteTemporaryPerson(Integer id, boolean checkIfUsed) { Preconditions.checkNotNull(id); if (id > 0) { - throw new ApplicationBusinessException(String.format("Can't delete a Gear with a positive id %d.", id)); + throw new ApplicationBusinessException(String.format("Can't delete a Person with a positive id %d.", id)); } - Gear gear = getGear(id); - if (gear == null) { - throw new ApplicationBusinessException(String.format("Gear with id %d does not exists", id)); + Person person = getPerson(id); + if (person == null) { + throw new ApplicationBusinessException(String.format("Person with id %d does not exists", id)); } personDao.remove(id); } @Override + public void deleteTemporaryPersons(Collection<Integer> ids, boolean checkIfUsed) { + for (Integer id : ids) { + deleteTemporaryPerson(id, checkIfUsed); + } + } + + @Override public void deleteTemporaryVessel(String code, boolean checkIfUsed) { Preconditions.checkNotNull(code); @@ -1010,6 +1038,108 @@ public class ReferentialPersistenceServiceImpl extends AbstractPersistenceServic } + @Override + public void deleteTemporaryVessels(Collection<String> codes, boolean checkIfUsed) { + for (String code : codes) { + deleteTemporaryVessel(code, checkIfUsed); + } + } + + @Override + public boolean isTemporaryPersonUsed(Integer id) { + Long count = queryUniqueTyped("replaceManagerPersonInScientificCruise", "id", IntegerType.INSTANCE, id); + boolean result = count > 0; + + if (!result) { + count = queryUniqueTyped("replaceRecorderPersonInScientificCruise", "id", IntegerType.INSTANCE, id); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceRecorderPersonInFishingTrip", "id", IntegerType.INSTANCE, id); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replacePersonInVesselPersonFeatures", "id", IntegerType.INSTANCE, id); + result = count > 0; + } + + return result; + } + + @Override + public boolean isTemporarySpeciesUsed(Integer id) { + Long count = queryUniqueTyped("countReferenceTaxonInSortingBatch", "id", IntegerType.INSTANCE, id); + boolean result = count > 0; + + if (!result) { + count = queryUniqueTyped("countReferenceTaxonInSample", "id", IntegerType.INSTANCE, id); + result = count > 0; + } + return result; + } + + @Override + public boolean isTemporaryGearUsed(Integer id) { + Long count = queryUniqueTyped("replaceGearInGearPhysicalFeatures", "id", IntegerType.INSTANCE, id); + boolean result = count > 0; + + if (!result) { + count = queryUniqueTyped("replaceGearInGearUseFeatures", "id", IntegerType.INSTANCE, id); + result = count > 0; + } + return result; + } + + @Override + public boolean isTemporaryVesselUsed(String code) { + Long count = queryUniqueTyped("replaceVesselInCruise", "id", StringType.INSTANCE, code); + boolean result = count > 0; + + if (!result) { + count = queryUniqueTyped("replaceVesselInFishingOperation", "id", StringType.INSTANCE, code); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceVesselInOperationVesselAssociation", "id", StringType.INSTANCE, code); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceVesselInDailyActivityCalendar", "id", StringType.INSTANCE, code); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceVesselInLanding", "id", StringType.INSTANCE, code); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceVesselInFishingtrip", "id", StringType.INSTANCE, code); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceVesselInVesselUseFeatures", "id", StringType.INSTANCE, code); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceVesselInGearUseFeatures", "id", StringType.INSTANCE, code); + result = count > 0; + } + + if (!result) { + count = queryUniqueTyped("replaceVesselInGearPhysicalFeatures", "id", StringType.INSTANCE, code); + result = count > 0; + } + + return result; + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// diff --git a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml index b5f412b..80cb2b4 100644 --- a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml +++ b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml @@ -680,6 +680,42 @@ <query-param name="targetId" type="java.lang.Integer"/> </query> + <query cacheable="true" name="countManagerPersonInScientificCruise"> + <![CDATA[ + SELECT count(*) + FROM ScientificCruiseImpl sc + WHERE sc.managerPerson.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + + <query cacheable="true" name="countRecorderPersonInScientificCruise"> + <![CDATA[ + SELECT count(*) + FROM ScientificCruiseImpl sc + WHERE sc.recorderPerson.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + + <query cacheable="true" name="countRecorderPersonInFishingTrip"> + <![CDATA[ + SELECT count(*) + FROM FishingTripImpl ft + WHERE ft.recorderPerson.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + + <query cacheable="true" name="countPersonInVesselPersonFeatures"> + <![CDATA[ + SELECT count(*) + FROM VesselPersonFeaturesImpl vpf + WHERE vpf.person.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + <query cacheable="true" name="replaceGearInGearPhysicalFeatures"> <![CDATA[ UPDATE GearPhysicalFeaturesImpl gpf @@ -700,6 +736,24 @@ <query-param name="targetId" type="java.lang.Integer"/> </query> + <query cacheable="true" name="countGearInGearPhysicalFeatures"> + <![CDATA[ + SELECT count(*) + FROM GearPhysicalFeaturesImpl gpf + WHERE gpf.gear.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + + <query cacheable="true" name="countGearInGearUseFeatures"> + <![CDATA[ + SELECT count(*) + FROM GearUseFeaturesImpl gpf + WHERE gpf.gear.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + <query cacheable="true" name="getReferenceTaxonInSortingBatch"> <![CDATA[ Select b.id From BatchImpl b @@ -738,6 +792,24 @@ <query-param name="targetId" type="java.lang.Integer"/> </query> + <query cacheable="true" name="countReferenceTaxonInSortingBatch"> + <![CDATA[ + SELECT count(*) + FROM BatchImpl b + WHERE b.referenceTaxon.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + + <query cacheable="true" name="countReferenceTaxonInSample"> + <![CDATA[ + SELECT count(*) + FROM SampleImpl s + WHERE s.referenceTaxon.id = :id + ]]> + <query-param name="id" type="java.lang.Integer"/> + </query> + <query cacheable="true" name="replaceVesselInCruise"> <![CDATA[ UPDATE ScientificCruiseImpl sc @@ -828,6 +900,87 @@ <query-param name="targetId" type="java.lang.String"/> </query> + <query cacheable="true" name="countVesselInCruise"> + <![CDATA[ + SELECT count(*) + FROM ScientificCruiseImpl sc + WHERE sc.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query cacheable="true" name="countVesselInOperationVesselAssociation"> + <![CDATA[ + SELECT count(*) + FROM OperationVesselAssociationImpl va + WHERE va.operationVesselAssociationPk.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query cacheable="true" name="countVesselInFishingOperation"> + <![CDATA[ + SELECT count(*) + FROM FishingOperationImpl fo + WHERE fo.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query name="countVesselInDailyActivityCalendar"> + <![CDATA[ + SELECT count(*) + FROM DailyActivityCalendarImpl ac + WHERE ac.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query name="countVesselInLanding"> + <![CDATA[ + SELECT count(*) + FROM LandingImpl l + WHERE l.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query name="countVesselInFishingtrip"> + <![CDATA[ + SELECT count(*) + FROM FishingTripImpl ft + WHERE ft.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query name="countVesselInVesselUseFeatures"> + <![CDATA[ + SELECT count(*) + FROM VesselUseFeaturesImpl vuf + WHERE vuf.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query name="countVesselInGearUseFeatures"> + <![CDATA[ + SELECT count(*) + FROM GearUseFeaturesImpl guf + WHERE guf.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + + <query name="countVesselInGearPhysicalFeatures"> + <![CDATA[ + SELECT count(*) + FROM GearPhysicalFeaturesImpl gpf + WHERE gpf.vessel.code = :id + ]]> + <query-param name="id" type="java.lang.String"/> + </query> + <!-- ===================================================================== --> <!-- === Requete techniques sur référentiels [REF-TXXX] === --> <!-- ===================================================================== --> diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java index 3e3b874..86700fb 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java @@ -992,20 +992,60 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer } @Override + public void deleteTemporaryGears(Collection<Integer> id, boolean checkIfUsed) { + driver.deleteTemporaryGears(id, checkIfUsed); + } + + @Override public void deleteTemporarySpecies(Integer id, boolean checkIfUsed) { driver.deleteTemporarySpecies(id, checkIfUsed); } @Override + public void deleteTemporarySpecies(Collection<Integer> ids, boolean checkIfUsed) { + driver.deleteTemporarySpecies(ids, checkIfUsed); + } + + @Override public void deleteTemporaryPerson(Integer id, boolean checkIfUsed) { driver.deleteTemporaryPerson(id, checkIfUsed); } @Override + public void deleteTemporaryPersons(Collection<Integer> ids, boolean checkIfUsed) { + driver.deleteTemporaryPersons(ids, checkIfUsed); + } + + @Override public void deleteTemporaryVessel(String code, boolean checkIfUsed) { driver.deleteTemporaryVessel(code, checkIfUsed); } + @Override + public void deleteTemporaryVessels(Collection<String> codes, boolean checkIfUsed) { + driver.deleteTemporaryVessels(codes, checkIfUsed); + } + + @Override + public boolean isTemporaryPersonUsed(Integer id) { + return driver.isTemporaryPersonUsed(id); + } + + @Override + public boolean isTemporarySpeciesUsed(Integer id) { + return driver.isTemporarySpeciesUsed(id); + } + + @Override + public boolean isTemporaryGearUsed(Integer id) { + return driver.isTemporaryGearUsed(id); + } + + @Override + public boolean isTemporaryVesselUsed(String code) { + return driver.isTemporaryVesselUsed(code); + } + //------------------------------------------------------------------------// //-- Attachment methods --// //------------------------------------------------------------------------// diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearModel.java index cef5773..64a9e8d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearModel.java @@ -40,14 +40,14 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -public class GearModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Gear> { +public class GearModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<GearRow> { - public GearModel(char separator, Set<String> existingGearName) { + public GearModel(char separator) { super(separator); // import definition - newMandatoryColumn(Gear.PROPERTY_ID, Gear.PROPERTY_ID_AS_INT, new Common.IntegerParserFormatter(null, true) { + newMandatoryColumn(GearRow.PROPERTY_ID, GearRow.PROPERTY_ID_AS_INT, new Common.IntegerParserFormatter(null, true) { @Override public Integer parse(String value) throws ParseException { @@ -68,21 +68,23 @@ public class GearModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Gear> } }); - newNotExistingValueColumn(Gear.PROPERTY_NAME, existingGearName, n("tutti.service.referential.import.gear.existingName.error")); - newMandatoryColumn(Gear.PROPERTY_LABEL); - newMandatoryColumn(Gear.PROPERTY_SCIENTIFIC_GEAR, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(GearRow.PROPERTY_NAME); + newMandatoryColumn(GearRow.PROPERTY_LABEL); + newMandatoryColumn(GearRow.PROPERTY_SCIENTIFIC_GEAR, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(GearRow.PROPERTY_TO_DELETE, TuttiCsvUtil.BOOLEAN); // export definition - newColumnForExport(Gear.PROPERTY_ID); - newColumnForExport(Gear.PROPERTY_NAME); - newColumnForExport(Gear.PROPERTY_LABEL); - newColumnForExport(Gear.PROPERTY_SCIENTIFIC_GEAR, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(GearRow.PROPERTY_ID); + newColumnForExport(GearRow.PROPERTY_NAME); + newColumnForExport(GearRow.PROPERTY_LABEL); + newColumnForExport(GearRow.PROPERTY_SCIENTIFIC_GEAR, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(GearRow.PROPERTY_TO_DELETE); } @Override - public Gear newEmptyInstance() { - return Gears.newGear(); + public GearRow newEmptyInstance() { + return new GearRow(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearRow.java new file mode 100644 index 0000000..1c35d5d --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearRow.java @@ -0,0 +1,37 @@ +package fr.ifremer.tutti.service.referential; + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.GearBean; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class GearRow extends GearBean { + + public static final String PROPERTY_TO_DELETE = "toDelete"; + + protected Boolean toDelete; + + public GearRow() { + super(); + } + + public GearRow(Gear gear) { + super(); + Preconditions.checkNotNull(gear); + setId(gear.getId()); + setName(gear.getName()); + setLabel(gear.getLabel()); + setScientificGear(gear.isScientificGear()); + } + + public Boolean getToDelete() { + return toDelete; + } + + public void setToDelete(Boolean toDelete) { + this.toDelete = toDelete; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonModel.java index 80b4530..a5a4d7b 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonModel.java @@ -37,14 +37,14 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -public class PersonModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Person> { +public class PersonModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<PersonRow> { public PersonModel(char separator) { super(separator); // import definition - newMandatoryColumn(Person.PROPERTY_ID, Person.PROPERTY_ID_AS_INT, new Common.IntegerParserFormatter(null, true) { + newMandatoryColumn(PersonRow.PROPERTY_ID, PersonRow.PROPERTY_ID_AS_INT, new Common.IntegerParserFormatter(null, true) { @Override public Integer parse(String value) throws ParseException { @@ -65,19 +65,21 @@ public class PersonModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Per } }); - newMandatoryColumn(Person.PROPERTY_FIRST_NAME); - newMandatoryColumn(Person.PROPERTY_LAST_NAME); + newMandatoryColumn(PersonRow.PROPERTY_FIRST_NAME); + newMandatoryColumn(PersonRow.PROPERTY_LAST_NAME); + newMandatoryColumn(PersonRow.PROPERTY_TO_DELETE, TuttiCsvUtil.BOOLEAN); // export definition - newColumnForExport(Person.PROPERTY_ID); - newColumnForExport(Person.PROPERTY_FIRST_NAME); - newColumnForExport(Person.PROPERTY_LAST_NAME); + newColumnForExport(PersonRow.PROPERTY_ID); + newColumnForExport(PersonRow.PROPERTY_FIRST_NAME); + newColumnForExport(PersonRow.PROPERTY_LAST_NAME); + newColumnForExport(PersonRow.PROPERTY_TO_DELETE); } @Override - public Person newEmptyInstance() { - return Persons.newPerson(); + public PersonRow newEmptyInstance() { + return new PersonRow(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonRow.java new file mode 100644 index 0000000..8bc69e4 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonRow.java @@ -0,0 +1,36 @@ +package fr.ifremer.tutti.service.referential; + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.PersonBean; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class PersonRow extends PersonBean { + + public static final String PROPERTY_TO_DELETE = "toDelete"; + + protected Boolean toDelete; + + public PersonRow() { + super(); + } + + public PersonRow(Person person) { + super(); + Preconditions.checkNotNull(person); + setId(person.getId()); + setFirstName(person.getFirstName()); + setLastName(person.getLastName()); + } + + public Boolean getToDelete() { + return toDelete; + } + + public void setToDelete(Boolean toDelete) { + this.toDelete = toDelete; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialExportService.java index 1e69ee9..a4e4853 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/ReferentialExportService.java @@ -23,6 +23,7 @@ package fr.ifremer.tutti.service.referential; */ import com.google.common.base.Charsets; +import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.common.io.Files; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -97,11 +98,19 @@ public class ReferentialExportService extends AbstractTuttiService { protected void exportTemporarySpecies(File file, List<Species> toExport) throws IOException { - SpeciesModel csvModel = new SpeciesModel(getCsvSeparator(), null); + SpeciesModel csvModel = new SpeciesModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<SpeciesRow> toExportRows = Lists.transform(toExport, new Function<Species, SpeciesRow>() { + @Override + public SpeciesRow apply(Species species) { + return new SpeciesRow(species); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { @@ -164,8 +173,16 @@ public class ReferentialExportService extends AbstractTuttiService { VesselModel csvModel = new VesselModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<VesselRow> toExportRows = Lists.transform(toExport, new Function<Vessel, VesselRow>() { + @Override + public VesselRow apply(Vessel vessel) { + return new VesselRow(vessel); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { @@ -217,8 +234,16 @@ public class ReferentialExportService extends AbstractTuttiService { PersonModel csvModel = new PersonModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<PersonRow> toExportRows = Lists.transform(toExport, new Function<Person, PersonRow>() { + @Override + public PersonRow apply(Person person) { + return new PersonRow(person); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { @@ -274,11 +299,19 @@ public class ReferentialExportService extends AbstractTuttiService { protected void exportTemporaryGear(File file, List<Gear> toExport) throws IOException { - GearModel csvModel = new GearModel(getCsvSeparator(), null); + GearModel csvModel = new GearModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<GearRow> toExportRows = Lists.transform(toExport, new Function<Gear, GearRow>() { + @Override + public GearRow apply(Gear gear) { + return new GearRow(gear); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { 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 7f58bed..4c34d4e 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 @@ -41,18 +41,20 @@ import fr.ifremer.tutti.service.AbstractTuttiService; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiServiceContext; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Export; import org.nuiton.csv.Import; import org.nuiton.csv.ImportRuntimeException; import org.nuiton.jaxx.application.ApplicationTechnicalException; -import org.springframework.dao.DataRetrievalFailureException; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.io.Reader; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -88,34 +90,53 @@ public class ReferentialImportService extends AbstractTuttiService { List<Species> allSpecies = persistenceService.getAllSpecies(); // get all species names - Set<String> existingSpeciesName = Sets.newHashSet(Iterables.transform(allSpecies, new Function<Species, String>() { + Set<String> existingSpeciesNames = Sets.newHashSet(Iterables.transform(allSpecies, new Function<Species, String>() { @Override public String apply(Species input) { return input.getName(); } })); - List<String> existingSpeciesIds = TuttiEntities.toIds(allSpecies); + Set<Integer> existingSpeciesIds = new HashSet<>(TuttiEntities.toIntegerIds(allSpecies)); List<Species> toImport = Lists.newArrayList(); + List<Integer> toDelete = Lists.newArrayList(); Reader reader = Files.newReader(file, Charsets.UTF_8); - SpeciesModel csvModel = new SpeciesModel(getCsvSeparator(), existingSpeciesName); + SpeciesModel csvModel = new SpeciesModel(getCsvSeparator()); try { - Import<Species> importer = Import.newImport(csvModel, reader); + Import<SpeciesRow> importer = Import.newImport(csvModel, reader); try { - for (Species bean : importer) { + for (SpeciesRow bean : importer) { - String id = bean.getId(); - if (id != null && !existingSpeciesIds.add(id)) { + Integer id = bean.getIdAsInt(); + String name = bean.getName(); + boolean delete = BooleanUtils.isTrue(bean.getToDelete()); + + if (id != null && existingSpeciesIds.add(id)) { throw new IllegalArgumentException(t("tutti.service.referential.import.species.notExistingId.error", id)); + + } else if (StringUtils.isBlank(name)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.species.noName.error", id)); + + } else if (!delete && !existingSpeciesNames.add(name)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.species.existingName.error", name)); } - toImport.add(bean); + if (delete) { + if (persistenceService.isTemporarySpeciesUsed(id)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.species.used.error", id)); + } + toDelete.add(id); + + } else { + toImport.add(bean); + } } importer.close(); + } finally { IOUtils.closeQuietly(importer); } @@ -138,7 +159,10 @@ public class ReferentialImportService extends AbstractTuttiService { IOUtils.closeQuietly(reader); } + persistenceService.deleteTemporarySpecies(toDelete, true); + List<Species> result = persistenceService.importTemporarySpecies(toImport); + return result; } @@ -162,17 +186,19 @@ public class ReferentialImportService extends AbstractTuttiService { Lists.transform(existingVessels, vesselToId)); List<Vessel> toImport = Lists.newArrayList(); + List<String> toDelete = Lists.newArrayList(); Reader reader = Files.newReader(file, Charsets.UTF_8); VesselModel csvModel = new VesselModel(getCsvSeparator()); try { - Import<Vessel> importer = Import.newImport(csvModel, reader); + Import<VesselRow> importer = Import.newImport(csvModel, reader); try { - for (final Vessel bean : importer) { + for (final VesselRow bean : importer) { String currentId = vesselToId.apply(bean); + boolean delete = BooleanUtils.isTrue(bean.getToDelete()); if (!existingIds.add(currentId)) { @@ -182,21 +208,45 @@ public class ReferentialImportService extends AbstractTuttiService { bean.getName(), bean.getInternationalRegistrationCode())); } - toImport.add(bean); + + if (delete) { + if (persistenceService.isTemporaryVesselUsed(currentId)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.vessel.used.error", currentId)); + } + toDelete.add(currentId); + + } else { + toImport.add(bean); + } } importer.close(); + } finally { IOUtils.closeQuietly(importer); } reader.close(); + } catch (IOException e) { throw new IOException(t("tutti.service.referential.import.vessels.error", file), e); + + } catch (ImportRuntimeException e) { + String message; + if (e.getCause() != null) { + message = e.getCause().getMessage(); + } else { + message = e.getMessage(); + } + throw new ApplicationTechnicalException(message, e); + } finally { IOUtils.closeQuietly(reader); } - List<Vessel> result = - persistenceService.importTemporaryVessel(toImport); + + persistenceService.deleteTemporaryVessels(toDelete, true); + + List<Vessel> result = persistenceService.importTemporaryVessel(toImport); + return result; } @@ -206,25 +256,38 @@ public class ReferentialImportService extends AbstractTuttiService { } List<Person> allPersons = persistenceService.getAllPerson(); - List<String> existingPersonIds = TuttiEntities.toIds(allPersons); + + Set<Integer> existingPersonIds = new HashSet<>(TuttiEntities.toIntegerIds(allPersons)); List<Person> toImport = Lists.newArrayList(); + List<Integer> toDelete = Lists.newArrayList(); Reader reader = Files.newReader(file, Charsets.UTF_8); PersonModel csvModel = new PersonModel(getCsvSeparator()); try { - Import<Person> importer = Import.newImport(csvModel, reader); + Import<PersonRow> importer = Import.newImport(csvModel, reader); try { - for (Person bean : importer) { + for (PersonRow bean : importer) { - String id = bean.getId(); - if (id != null && !existingPersonIds.add(id)) { + Integer id = bean.getIdAsInt(); + String name = bean.getName(); + boolean delete = BooleanUtils.isTrue(bean.getToDelete()); + + if (id != null && existingPersonIds.add(id)) { throw new IllegalArgumentException(t("tutti.service.referential.import.person.notExistingId.error", id)); } - toImport.add(bean); + if (delete) { + if (persistenceService.isTemporaryPersonUsed(id)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.person.used.error", id)); + } + toDelete.add(id); + + } else { + toImport.add(bean); + } } importer.close(); @@ -235,12 +298,25 @@ public class ReferentialImportService extends AbstractTuttiService { } catch (IOException e) { throw new IOException(t("tutti.service.referential.import.persons.error", file), e); + + } catch (ImportRuntimeException e) { + String message; + if (e.getCause() != null) { + message = e.getCause().getMessage(); + } else { + message = e.getMessage(); + } + throw new ApplicationTechnicalException(message, e); + } finally { IOUtils.closeQuietly(reader); } - List<Person> result = - persistenceService.importTemporaryPerson(toImport); + + persistenceService.deleteTemporaryPersons(toDelete, true); + + List<Person> result = persistenceService.importTemporaryPerson(toImport); + return result; } @@ -250,56 +326,61 @@ public class ReferentialImportService extends AbstractTuttiService { } // get all vessel names - Set<String> existingGearName = Sets.newHashSet(Iterables.transform(persistenceService.getAllFishingGear(), new Function<Gear, String>() { - @Override - public String apply(Gear input) { - return input.getName(); - } - })); + List<Gear> allGears = new ArrayList<>(persistenceService.getAllFishingGear()); + allGears.addAll(persistenceService.getAllScientificGear()); - existingGearName.addAll(Lists.transform(persistenceService.getAllScientificGear(), new Function<Gear, String>() { + Set<String> existingGearNames = Sets.newHashSet(Iterables.transform(allGears, new Function<Gear, String>() { @Override public String apply(Gear input) { return input.getName(); } })); - Set<String> existingGearIds = Sets.newHashSet(Iterables.transform(persistenceService.getAllFishingGear(), new Function<Gear, String>() { - @Override - public String apply(Gear input) { - return input.getId(); - } - })); - - existingGearIds.addAll(Lists.transform(persistenceService.getAllScientificGear(), new Function<Gear, String>() { - @Override - public String apply(Gear input) { - return input.getId(); - } - })); + Set<Integer> existingGearIds = new HashSet<>(TuttiEntities.toIntegerIds(allGears)); List<Gear> toImport = Lists.newArrayList(); + List<Integer> toDelete = Lists.newArrayList(); Reader reader = Files.newReader(file, Charsets.UTF_8); - GearModel csvModel = new GearModel(getCsvSeparator(), existingGearName); + GearModel csvModel = new GearModel(getCsvSeparator()); try { - Import<Gear> importer = Import.newImport(csvModel, reader); + Import<GearRow> importer = Import.newImport(csvModel, reader); try { - for (Gear bean : importer) { - String id = bean.getId(); - if (id != null && !existingGearIds.add(id)) { + for (GearRow bean : importer) { + + Integer id = bean.getIdAsInt(); + String name = bean.getName(); + boolean delete = BooleanUtils.isTrue(bean.getToDelete()); + + if (id != null && existingGearIds.add(id)) { throw new IllegalArgumentException(t("tutti.service.referential.import.gear.notExistingId.error", id)); + + } else if (StringUtils.isBlank(name)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.gear.noName.error", id)); + + } else if (!delete && !existingGearNames.add(name)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.gear.existingName.error", name)); } - toImport.add(bean); + if (delete) { + if (persistenceService.isTemporaryGearUsed(id)) { + throw new IllegalArgumentException(t("tutti.service.referential.import.species.used.error", id)); + } + toDelete.add(id); + + } else { + toImport.add(bean); + } } importer.close(); + } finally { IOUtils.closeQuietly(importer); } reader.close(); + } catch (IOException e) { throw new IOException(t("tutti.service.referential.import.gears.error", file), e); @@ -316,7 +397,11 @@ public class ReferentialImportService extends AbstractTuttiService { IOUtils.closeQuietly(reader); } + + persistenceService.deleteTemporaryGears(toDelete, true); + List<Gear> result = persistenceService.importTemporaryGear(toImport); + return result; } @@ -354,11 +439,19 @@ public class ReferentialImportService extends AbstractTuttiService { protected void exportTemporarySpecies(File file, List<Species> toExport) throws IOException { - SpeciesModel csvModel = new SpeciesModel(getCsvSeparator(), null); + SpeciesModel csvModel = new SpeciesModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<SpeciesRow> toExportRows = Lists.transform(toExport, new Function<Species, SpeciesRow>() { + @Override + public SpeciesRow apply(Species species) { + return new SpeciesRow(species); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { @@ -421,8 +514,16 @@ public class ReferentialImportService extends AbstractTuttiService { VesselModel csvModel = new VesselModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<VesselRow> toExportRows = Lists.transform(toExport, new Function<Vessel, VesselRow>() { + @Override + public VesselRow apply(Vessel vessel) { + return new VesselRow(vessel); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { @@ -474,8 +575,16 @@ public class ReferentialImportService extends AbstractTuttiService { PersonModel csvModel = new PersonModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<PersonRow> toExportRows = Lists.transform(toExport, new Function<Person, PersonRow>() { + @Override + public PersonRow apply(Person person) { + return new PersonRow(person); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { @@ -531,11 +640,19 @@ public class ReferentialImportService extends AbstractTuttiService { protected void exportTemporaryGear(File file, List<Gear> toExport) throws IOException { - GearModel csvModel = new GearModel(getCsvSeparator(), null); + GearModel csvModel = new GearModel(getCsvSeparator()); BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + + List<GearRow> toExportRows = Lists.transform(toExport, new Function<Gear, GearRow>() { + @Override + public GearRow apply(Gear gear) { + return new GearRow(gear); + } + }); + try { - Export export = Export.newExport(csvModel, toExport); + Export export = Export.newExport(csvModel, toExportRows); export.write(writer); writer.close(); } catch (IOException e) { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesModel.java index 80c271d..a602edf 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesModel.java @@ -43,14 +43,14 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -public class SpeciesModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Species> { +public class SpeciesModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<SpeciesRow> { - public SpeciesModel(char separator, Set<String> existingSpeciesName) { + public SpeciesModel(char separator) { super(separator); // import definition - newMandatoryColumn(Species.PROPERTY_ID, Species.PROPERTY_ID_AS_INT, new Common.IntegerParserFormatter(null, true) { + newMandatoryColumn(SpeciesRow.PROPERTY_ID, SpeciesRow.PROPERTY_ID_AS_INT, new Common.IntegerParserFormatter(null, true) { @Override public Integer parse(String value) throws ParseException { @@ -71,17 +71,19 @@ public class SpeciesModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Sp } }); - newNotExistingValueColumn(Species.PROPERTY_NAME, existingSpeciesName, n("tutti.service.referential.import.species.existingName.error")); + newMandatoryColumn(SpeciesRow.PROPERTY_NAME); + newMandatoryColumn(SpeciesRow.PROPERTY_TO_DELETE, TuttiCsvUtil.BOOLEAN); // export definition - newColumnForExport(Species.PROPERTY_ID); - newColumnForExport(Species.PROPERTY_NAME); + newColumnForExport(SpeciesRow.PROPERTY_ID); + newColumnForExport(SpeciesRow.PROPERTY_NAME); + newColumnForExport(SpeciesRow.PROPERTY_TO_DELETE); } @Override - public Species newEmptyInstance() { - return Speciess.newSpecies(); + public SpeciesRow newEmptyInstance() { + return new SpeciesRow(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesRow.java new file mode 100644 index 0000000..7d31e56 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesRow.java @@ -0,0 +1,35 @@ +package fr.ifremer.tutti.service.referential; + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.SpeciesBean; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class SpeciesRow extends SpeciesBean { + + public static final String PROPERTY_TO_DELETE = "toDelete"; + + protected Boolean toDelete; + + public SpeciesRow() { + super(); + } + + public SpeciesRow(Species species) { + super(); + Preconditions.checkNotNull(species); + setId(species.getId()); + setName(species.getName()); + } + + public Boolean getToDelete() { + return toDelete; + } + + public void setToDelete(Boolean toDelete) { + this.toDelete = toDelete; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselModel.java index a3f63d3..bdcc1c5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselModel.java @@ -37,14 +37,14 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -public class VesselModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Vessel> { +public class VesselModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<VesselRow> { public VesselModel(char separator) { super(separator); // import definition - newMandatoryColumn("id", Vessel.PROPERTY_REGISTRATION_CODE, new Common.StringValueParser() { + newMandatoryColumn(VesselRow.PROPERTY_ID, Vessel.PROPERTY_REGISTRATION_CODE, new Common.StringValueParser() { @Override public String parse(String value) { @@ -66,21 +66,23 @@ public class VesselModel extends TuttiCsvUtil.AbstractTuttiImportExportModel<Ves }); - newMandatoryColumn(Vessel.PROPERTY_NAME); - newMandatoryColumn(Vessel.PROPERTY_INTERNATIONAL_REGISTRATION_CODE); - newMandatoryColumn(Vessel.PROPERTY_SCIENTIFIC_VESSEL, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(VesselRow.PROPERTY_NAME); + newMandatoryColumn(VesselRow.PROPERTY_INTERNATIONAL_REGISTRATION_CODE); + newMandatoryColumn(VesselRow.PROPERTY_SCIENTIFIC_VESSEL, Common.PRIMITIVE_BOOLEAN); + newMandatoryColumn(VesselRow.PROPERTY_TO_DELETE, TuttiCsvUtil.BOOLEAN); // export definition - newColumnForExport("id", Vessel.PROPERTY_REGISTRATION_CODE); - newColumnForExport(Vessel.PROPERTY_NAME); - newColumnForExport(Vessel.PROPERTY_INTERNATIONAL_REGISTRATION_CODE); - newColumnForExport(Vessel.PROPERTY_SCIENTIFIC_VESSEL, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(VesselRow.PROPERTY_ID, Vessel.PROPERTY_REGISTRATION_CODE); + newColumnForExport(VesselRow.PROPERTY_NAME); + newColumnForExport(VesselRow.PROPERTY_INTERNATIONAL_REGISTRATION_CODE); + newColumnForExport(VesselRow.PROPERTY_SCIENTIFIC_VESSEL, Common.PRIMITIVE_BOOLEAN); + newColumnForExport(VesselRow.PROPERTY_TO_DELETE); } @Override - public Vessel newEmptyInstance() { - return Vessels.newVessel(); + public VesselRow newEmptyInstance() { + return new VesselRow(); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselRow.java new file mode 100644 index 0000000..7210e95 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselRow.java @@ -0,0 +1,38 @@ +package fr.ifremer.tutti.service.referential; + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.persistence.entities.referential.VesselBean; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class VesselRow extends VesselBean { + + public static final String PROPERTY_TO_DELETE = "toDelete"; + + protected Boolean toDelete; + + public VesselRow() { + super(); + } + + public VesselRow(Vessel vessel) { + super(); + Preconditions.checkNotNull(vessel); + setId(vessel.getId()); + setRegistrationCode(vessel.getRegistrationCode()); + setName(vessel.getName()); + setInternationalRegistrationCode(vessel.getInternationalRegistrationCode()); + setScientificVessel(vessel.isScientificVessel()); + } + + public Boolean getToDelete() { + return toDelete; + } + + public void setToDelete(Boolean toDelete) { + this.toDelete = toDelete; + } +} 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 22a326c..7280f5c 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 @@ -218,12 +218,22 @@ tutti.service.referential.export.person.error= tutti.service.referential.export.species.error= tutti.service.referential.export.vessel.error= tutti.service.referential.import.gear.existingName.error= +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.idNotNegative.error= +tutti.service.referential.import.person.notExistingId.error= +tutti.service.referential.import.person.used.error= tutti.service.referential.import.persons.error= tutti.service.referential.import.species.error= tutti.service.referential.import.species.existingName.error= tutti.service.referential.import.species.idNotNegative.error= +tutti.service.referential.import.species.noName.error= tutti.service.referential.import.species.notExistingId.error= +tutti.service.referential.import.species.used.error= +tutti.service.referential.import.vessel.codePrefixMissing.error= +tutti.service.referential.import.vessel.used.error= tutti.service.referential.import.vessels.error= tutti.service.referential.import.vessels.existingValue.error= tutti.service.sumatra.export.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 b7ed291..41648ed 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 @@ -198,12 +198,22 @@ tutti.service.referential.export.person.error=Erreur lors de l'export des person tutti.service.referential.export.species.error=Erreur lors de l'export des espèces dans le fichier %s tutti.service.referential.export.vessel.error=Erreur lors de l'export des navires dans le fichier %s tutti.service.referential.import.gear.existingName.error=L'engin '%2$s' n'a pas été ajouté au référentiel car il est déjà présent +tutti.service.referential.import.gear.idNotNegative.error=L'identifiant d'un engin temporaire doit être négatif \: %s +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.idNotNegative.error=L'identifiant d'une personne temporaire doit être négatif \: %s +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 tutti.service.referential.import.species.error=Erreur lors de l'import des espèces du fichier %s tutti.service.referential.import.species.existingName.error=L'espèce '%2$s' n'a pas été ajoutée au référentiel car elle est déjà présente -tutti.service.referential.import.species.idNotNegative.error=L'identifiant d'une espèce temporaire doit être négatif : %s +tutti.service.referential.import.species.idNotNegative.error=L'identifiant d'une espèce temporaire doit être négatif \: %s +tutti.service.referential.import.species.noName.error=Le nom pour l'espèce %s est obligatoire. tutti.service.referential.import.species.notExistingId.error=L'identifiant '%s' n'a pas été trouvé parmi les espèces temporaires +tutti.service.referential.import.species.used.error=L'espèce temporaire %s est utilisée dans l'application. Vous devez la rmeplacer avant de la supprimer. +tutti.service.referential.import.vessel.codePrefixMissing.error= +tutti.service.referential.import.vessel.used.error= tutti.service.referential.import.vessels.error=Erreur lors de l'import des navires du fichier %s tutti.service.referential.import.vessels.existingValue.error=Un navire avec le nom %1s et l'immatriculation %2s existe déjà dans le référentiel tutti.service.sumatra.export.error=Erreur lors de l'export Sumatra dans le fichier %s diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialExportServiceTest.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialExportServiceTest.java index c708391..4861779 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialExportServiceTest.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialExportServiceTest.java @@ -46,30 +46,30 @@ public class ReferentialExportServiceTest { protected File dataDirectory; private static final String SPECIES_FILE_CONTENT = - "id;name\n" + - ";Temporary Species name 1\n" + - ";Temporary Species name 2\n" + - ";Temporary Species name 3"; + "id;name;toDelete\n" + + ";Temporary Species name 1;\n" + + ";Temporary Species name 2;\n" + + ";Temporary Species name 3;"; private static final String GEAR_FILE_CONTENT = - "id;name;label;scientificGear\n" + - ";Gear fishing name 1;Gear fishing label 1;N\n" + - ";Gear fishing name 2;Gear fishing label 2;N\n" + - ";Gear scientific name 3;Gear scientific label 3;Y\n" + - ";Gear scientific name 4;Gear scientific label 4;Y"; + "id;name;label;scientificGear;toDelete\n" + + ";Gear fishing name 1;Gear fishing label 1;N;\n" + + ";Gear fishing name 2;Gear fishing label 2;N;\n" + + ";Gear scientific name 3;Gear scientific label 3;Y;\n" + + ";Gear scientific name 4;Gear scientific label 4;Y;"; private static final String PERSON_FILE_CONTENT = - "id;firstName;lastName\n" + - ";First name 1;Last name 1\n" + - ";First name 2;Last name 2\n" + - ";First name 3;Last name 3"; + "id;firstName;lastName;toDelete\n" + + ";First name 1;Last name 1;\n" + + ";First name 2;Last name 2;\n" + + ";First name 3;Last name 3;"; private static final String VESSEL_FILE_CONTENT = - "id;name;internationalRegistrationCode;scientificVessel\n" + - ";Temporary fishing vessel name 1;International registration code F1;N\n" + - ";Temporary fishing vessel name 2;International registration code F2;N\n" + - ";Temporary scientific vessel name 3;International registration code S3;Y\n" + - ";Temporary scientific vessel name 4;International registration code S4;Y"; + "id;name;internationalRegistrationCode;scientificVessel;toDelete\n" + + ";Temporary fishing vessel name 1;International registration code F1;N;\n" + + ";Temporary fishing vessel name 2;International registration code F2;N;\n" + + ";Temporary scientific vessel name 3;International registration code S3;Y;\n" + + ";Temporary scientific vessel name 4;International registration code S4;Y;"; protected ReferentialImportService service; diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialImportServiceTest.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialImportServiceTest.java index 8a70284..6c8c4ce 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialImportServiceTest.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/referential/ReferentialImportServiceTest.java @@ -24,10 +24,20 @@ package fr.ifremer.tutti.service.referential; import com.google.common.base.Charsets; import com.google.common.io.Files; +import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId; +import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.Cruises; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.FishingOperations; +import fr.ifremer.tutti.persistence.entities.data.Program; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchs; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.ServiceDbResource; import fr.ifremer.tutti.service.TuttiServiceContext; import org.junit.Assert; @@ -51,46 +61,99 @@ public class ReferentialImportServiceTest { protected File dataDirectory; + // SPECIES FILES + private static final String SPECIES_FILE_CONTENT = - "id;name\n" + - ";Temporary Species name 1\n" + - ";Temporary Species name 2\n" + - ";Temporary Species name 3"; + "id;name;toDelete\n" + + ";Temporary Species name 1;\n" + + ";Temporary Species name 2;\n" + + ";Temporary Species name 3;"; + + private static final String SPECIES_DUPLICATE_NAME_FILE_CONTENT = + "id;name;toDelete\n" + + ";Temporary Species name 1;\n" + + ";Temporary Species name 1;"; + + private static final String SPECIES_BLANK_NAME_FILE_CONTENT = + "id;name;toDelete\n" + + "; ;"; private static final String SPECIES_UPDATE_FILE_CONTENT = - "id;name\n" + - "-1;Temporary Species name 11"; + "id;name;toDelete\n" + + "-1;Temporary Species name 11;N\n" + + "-2;Temporary Species name 2;Y"; + + private static final String SPECIES_DELETE_USED_FILE_CONTENT = + "id;name;toDelete\n" + + "-1;Temporary Species name 11;Y"; + + // GEAR FILES private static final String GEAR_FILE_CONTENT = - "id;name;label;scientificGear\n" + - ";Gear fishing name 1;Gear fishing label 1;N\n" + - ";Gear fishing name 2;Gear fishing label 2;N\n" + - ";Gear scientific name 3;Gear scientific label 3;Y\n" + - ";Gear scientific name 4;Gear scientific label 4;Y"; + "id;name;label;scientificGear;toDelete\n" + + ";Gear fishing name 1;Gear fishing label 1;N;\n" + + ";Gear fishing name 2;Gear fishing label 2;N;\n" + + ";Gear scientific name 3;Gear scientific label 3;Y;\n" + + ";Gear scientific name 4;Gear scientific label 4;Y;"; + + private static final String GEAR_DUPLICATE_NAME_FILE_CONTENT = + "id;name;label;scientificGear;toDelete\n" + + ";Temporary Gear name 1;;;\n" + + ";Temporary Gear name 1;;;"; + + private static final String GEAR_BLANK_NAME_FILE_CONTENT = + "id;name;label;scientificGear;toDelete\n" + + "; ;;;"; + + private static final String GEAR_UPDATE_FILE_CONTENT = + "id;name;label;scientificGear;toDelete\n" + + "-1;Temporary Gear name 11;;N;N\n" + + "-2;Temporary Gear name 2;;;Y"; + + private static final String GEAR_DELETE_USED_FILE_CONTENT = + "id;name;label;scientificGear;toDelete\n" + + "-1;Temporary Gear name 11;;;Y"; + + // PERSON FILES private static final String PERSON_FILE_CONTENT = - "id;firstName;lastName\n" + - ";First name 1;Last name 1\n" + - ";First name 2;Last name 2\n" + - ";First name 3;Last name 3"; + "id;firstName;lastName;toDelete\n" + + ";First name 1;Last name 1;\n" + + ";First name 2;Last name 2;\n" + + ";First name 3;Last name 3;"; + + private static final String PERSON_UPDATE_FILE_CONTENT = + "id;firstName;lastName;toDelete\n" + + "-1;First name 11;Last name 11;N\n" + + "-2;;;Y"; + + private static final String PERSON_DELETE_USED_FILE_CONTENT = + "id;firstName;lastName;toDelete\n" + + "-1;First name 11;Last name 11;Y"; + + // VESSEL FILES private static final String VESSEL_FILE_CONTENT = - "id;name;internationalRegistrationCode;scientificVessel\n" + - ";Temporary fishing vessel name 1;International registration code F1;N\n" + - ";Temporary fishing vessel name 2;International registration code F2;N\n" + - ";Temporary scientific vessel name 3;International registration code S3;Y\n" + - ";Temporary scientific vessel name 4;International registration code S4;Y"; + "id;name;internationalRegistrationCode;scientificVessel;toDelete\n" + + ";Temporary fishing vessel name 1;International registration code F1;N;\n" + + ";Temporary fishing vessel name 2;International registration code F2;N;\n" + + ";Temporary scientific vessel name 3;International registration code S3;Y;\n" + + ";Temporary scientific vessel name 4;International registration code S4;Y;"; private static final String DUPLICATE_VESSEL_FILE_CONTENT = - "id;name;internationalRegistrationCode;scientificVessel\n" + - ";Temporary fishing vessel name 1;International registration code F1;N\n" + - ";Temporary fishing vessel name 1;International registration code F1;N\n" + - ";Temporary fishing vessel name 2;International registration code F2;N\n" + - ";Temporary scientific vessel name 3;International registration code S3;Y\n" + - ";Temporary scientific vessel name 4;International registration code S4;Y"; + "id;name;internationalRegistrationCode;scientificVessel;toDelete\n" + + ";Temporary fishing vessel name 1;International registration code F1;N;\n" + + ";Temporary fishing vessel name 1;International registration code F1;N;\n" + + ";Temporary fishing vessel name 2;International registration code F2;N;\n" + + ";Temporary scientific vessel name 3;International registration code S3;Y;\n" + + ";Temporary scientific vessel name 4;International registration code S4;Y;"; protected ReferentialImportService service; + protected PersistenceService persistenceService; + + public static final String OPERATION_1_ID = "100108"; + @Before public void setUp() throws Exception { @@ -101,6 +164,9 @@ public class ReferentialImportServiceTest { serviceContext.getConfig().setCsvSeparator(';'); service = serviceContext.getService(ReferentialImportService.class); + + persistenceService = serviceContext.getService(PersistenceService.class); + } @Test @@ -110,15 +176,6 @@ public class ReferentialImportServiceTest { Files.createParentDirs(file); - Files.write(SPECIES_UPDATE_FILE_CONTENT, file, Charsets.UTF_8); - // try to import not existing id - try { - service.importTemporarySpecies(file); - Assert.fail(); - } catch (ApplicationTechnicalException e) { - Assert.assertTrue(true); - } - // successful import Files.write(SPECIES_FILE_CONTENT, file, Charsets.UTF_8); @@ -136,11 +193,14 @@ public class ReferentialImportServiceTest { try { service.importTemporarySpecies(file); Assert.fail(); - } catch (ApplicationTechnicalException e) { + } catch (IllegalArgumentException | ApplicationTechnicalException e) { Assert.assertTrue(true); } - // try to update species with id -1 + // try to update species with id -1 and remove id -2 + Assert.assertNotNull(persistenceService.getSpeciesByReferenceTaxonId(-1)); + Assert.assertNotNull(persistenceService.getSpeciesByReferenceTaxonId(-2)); + Files.write(SPECIES_UPDATE_FILE_CONTENT, file, Charsets.UTF_8); result = service.importTemporarySpecies(file); Assert.assertNotNull(result); @@ -149,6 +209,75 @@ public class ReferentialImportServiceTest { Assert.assertNotNull(actual); Assert.assertEquals("-1", actual.getId()); Assert.assertEquals("Temporary Species name 11", actual.getName()); + + Assert.assertNull(persistenceService.getSpeciesByReferenceTaxonId(-2)); + + // try to delete used species +// SpeciesBatch batch = SpeciesBatchs.newSpeciesBatch(); +// batch.setSampleCategoryId(PmfmId.SORTED_UNSORTED.getValue()); +// batch.setSampleCategoryValue(persistenceService.getSortedUnsortedCaracteristic().getQualitativeValue(0)); +// batch.setFishingOperation(persistenceService.getFishingOperation(OPERATION_1_ID)); +// batch.setSpecies(persistenceService.getSpeciesByReferenceTaxonId(-1)); +// persistenceService.createSpeciesBatch(batch, null); +// +// Files.write(SPECIES_DELETE_USED_FILE_CONTENT, file, Charsets.UTF_8); +// try { +// service.importTemporarySpecies(file); +// Assert.fail(); +// } catch (IllegalArgumentException | ApplicationTechnicalException e) { +// Assert.assertTrue(true); +// } + + } + + @Test + public void importNotExistingIdTemporarySpecies() throws Exception { + + File file = new File(dataDirectory, "importSpecies.csv"); + + Files.createParentDirs(file); + + // try to import not existing id + Files.write(SPECIES_UPDATE_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporarySpecies(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } + } + + @Test + public void importBlankNameTemporarySpecies() throws Exception { + + File file = new File(dataDirectory, "importSpecies.csv"); + + Files.createParentDirs(file); + // try to import blank name + Files.write(SPECIES_BLANK_NAME_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporarySpecies(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } + } + + @Test + public void importDuplicateTemporarySpecies() throws Exception { + + File file = new File(dataDirectory, "importSpecies.csv"); + + Files.createParentDirs(file); + + // try to import duplicate names + Files.write(SPECIES_DUPLICATE_NAME_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporarySpecies(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } } @Test @@ -183,7 +312,7 @@ public class ReferentialImportServiceTest { try { service.importTemporaryVessel(file); Assert.fail(); - } catch (ApplicationTechnicalException e) { + } catch (IllegalArgumentException | ApplicationTechnicalException e) { Assert.assertTrue(true); } } @@ -199,7 +328,7 @@ public class ReferentialImportServiceTest { try { service.importTemporaryVessel(file); Assert.fail(); - } catch (ApplicationTechnicalException e) { + } catch (IllegalArgumentException | ApplicationTechnicalException e) { // good duplicate vessel } } @@ -212,6 +341,7 @@ public class ReferentialImportServiceTest { Files.write(PERSON_FILE_CONTENT, file, Charsets.UTF_8); + // successful import List<Person> result = service.importTemporaryPerson(file); Assert.assertNotNull(result); @@ -226,6 +356,23 @@ public class ReferentialImportServiceTest { } @Test + public void importNotExistingIdTemporaryPerson() throws Exception { + + File file = new File(dataDirectory, "importPerson.csv"); + + Files.createParentDirs(file); + + // try to import not existing id + Files.write(PERSON_UPDATE_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporaryPerson(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } + } + + @Test public void importTemporaryGear() throws Exception { File file = new File(dataDirectory, "importGear.csv"); @@ -255,4 +402,54 @@ public class ReferentialImportServiceTest { } } + @Test + public void importNotExistingIdTemporaryGear() throws Exception { + + File file = new File(dataDirectory, "importGear.csv"); + + Files.createParentDirs(file); + + // try to import not existing id + Files.write(GEAR_UPDATE_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporaryGear(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } + } + + @Test + public void importBlankNameTemporaryGear() throws Exception { + + File file = new File(dataDirectory, "importGear.csv"); + + Files.createParentDirs(file); + // try to import blank name + Files.write(GEAR_BLANK_NAME_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporaryGear(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } + } + + @Test + public void importDuplicateTemporaryGear() throws Exception { + + File file = new File(dataDirectory, "importGear.csv"); + + Files.createParentDirs(file); + + // try to import duplicate names + Files.write(GEAR_DUPLICATE_NAME_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporaryGear(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } + } + } 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 c301fa5..27bd660 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 @@ -1362,14 +1362,14 @@ tutti.main.title.nodb=Pas de base chargée tutti.main.title.selectedCruise=Campagne %s tutti.main.title.selectedProgram=Série de campagne %s tutti.main.title.selectedProtocol=Protocole %s -tutti.manageTemporaryReferential.action.chooseExistingReferentialGearFile.export= -tutti.manageTemporaryReferential.action.chooseExistingReferentialGearFile.export.success= -tutti.manageTemporaryReferential.action.chooseExistingReferentialPersonFile.export= -tutti.manageTemporaryReferential.action.chooseExistingReferentialPersonFile.export.success= -tutti.manageTemporaryReferential.action.chooseExistingReferentialSpeciesFile.export= -tutti.manageTemporaryReferential.action.chooseExistingReferentialSpeciesFile.export.success= -tutti.manageTemporaryReferential.action.chooseExistingReferentialVesselFile.export= -tutti.manageTemporaryReferential.action.chooseExistingReferentialVesselFile.export.success= +tutti.manageTemporaryReferential.action.chooseExistingReferentialGearFile.export=Exporter +tutti.manageTemporaryReferential.action.chooseExistingReferentialGearFile.export.success=Référentiel temporaire des engins existants exporté dans le fichier %s +tutti.manageTemporaryReferential.action.chooseExistingReferentialPersonFile.export=Exporter +tutti.manageTemporaryReferential.action.chooseExistingReferentialPersonFile.export.success=Référentiel temporaire des personnes existantes exporté dans le fichier %s +tutti.manageTemporaryReferential.action.chooseExistingReferentialSpeciesFile.export=Exporter +tutti.manageTemporaryReferential.action.chooseExistingReferentialSpeciesFile.export.success=Référentiel temporaire des espèces existantes exporté dans le fichier %s +tutti.manageTemporaryReferential.action.chooseExistingReferentialVesselFile.export=Exporter +tutti.manageTemporaryReferential.action.chooseExistingReferentialVesselFile.export.success=Référentiel temporaire des navires existants exporté dans le fichier %s tutti.manageTemporaryReferential.action.chooseReferentialGearFile.export=Exporter tutti.manageTemporaryReferential.action.chooseReferentialGearFile.export.success=Exemple de référentiel temporaire d'engins exporté dans le fichier %s tutti.manageTemporaryReferential.action.chooseReferentialGearFile.import=Importer -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.