[tutti] branch feature/5997 updated (28ddc93 -> a55bae9)
This is an automated email from the git hooks/post-receive script. New change to branch feature/5997 in repository tutti. See http://git.codelutin.com/tutti.git from 28ddc93 refs #5997 [IMPORT] Améliorer la gestion des référentiels temporaires new 81000e1 refs #5997 [IMPORT] Améliorer la gestion des référentiels temporaires new 174fbb1 refs #5997 [IMPORT] Améliorer la gestion des référentiels temporaires new a55bae9 fixes #5997 [IMPORT] Améliorer la gestion des référentiels temporaires The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit a55bae9625ed925970cc1e01fec21d273c71df20 Author: Kevin Morin <morin@codelutin.com> Date: Tue Oct 28 10:28:17 2014 +0100 fixes #5997 [IMPORT] Améliorer la gestion des référentiels temporaires commit 174fbb13706e4c5fbd489a151ab3a219907e9917 Author: Kevin Morin <morin@codelutin.com> Date: Mon Oct 27 17:29:24 2014 +0100 refs #5997 [IMPORT] Améliorer la gestion des référentiels temporaires 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 Summary of changes: .../tutti/persistence/TuttiPersistenceImpl.java | 40 +++ .../persistence/TuttiPersistenceNoDbImpl.java | 40 +++ .../service/ReferentialPersistenceService.java | 97 ++++++- .../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 | 282 ++++++++++++++++++--- .../replace/AbstractReplaceTemporaryUI.css | 7 + .../replace/AbstractReplaceTemporaryUI.jaxx | 7 + .../resources/i18n/tutti-ui-swing_en_GB.properties | 2 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 18 +- 24 files changed, 1206 insertions(+), 180 deletions(-) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/referential/GearRow.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/referential/PersonRow.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/referential/SpeciesRow.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/referential/VesselRow.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/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>.
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 174fbb13706e4c5fbd489a151ab3a219907e9917 Author: Kevin Morin <morin@codelutin.com> Date: Mon Oct 27 17:29:24 2014 +0100 refs #5997 [IMPORT] Améliorer la gestion des référentiels temporaires --- .../persistence/service/ReferentialPersistenceService.java | 14 +++++++++----- .../referential/replace/AbstractReplaceTemporaryUI.css | 7 +++++++ .../referential/replace/AbstractReplaceTemporaryUI.jaxx | 7 +++++++ .../main/resources/i18n/tutti-ui-swing_en_GB.properties | 2 ++ .../main/resources/i18n/tutti-ui-swing_fr_FR.properties | 2 ++ 5 files changed, 27 insertions(+), 5 deletions(-) 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 d7a2795..4bdcc19 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 @@ -326,7 +326,7 @@ public interface ReferentialPersistenceService extends TuttiPersistenceServiceIm * @since 3.6 */ @Transactional(readOnly = false) - @CacheEvict(value = "fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", allEntries = true) + @CacheEvict(value = {"fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", "gears"}, allEntries = true) void replaceGear(Gear source, Gear target, boolean delete); /** @@ -339,7 +339,9 @@ public interface ReferentialPersistenceService extends TuttiPersistenceServiceIm * @since 3.6 */ @Transactional(readOnly = false) - @CacheEvict(value = "fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", allEntries = true) + @CacheEvict(value = {"fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", + "species", "referentSpecies", "referentSpeciesById", "referentSpeciesByIdVernacular"}, + allEntries = true) void replaceSpecies(Species source, Species target, boolean delete); /** @@ -352,7 +354,8 @@ public interface ReferentialPersistenceService extends TuttiPersistenceServiceIm * @since 3.6 */ @Transactional(readOnly = false) - @CacheEvict(value = "fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", allEntries = true) + @CacheEvict(value = {"fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", "persons", "personById"}, + allEntries = true) void replacePerson(Person source, Person target, boolean delete); /** @@ -365,7 +368,8 @@ public interface ReferentialPersistenceService extends TuttiPersistenceServiceIm * @since 3.6 */ @Transactional(readOnly = false) - @CacheEvict(value = "fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", allEntries = true) + @CacheEvict(value = {"fr.ifremer.adagio.core.dao.data.batch.CatchBatchCache", "fishingVessels", "vesselByCode"}, + allEntries = true) void replaceVessel(Vessel source, Vessel target, boolean delete); /** @@ -382,7 +386,7 @@ public interface ReferentialPersistenceService extends TuttiPersistenceServiceIm /** * Delete the temporary gears with the given {@code idss}. * - * @param id ids of the gears to remove + * @param ids ids of the gears to remove * @param checkIfUsed to check if gear is used before trying to delete it * @since 3.8 */ diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.css index de63f29..82bcf0c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.css @@ -59,6 +59,13 @@ BeanFilterableComboBox { _help: {"tutti.replaceTemporaryReferential.field.targetList.help"}; } +#deleteCheckBox { + text: "tutti.replaceTemporaryReferential.field.delete"; + selected: {model.isDelete()}; + toolTipText: "tutti.replaceTemporaryReferential.field.delete.tip"; + _help: {"tutti.replaceTemporaryReferential.field.delete.help"}; +} + #replaceButton { actionIcon: replace; text: "tutti.replaceTemporaryReferential.action.replace"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.jaxx index f9c0e40..18e8810 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/referential/replace/AbstractReplaceTemporaryUI.jaxx @@ -71,6 +71,13 @@ </row> <row> + <cell anchor="west" fill="both" columns="2"> + <JCheckBox id='deleteCheckBox' + onItemStateChanged='model.setDelete(event.getStateChange() == ItemEvent.SELECTED)'/> + </cell> + </row> + + <row> <cell columns='2' fill='both'> <JSeparator/> </cell> diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index afb9155..6fa540a 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1552,6 +1552,8 @@ tutti.replaceTemporaryReferential.action.cancel.tip= tutti.replaceTemporaryReferential.action.replace= tutti.replaceTemporaryReferential.action.replace.mnemonic= tutti.replaceTemporaryReferential.action.replace.tip= +tutti.replaceTemporaryReferential.field.delete= +tutti.replaceTemporaryReferential.field.delete.tip= tutti.replaceTemporaryReferential.field.sourceList= tutti.replaceTemporaryReferential.field.sourceList.tip= tutti.replaceTemporaryReferential.field.targetList= 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 27bd660..19aeef0 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 @@ -1487,6 +1487,8 @@ tutti.replaceTemporaryReferential.action.cancel.tip=Annuler le remplacement tutti.replaceTemporaryReferential.action.replace=Remplacer tutti.replaceTemporaryReferential.action.replace.mnemonic=R tutti.replaceTemporaryReferential.action.replace.tip=Remplacer le référentiel temporaire sélectionné +tutti.replaceTemporaryReferential.field.delete=Supprimer la donnée temporaire après le remplacement +tutti.replaceTemporaryReferential.field.delete.tip=Supprimer la donnée temporaire après le remplacement tutti.replaceTemporaryReferential.field.sourceList=Référentiel temporaire tutti.replaceTemporaryReferential.field.sourceList.tip=Sélectionner le référentiel temporaire à remplacer tutti.replaceTemporaryReferential.field.targetList=Référentiel officiel -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/5997 in repository tutti. See http://git.codelutin.com/tutti.git commit a55bae9625ed925970cc1e01fec21d273c71df20 Author: Kevin Morin <morin@codelutin.com> Date: Tue Oct 28 10:28:17 2014 +0100 fixes #5997 [IMPORT] Améliorer la gestion des référentiels temporaires --- .../referential/ReferentialImportServiceTest.java | 35 ++++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) 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 6c8c4ce..e598395 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 @@ -56,8 +56,7 @@ import java.util.List; public class ReferentialImportServiceTest { @ClassRule - public static final ServiceDbResource dbResource = - ServiceDbResource.writeDb("dbCGFS"); + public static final ServiceDbResource dbResource = ServiceDbResource.writeDb("dbCGFS"); protected File dataDirectory; @@ -213,20 +212,18 @@ public class ReferentialImportServiceTest { 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); -// } + SpeciesBatch batch = persistenceService.getRootSpeciesBatch(OPERATION_1_ID, false).getChildren().get(0); + batch.setFishingOperation(persistenceService.getFishingOperation(OPERATION_1_ID)); + batch.setSpecies(persistenceService.getSpeciesByReferenceTaxonId(-1)); + persistenceService.saveSpeciesBatch(batch); + + Files.write(SPECIES_DELETE_USED_FILE_CONTENT, file, Charsets.UTF_8); + try { + service.importTemporarySpecies(file); + Assert.fail(); + } catch (IllegalArgumentException | ApplicationTechnicalException e) { + Assert.assertTrue(true); + } } @@ -315,6 +312,8 @@ public class ReferentialImportServiceTest { } catch (IllegalArgumentException | ApplicationTechnicalException e) { Assert.assertTrue(true); } + + // TODO test to replace a used vessel } @Test @@ -353,6 +352,8 @@ public class ReferentialImportServiceTest { Assert.assertEquals("First name " + i, actual.getFirstName()); Assert.assertEquals("Last name " + i, actual.getLastName()); } + + // TODO test to replace a used person } @Test @@ -400,6 +401,8 @@ public class ReferentialImportServiceTest { Assert.assertEquals("Gear scientific label " + i, actual.getLabel()); Assert.assertTrue(actual.isScientificGear()); } + + // TODO test to replace a used gear } @Test -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm