This is an automated email from the git hooks/post-receive script. New commit to branch feature/refactor_reference in repository tutti. See http://git.codelutin.com/tutti.git commit bb2dd28dd8fa60bf1c9af051e0924b7c665c4e16 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Nov 28 09:41:59 2015 +0100 Mise en place du ReferenceBinderEngine --- .../dto/reference/ReferenceBinderEngine.java | 22 +++++++ .../reference/ReferenceBinderEngineSupplier.java | 41 ++++++++++++ .../ird/observe/services/binder/BinderEngine.java | 72 +++++++++++++++++++--- .../services/binder/BinderEngineInitializer.java | 18 +++--- .../binder/ReferenceBinderEngineSupplierTopia.java | 18 ++++++ .../services/binder/data/SetLonglineBinder.java | 16 +++++ ...ces.dto.reference.ReferenceBinderEngineSupplier | 1 + .../services/binder/ReferenceBinderEngineTest.java | 25 ++++++++ 8 files changed, 197 insertions(+), 16 deletions(-) diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ReferenceBinderEngine.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ReferenceBinderEngine.java new file mode 100644 index 0000000..624b7b6 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ReferenceBinderEngine.java @@ -0,0 +1,22 @@ +package fr.ird.observe.services.dto.reference; + +import fr.ird.observe.services.dto.DataDto; +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.constants.ReferentialLocale; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +/** + * Pour transformer des dto en références. + * + * Created on 28/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ReferenceBinderEngine { + + <D extends ReferentialDto> ReferentialReference<D> transformReferentialDtoToReference(ReferentialLocale referentialLocale, D dto); + + <D extends DataDto> DataReference<D> transformDataDtoToReference(ReferentialLocale referentialLocale, D dto); + +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ReferenceBinderEngineSupplier.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ReferenceBinderEngineSupplier.java new file mode 100644 index 0000000..f80a4e6 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/reference/ReferenceBinderEngineSupplier.java @@ -0,0 +1,41 @@ +package fr.ird.observe.services.dto.reference; + +import com.google.common.base.Supplier; + +import java.util.Iterator; +import java.util.ServiceLoader; + +/** + * Pour récupérer une instance d'un {@link ReferenceBinderEngine}. + * + * On utilise un {@link ServiceLoader} pour récupérer une instance car l'implantation n'est pas définie au niveau de + * l'API mais dans le service ToPIA, au même niveau que le BinderEngine (et ceci pour ne pas avoir plusieurs endroits + * de définition des binders. + * + * Created on 28/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ReferenceBinderEngineSupplier implements Supplier<ReferenceBinderEngine> { + + public static final ReferenceBinderEngine INSTANCE = loadReferenceBinderEngine(); + + private static ReferenceBinderEngine loadReferenceBinderEngine() { + + ServiceLoader<ReferenceBinderEngineSupplier> serviceLoader = ServiceLoader.load(ReferenceBinderEngineSupplier.class); + + Iterator<ReferenceBinderEngineSupplier> iterator = serviceLoader.iterator(); + if (!iterator.hasNext()) { + throw new IllegalStateException("No referenceBinderEngine defined in class-path"); + } + ReferenceBinderEngine result = iterator.next().get(); + return result; + + } + + @Override + public ReferenceBinderEngine get() { + return INSTANCE; + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngine.java b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngine.java index cf22134..2af708b 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngine.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngine.java @@ -1,21 +1,27 @@ package fr.ird.observe.services.binder; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import fr.ird.observe.entities.referentiel.ReferenceEntity; import fr.ird.observe.services.binder.data.DataBinderSupport; import fr.ird.observe.services.binder.referential.ReferentialBinderSupport; import fr.ird.observe.services.dto.DataDto; +import fr.ird.observe.services.dto.DataReference; import fr.ird.observe.services.dto.ObserveModelInitializerRunner; import fr.ird.observe.services.dto.constants.ReferentialLocale; +import fr.ird.observe.services.dto.reference.ReferenceBinderEngine; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Map; + /** * Created on 24/11/15. * * @author Tony Chemit - chemit@codelutin.com */ -public class BinderEngine { +public class BinderEngine implements ReferenceBinderEngine { private static final BinderEngine INSTANCE = new BinderEngine(); @@ -29,7 +35,7 @@ public class BinderEngine { protected ImmutableMap<Class<? extends ReferenceEntity>, Class<? extends ReferentialDto>> referentialEntityToDtoTypes; - protected ImmutableMap<Class<? extends TopiaEntity>, Class<? extends DataDto>> dataEntityToTtoTypes; + protected ImmutableMap<Class<? extends TopiaEntity>, Class<? extends DataDto>> dataEntityToDtoTypes; public static BinderEngine get() { return INSTANCE; @@ -43,11 +49,11 @@ public class BinderEngine { dataBinders = initializer.dataBinders; referentialBinders = initializer.referentialBinders; - dataDtoToEntityTypes = initializer.dataDtoToEntityTypeTypes; + dataDtoToEntityTypes = initializer.dataDtoToEntityTypes; referentialDtoToEntityTypes = initializer.referentialDtoToEntityTypes; referentialEntityToDtoTypes = initializer.referentialEntityToDtoTypes; - dataEntityToTtoTypes = initializer.dataEntityToDToTypes; + dataEntityToDtoTypes = initializer.dataEntityToDtoTypes; } @@ -68,11 +74,37 @@ public class BinderEngine { } public <D extends DataDto, E extends TopiaEntity> Class<D> getDataDtoType(Class<E> entityType) { - return (Class<D>) dataEntityToTtoTypes.get(entityType); + Class<D> result = (Class<D>) dataEntityToDtoTypes.get(entityType); + + if (result == null) { + // Pour gérer le cas des proxy hibernate qui ne sont pas égale à la classe proxifiée + //FIXME Trouver une meilleure solution + String name = entityType.getName(); + for (Map.Entry<Class<? extends TopiaEntity>, Class<? extends DataDto>> entry : dataEntityToDtoTypes.entrySet()) { + if (name.startsWith(entry.getKey().getName())) { + result = (Class<D>) entry.getValue(); + break; + } + } + } + return result; + } public <D extends ReferentialDto, E extends ReferenceEntity> Class<D> getReferentialDtoType(Class<E> entityType) { - return (Class<D>) referentialEntityToDtoTypes.get(entityType); + Class<D> result = (Class<D>) referentialEntityToDtoTypes.get(entityType); + if (result == null) { + // Pour gérer le cas des proxy hibernate qui ne sont pas égale à la classe proxifiée + //FIXME Trouver une meilleure solution + String name = entityType.getName(); + for (Map.Entry<Class<? extends ReferenceEntity>, Class<? extends ReferentialDto>> entry : referentialEntityToDtoTypes.entrySet()) { + if (name.startsWith(entry.getKey().getName())) { + result = (Class<D>) entry.getValue(); + break; + } + } + } + return result; } public <D extends ReferentialDto, E extends ReferenceEntity> Class<E> getReferentialEntityType(Class<D> dtoType) { @@ -103,6 +135,28 @@ public class BinderEngine { } + @Override + public <D extends ReferentialDto> ReferentialReference<D> transformReferentialDtoToReference(ReferentialLocale referentialLocale, D dto) { + + Class<D> dtoType = (Class<D>) dto.getClass(); + ReferentialBinderSupport<?, D> binder = getReferentialBinder(dtoType); + + ReferentialReference<D> reference = binder.toReferentialReference(referentialLocale, dto); + return reference; + + } + + @Override + public <D extends DataDto> DataReference<D> transformDataDtoToReference(ReferentialLocale referentialLocale, D dto) { + + Class<D> dtoType = (Class<D>) dto.getClass(); + DataBinderSupport<?, D> binder = getDataBinder(dtoType); + + DataReference<D> reference = binder.toDataReference(referentialLocale, dto); + return reference; + + } + public <D extends DataDto, E extends TopiaEntity> D transformEntityToDataDto(ReferentialLocale referentialLocale, E entity) { Class<D> dtoType = getDataDtoType(entity.getClass()); @@ -127,12 +181,16 @@ public class BinderEngine { } + public ImmutableSet<Class<? extends ReferentialDto>> getReferentialDtoTypes() { + return ImmutableSet.copyOf(getReferentialDtoToEntityTypes().keySet()); + } + protected ImmutableMap<Class<? extends ReferenceEntity>, Class<? extends ReferentialDto>> getReferentialEntityToDtoTypes() { return referentialEntityToDtoTypes; } protected ImmutableMap<Class<? extends TopiaEntity>, Class<? extends DataDto>> getDataEntityToDtoTypes() { - return dataEntityToTtoTypes; + return dataEntityToDtoTypes; } protected ImmutableMap<Class<? extends DataDto>, Class<? extends TopiaEntity>> getDataDtoToEntityTypes() { diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngineInitializer.java b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngineInitializer.java index bd3dfdb..64d0f22 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngineInitializer.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/BinderEngineInitializer.java @@ -336,7 +336,7 @@ class BinderEngineInitializer implements ObserveModelInitializer { ImmutableMap.Builder<Class<? extends DataDto>, Class<? extends TopiaEntity>> dataDtoToEntityTypeBuilder; - ImmutableMap.Builder<Class<? extends TopiaEntity>, Class<? extends DataDto>> dataEntityToDToTypeBuilder; + ImmutableMap.Builder<Class<? extends TopiaEntity>, Class<? extends DataDto>> dataEntityToDtoTypeBuilder; ImmutableMap.Builder<Class<? extends DataDto>, BinderSupport> dataBinderBuilder; @@ -346,9 +346,9 @@ class BinderEngineInitializer implements ObserveModelInitializer { ImmutableMap.Builder<Class<? extends ReferentialDto>, BinderSupport> referentialBinderBuilder; - ImmutableMap<Class<? extends DataDto>, Class<? extends TopiaEntity>> dataDtoToEntityTypeTypes; + ImmutableMap<Class<? extends DataDto>, Class<? extends TopiaEntity>> dataDtoToEntityTypes; - ImmutableMap<Class<? extends TopiaEntity>, Class<? extends DataDto>> dataEntityToDToTypes; + ImmutableMap<Class<? extends TopiaEntity>, Class<? extends DataDto>> dataEntityToDtoTypes; ImmutableMap<Class<? extends ReferentialDto>, Class<? extends ReferenceEntity>> referentialDtoToEntityTypes; @@ -364,7 +364,7 @@ class BinderEngineInitializer implements ObserveModelInitializer { dataDtoToEntityTypeBuilder = ImmutableMap.builder(); referentialDtoToEntityTypeBuilder = ImmutableMap.builder(); - dataEntityToDToTypeBuilder = ImmutableMap.builder(); + dataEntityToDtoTypeBuilder = ImmutableMap.builder(); referentialEntityToDtoTypeBuilder = ImmutableMap.builder(); dataBinderBuilder = ImmutableMap.builder(); @@ -374,21 +374,21 @@ class BinderEngineInitializer implements ObserveModelInitializer { @Override public void end() { - dataDtoToEntityTypeTypes = dataDtoToEntityTypeBuilder.build(); + dataDtoToEntityTypes = dataDtoToEntityTypeBuilder.build(); referentialDtoToEntityTypes = referentialDtoToEntityTypeBuilder.build(); dataBinders = dataBinderBuilder.build(); referentialBinders = referentialBinderBuilder.build(); - for (Map.Entry<Class<? extends DataDto>, Class<? extends TopiaEntity>> entry : dataDtoToEntityTypeTypes.entrySet()) { + for (Map.Entry<Class<? extends DataDto>, Class<? extends TopiaEntity>> entry : dataDtoToEntityTypes.entrySet()) { Class<? extends DataDto> dtoType = entry.getKey(); Class<? extends TopiaEntity> entityType = entry.getValue(); if ((entityType.getSimpleName() + "Dto").equals(dtoType.getSimpleName())) { ObserveEntityEnum observeEntityEnum = ObserveEntityEnum.valueOf(entityType); - dataEntityToDToTypeBuilder.put(entityType, dtoType); - dataEntityToDToTypeBuilder.put(observeEntityEnum.getImplementation(), dtoType); + dataEntityToDtoTypeBuilder.put(entityType, dtoType); + dataEntityToDtoTypeBuilder.put(observeEntityEnum.getImplementation(), dtoType); } } @@ -403,7 +403,7 @@ class BinderEngineInitializer implements ObserveModelInitializer { referentialEntityToDtoTypeBuilder.put((Class<? extends ReferenceEntity>) observeEntityEnum.getImplementation(), dtoType); } } - dataEntityToDToTypes = dataEntityToDToTypeBuilder.build(); + dataEntityToDtoTypes = dataEntityToDtoTypeBuilder.build(); referentialEntityToDtoTypes = referentialEntityToDtoTypeBuilder.build(); } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/binder/ReferenceBinderEngineSupplierTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/ReferenceBinderEngineSupplierTopia.java new file mode 100644 index 0000000..9e98291 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/ReferenceBinderEngineSupplierTopia.java @@ -0,0 +1,18 @@ +package fr.ird.observe.services.binder; + +import fr.ird.observe.services.dto.reference.ReferenceBinderEngine; +import fr.ird.observe.services.dto.reference.ReferenceBinderEngineSupplier; + +/** + * Created on 28/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ReferenceBinderEngineSupplierTopia extends ReferenceBinderEngineSupplier { + + @Override + public ReferenceBinderEngine get() { + return BinderEngine.get(); + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/binder/data/SetLonglineBinder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/data/SetLonglineBinder.java index 93b5300..2d85efd 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/binder/data/SetLonglineBinder.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/binder/data/SetLonglineBinder.java @@ -5,6 +5,7 @@ import fr.ird.observe.entities.referentiel.longline.LightsticksColor; import fr.ird.observe.entities.referentiel.longline.LightsticksType; import fr.ird.observe.entities.referentiel.longline.LineType; import fr.ird.observe.entities.referentiel.longline.SettingShape; +import fr.ird.observe.services.dto.DataReference; import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.services.dto.longline.SetLonglineDto; import fr.ird.observe.services.dto.referential.longline.LightsticksColorDto; @@ -116,4 +117,19 @@ public class SetLonglineBinder extends DataBinderSupport<SetLongline, SetLonglin dto.setLightsticksColor(toReferentialReference(referentialLocale, entity.getLightsticksColor(), LightsticksColorDto.class)); } + + @Override + public DataReference<SetLonglineDto> toDataReference(ReferentialLocale referentialLocale, SetLongline entity) { + + return toDataReference(entity, entity.getHomeId()); + + } + + @Override + public DataReference<SetLonglineDto> toDataReference(ReferentialLocale referentialLocale, SetLonglineDto dto) { + + return toDataReference(dto, dto.getHomeId()); + + } + } diff --git a/observe-services-topia/src/main/resources/META-INF/services/fr.ird.observe.services.dto.reference.ReferenceBinderEngineSupplier b/observe-services-topia/src/main/resources/META-INF/services/fr.ird.observe.services.dto.reference.ReferenceBinderEngineSupplier new file mode 100644 index 0000000..05eb7af --- /dev/null +++ b/observe-services-topia/src/main/resources/META-INF/services/fr.ird.observe.services.dto.reference.ReferenceBinderEngineSupplier @@ -0,0 +1 @@ +fr.ird.observe.services.binder.ReferenceBinderEngineSupplierTopia \ No newline at end of file diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/binder/ReferenceBinderEngineTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/binder/ReferenceBinderEngineTest.java new file mode 100644 index 0000000..7578ed1 --- /dev/null +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/binder/ReferenceBinderEngineTest.java @@ -0,0 +1,25 @@ +package fr.ird.observe.services.binder; + +import fr.ird.observe.services.dto.reference.ReferenceBinderEngine; +import fr.ird.observe.services.dto.reference.ReferenceBinderEngineSupplier; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created on 28/11/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ReferenceBinderEngineTest { + + @Test + public void testGetReferencebinderEngine() { + + ReferenceBinderEngineSupplier supplier = new ReferenceBinderEngineSupplier(); + + ReferenceBinderEngine referenceBinderEngine = supplier.get(); + Assert.assertNotNull(referenceBinderEngine); + + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.