This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit a78bd4e97e995e91b8df5908873bec7230d7d735 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Sep 11 11:09:27 2015 +0200 lever un execption en cas de modification concurent d'une entité siuvie en modif (refs #7470 #7520) --- .../service/ConcurrentModificationException.java | 26 +++++++++++++++ .../ird/observe/services/ObserveServiceTopia.java | 17 +++++++++- .../service/seine/TripSeineServiceTopiaTest.java | 38 ++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ConcurrentModificationException.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ConcurrentModificationException.java new file mode 100644 index 0000000..8d70181 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/ConcurrentModificationException.java @@ -0,0 +1,26 @@ +package fr.ird.observe.services.service; + +import java.util.Date; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class ConcurrentModificationException extends RuntimeException { + + protected final Date lastUpdate; + + protected final Date currentUpdate; + + public ConcurrentModificationException(Date lastUpdate, Date currentUpdate) { + this.lastUpdate = lastUpdate; + this.currentUpdate = currentUpdate; + } + + public Date getLastUpdate() { + return lastUpdate; + } + + public Date getCurrentUpdate() { + return currentUpdate; + } +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java index 38b7a4f..9353706 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java @@ -43,6 +43,7 @@ import fr.ird.observe.services.builder.EntityToReferentialReferenceDtoBuilder; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; +import fr.ird.observe.services.dto.FollowedUpdateDto; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.FormDtos; import fr.ird.observe.services.dto.IdDto; @@ -54,6 +55,7 @@ import fr.ird.observe.services.dto.ReferenceSetDto; import fr.ird.observe.services.dto.ReferenceSetDtos; import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.service.ConcurrentModificationException; import fr.ird.observe.services.service.DataNotFoundException; import fr.ird.observe.services.service.DataSourceService; import org.apache.commons.lang3.StringUtils; @@ -337,11 +339,24 @@ public class ObserveServiceTopia implements ObserveService { } else { - entity = loadEntity(dtoType, entityType, dto.getId()); } + if (FollowedUpdateEntity.class.isAssignableFrom(entityType) + && FollowedUpdateDto.class.isAssignableFrom(dtoType)) { + + Date lasUpdate = ((FollowedUpdateEntity) entity).getLastUpdate(); + Date currentUpdate = ((FollowedUpdateDto) dto).getLastUpdate(); + + if (! lasUpdate.equals(currentUpdate)) { + + throw new ConcurrentModificationException(lasUpdate, currentUpdate); + + } + + } + try (DtoToEntityBuilder<D, E> entityBuilder = DtoToEntityBuilder.create(dtoType, entityType, this)) { entityBuilder.build(dto, entity); diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTopiaTest.java index 13aea1b..f0aaf94 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTopiaTest.java @@ -37,6 +37,7 @@ import fr.ird.observe.services.dto.referential.VesselDto; import fr.ird.observe.services.dto.seine.TripSeineDto; import fr.ird.observe.services.dto.seine.TripSeineStubDto; import fr.ird.observe.services.service.AbstractServiceTopiaTest; +import fr.ird.observe.services.service.ConcurrentModificationException; import fr.ird.observe.services.service.ReferentialService; import org.junit.Assert; import org.junit.Test; @@ -354,6 +355,43 @@ public class TripSeineServiceTopiaTest extends AbstractServiceTopiaTest { } + @Test(expected = ConcurrentModificationException.class) + public void saveConcurrentTest() { + + FormDto<TripSeineDto> formDto = service.loadToEdit(TRIP_SEINE_ID_1); + + TripSeineDto tripSeineDto = formDto.getForm(); + + ReferenceSetDto<PersonDto> personRefs = formDto.getReferenceSetDto(PersonDto.class); + ReferenceSetDto<OceanDto> oceanRefs = formDto.getReferenceSetDto(OceanDto.class); + ReferenceSetDto<HarbourDto> harbourRefs = formDto.getReferenceSetDto(HarbourDto.class); + + tripSeineDto.setCaptain((ReferentialReferenceDto<PersonDto>) personRefs.getReference(0)); + tripSeineDto.setDataEntryOperator((ReferentialReferenceDto<PersonDto>) personRefs.getReference(2)); + + tripSeineDto.setOcean((ReferentialReferenceDto<OceanDto>) oceanRefs.getReference(0)); + + tripSeineDto.setDepartureHarbour((ReferentialReferenceDto<HarbourDto>) harbourRefs.getReference(0)); + tripSeineDto.setLandingHarbour((ReferentialReferenceDto<HarbourDto>) harbourRefs.getReference(1)); + + // première sauvegarde + service.save(formDto); + + tripSeineDto.setErsId("ersid"); + + tripSeineDto.setStartDate(DateUtil.createDate(24, 8, 2015)); + tripSeineDto.setEndDate(DateUtil.createDate(24, 9, 2015)); + + tripSeineDto.setFormsUrl("http://une.url.com/formulaire"); + tripSeineDto.setReportsUrl("http://une.url.com/rapport"); + + tripSeineDto.setComment("Un commentaire"); + + // la deuxième sauvegarde doit lever une ConcurrentModificationException + service.save(formDto); + + } + @Test public void deleteTest() { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.