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 55176dba135b0a0198a6c720cd75edceb92c797d Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Aug 20 15:54:39 2015 +0200 Ajout de la généricité sur les attributs de référence + prise en compte dans le builder de dto --- .../xmi/observe-services-dto-common.properties | 32 +++++++++++++++++++++ .../services/builder/EntityToDtoBuilder.java | 33 ++++++++++++++++------ .../services/builder/EntityToDtoBuilderTest.java | 16 +++++++++-- 3 files changed, 71 insertions(+), 10 deletions(-) diff --git a/observe-services-model/src/main/xmi/observe-services-dto-common.properties b/observe-services-model/src/main/xmi/observe-services-dto-common.properties index aa5d253..e73b825 100644 --- a/observe-services-model/src/main/xmi/observe-services-dto-common.properties +++ b/observe-services-model/src/main/xmi/observe-services-dto-common.properties @@ -11,3 +11,35 @@ fr.ird.observe.services.dto.referential.GearCaracteristic.attribute.gearCaracter fr.ird.observe.services.dto.referential.Species.attribute.ocean.stereotype=unique,ordered fr.ird.observe.services.dto.referential.SpeciesList.attribute.species.stereotype=unique,ordered fr.ird.observe.services.dto.ReferenceSet.attribute.reference.stereotype=unique,ordered + +fr.ird.observe.services.dto.referential.Vessel.attribute.flagCountry.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Country +fr.ird.observe.services.dto.referential.Vessel.attribute.vesselType.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.VesselType +fr.ird.observe.services.dto.referential.Vessel.attribute.vesselSizeCategory.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.VesselSizeCategory +fr.ird.observe.services.dto.referential.Species.attribute.ocean.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Ocean +fr.ird.observe.services.dto.referential.Species.attribute.speciesGroup.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.SpeciesGroup +fr.ird.observe.services.dto.referential.SpeciesList.attribute.species.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Species +fr.ird.observe.services.dto.referential.Program.attribute.organism.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Organism +fr.ird.observe.services.dto.referential.Person.attribute.country.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Country +fr.ird.observe.services.dto.referential.Organism.attribute.country.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Country +fr.ird.observe.services.dto.referential.LengthWeightParameter.attribute.species.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Species +fr.ird.observe.services.dto.referential.LengthWeightParameter.attribute.ocean.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Ocean +fr.ird.observe.services.dto.referential.LengthWeightParameter.attribute.sex.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Sex +fr.ird.observe.services.dto.referential.Harbour.attribute.country.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.Country +fr.ird.observe.services.dto.referential.Gear.attribute.gearCaracteristic.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.GearCaracteristic +fr.ird.observe.services.dto.referential.GearCaracteristic.attribute.gearCaracteristicType.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=fr.ird.observe.services.dto.referential.GearCaracteristicType + +#TODO Add also generic on class +#fr.ird.observe.services.dto.Form.class.tagValue.simpleBeanWithNoInterfaceClassGeneric=D extends fr.ird.observe.services.dto.IdDto +#fr.ird.observe.services.dto.Form.attribute.type.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=D +#fr.ird.observe.services.dto.Form.attribute.labels.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=D + +#fr.ird.observe.services.dto.Reference.class.tagValue.simpleBeanWithNoInterfaceClassGeneric=D extends fr.ird.observe.services.dto.IdDto +#fr.ird.observe.services.dto.Reference.attribute.type.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=D + +#fr.ird.observe.services.dto.ReferentialReference.class.tagValue.simpleBeanWithNoInterfaceClassGeneric=D extends fr.ird.observe.services.dto.IdDto +#fr.ird.observe.services.dto.ReferentialReference.attribute.type.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=D + +#fr.ird.observe.services.dto.ReferenceSet.class.tagValue.simpleBeanWithNoInterfaceClassGeneric=D extends fr.ird.observe.services.dto.IdDto +#fr.ird.observe.services.dto.ReferenceSet.attribute.referenctype.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=D +#fr.ird.observe.services.dto.ReferenceSet.attribute.reference.tagValue.simpleBeanWithNoInterfaceAttributeGeneric=D + diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToDtoBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToDtoBuilder.java index cc86f2a..198b4b3 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToDtoBuilder.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/builder/EntityToDtoBuilder.java @@ -4,16 +4,17 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import fr.ird.observe.ObserveEntityEnum; +import com.google.common.reflect.TypeToken; import fr.ird.observe.entities.Set; -import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.ObserveDtoBinders; import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.services.dto.referential.ReferentialDto; +import fr.ird.observe.services.dto.referential.ReferentialReferenceDto; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.beans.Binder; +import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; import java.io.Closeable; import java.util.ArrayList; @@ -76,7 +77,15 @@ public class EntityToDtoBuilder<E extends TopiaEntity, D extends IdDto> implemen Collection collection = (Collection) propertyValue; - Class<?> collectionType = binder.getTargetPropertyType(propertyName); + //FIXME Trouver par quoi remplacer (ne pas utiliser une api de sun) + à améliorer + TypeToken<?> collectionGenericType = TypeToken.of(binder.getTargetPropertyGenericType(propertyName)); + + Class<?> collectionType = collectionGenericType.getRawType(); + + ParameterizedTypeImpl collectionGenericTypeType = (ParameterizedTypeImpl) collectionGenericType.getType(); + + ParameterizedTypeImpl type1 = (ParameterizedTypeImpl) collectionGenericTypeType.getActualTypeArguments()[0]; + Class type = (Class) type1.getActualTypeArguments()[0]; Collection<Object> dtoCollection = newCollection(collectionType); @@ -86,9 +95,7 @@ public class EntityToDtoBuilder<E extends TopiaEntity, D extends IdDto> implemen if (o1 instanceof TopiaEntity) { - Class<? extends TopiaEntity> entityType = ObserveEntityEnum.valueOf((TopiaEntity) o1).getContract(); - - Class dtoType = ObserveServiceTopia.getDtoType(entityType); + Class dtoType = type; Collection<? extends TopiaEntity> topiaEntities = (Collection<? extends TopiaEntity>) collection; @@ -114,8 +121,18 @@ public class EntityToDtoBuilder<E extends TopiaEntity, D extends IdDto> implemen TopiaEntity entityValue = (TopiaEntity) propertyValue; - Class<? extends TopiaEntity> entityType = ObserveEntityEnum.valueOf(entityValue).getContract(); - Class dtoType = ObserveServiceTopia.getDtoType(entityType); + Class dtoType; + TypeToken<?> typeToken = TypeToken.of(binder.getTargetPropertyGenericType(propertyName)); + Class<?> rawType = typeToken.getRawType(); + if (rawType.isAssignableFrom(ReferenceDto.class) || rawType.isAssignableFrom(ReferentialReferenceDto.class)) { + + //FIXME Trouver par quoi remplacer (ne pas utiliser une api de sun) + ParameterizedTypeImpl type = (ParameterizedTypeImpl) typeToken.getType(); + dtoType = (Class) type.getActualTypeArguments()[0]; + } else { + dtoType = rawType; + } + propertyValue = entityToRef(referentialLocale, dtoType, entityValue, referenceTypesBuilder); addProperty(propertyName, propertyValue, dtoPropertiesBuilder); continue; diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/builder/EntityToDtoBuilderTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/builder/EntityToDtoBuilderTest.java index c4460d9..43079e2 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/builder/EntityToDtoBuilderTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/builder/EntityToDtoBuilderTest.java @@ -7,7 +7,7 @@ import fr.ird.observe.entities.referentiel.Organism; import fr.ird.observe.entities.referentiel.OrganismImpl; import fr.ird.observe.entities.referentiel.Program; import fr.ird.observe.entities.referentiel.ProgramImpl; -import fr.ird.observe.services.builder.EntityToDtoBuilder; +import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.ReferenceValueNotFoundException; @@ -17,7 +17,6 @@ import fr.ird.observe.services.dto.referential.OrganismDto; import fr.ird.observe.services.dto.referential.ProgramDto; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReferenceDto; -import fr.ird.observe.services.ObserveServiceTopia; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -68,6 +67,19 @@ public class EntityToDtoBuilderTest { organism.setCode("organismCode"); program.setOrganism(organism); + /* + Type[] actualTypeArguments = ((ParameterizedType) typeOfT).getActualTypeArguments(); + if (actualTypeArguments[1].equals(MatrixBounds.class)) { + type2 = new TypeToken<Map<?, MatrixBounds>>() { + + }.getType(); + } else { + type2 = new TypeToken<Map<?, ?>>() { + + }.getType(); + } + */ + EntityToDtoBuilder<Program, ProgramDto> builder = EntityToDtoBuilder.create(Program.class, ProgramDto.class); ProgramDto programDto = builder.build(ReferentialLocale.FR, program); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.