This is an automated email from the git hooks/post-receive script. New commit to branch feature/7458 in repository observe. See http://git.codelutin.com/observe.git commit 92c92c9ab2a7406f1e4752a2ca4bd198ef78683a Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Aug 19 10:33:56 2015 +0200 Utilisation des binders pour effectuer les créations de dto --- .../services/service/ReferentialService.java | 2 +- .../fr/ird/observe/services/dto/ReferenceDto.java | 6 +- .../fr/ird/observe/services/dto/ReferenceDtos.java | 23 +- .../dto/referential/ReferentialReferenceDto.java | 2 +- .../dto/referential/ReferentialReferenceDtos.java | 136 +---------- .../services/service/ReferentialServiceRest.java | 4 +- .../observe/services/dto/EntityToDtoBuilder.java | 202 +++++++++++++++ .../services/dto/EntityToReferenceDtoBuilder.java | 61 +++++ .../observe/services/dto/ObserveDtoBinders.java | 38 +++ .../services/service/ReferentialDtoBuilder.java | 209 ---------------- .../services/service/ReferentialServiceTopia.java | 270 +++------------------ .../service/ApplicationContextResource.java | 3 + .../service/ReferentialServiceTopiaTest.java | 18 +- .../EntityToDtoBuilderTest.java} | 21 +- 14 files changed, 372 insertions(+), 623 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialService.java index 5d26659..6aaf414 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/ReferentialService.java @@ -15,7 +15,7 @@ import java.util.Collection; */ public interface ReferentialService extends ObserveService { - <R extends ReferentialDto> ReferenceSetDto getReferentialReferenceSet(Class<R> type); + <R extends ReferentialDto> ReferenceSetDto<R> getReferentialReferenceSet(Class<R> type); <R extends ReferentialDto> FormDto<R> loadToRead(Class<R> type, String id) throws DataNotFoundException; diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDto.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDto.java index d4bac9c..b043935 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDto.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDto.java @@ -15,10 +15,10 @@ public class ReferenceDto<D extends IdDto> extends AbstractReferenceDto { protected Serializable[] labelPropertyValues; - protected void init(Class<D> type, ImmutableList<String> labelPropertyNames) { + protected void init(Class<D> type, Iterable<String> labelPropertyNames) { this.type = type; - this.labelPropertyNames = labelPropertyNames; - this.labelPropertyValues = new Serializable[labelPropertyNames.size()]; + this.labelPropertyNames = ImmutableList.copyOf(labelPropertyNames); + this.labelPropertyValues = new Serializable[this.labelPropertyNames.size()]; } public Serializable getPropertyValue(String propertyName) { diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDtos.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDtos.java index 1012a40..99c8d91 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDtos.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/ReferenceDtos.java @@ -1,28 +1,11 @@ package fr.ird.observe.services.dto; -import com.google.common.collect.ImmutableList; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.io.Serializable; -import java.util.Map; - public class ReferenceDtos extends AbstractReferenceDtos { - public static <R extends IdDto> ReferenceDto<R> newReferenceDto(Class<R> type, Object source) { - + public static <R extends IdDto> ReferenceDto<R> newReferenceDto(Class<R> type, Iterable<String> propertyNames) { ReferenceDto<R> dto = new ReferenceDto<>(); - - dto.init(type, ImmutableList.of("TODO")); - Binder binder = BinderFactory.newBinder(source.getClass()); - - String[] propertyNames = null; - Map<String, Object> properties = binder.obtainProperties(source, propertyNames); - for (Map.Entry<String, Object> entry : properties.entrySet()) { - String propertyName = entry.getKey(); - Object propertyValue = entry.getValue(); - dto.setPropertyValue(propertyName, (Serializable) propertyValue); - } + dto.init(type, propertyNames); return dto; } + } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java index 60b43be..8d9bbe9 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java @@ -43,7 +43,7 @@ public class ReferentialReferenceDto<D extends ReferentialDto> extends AbstractR } } - protected void init(Class<D> type, ReferentialLocale referentialLocale, String... labelPropertyNames) { + protected void init(Class<D> type, ReferentialLocale referentialLocale, Iterable<String> labelPropertyNames) { this.type = type; String libelle = referentialLocale.getLibelle(); diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDtos.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDtos.java index 9702e7d..5e4dfb8 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDtos.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDtos.java @@ -1,149 +1,17 @@ package fr.ird.observe.services.dto.referential; -import com.google.common.collect.ImmutableMap; import fr.ird.observe.services.dto.constants.ReferentialLocale; -import fr.ird.observe.services.dto.referential.longline.BaitHaulingStatusDto; -import fr.ird.observe.services.dto.referential.longline.BaitSettingStatusDto; -import fr.ird.observe.services.dto.referential.longline.BaitTypeDto; -import fr.ird.observe.services.dto.referential.longline.CatchFateLonglineDto; -import fr.ird.observe.services.dto.referential.longline.EncounterTypeDto; -import fr.ird.observe.services.dto.referential.longline.HealthnessDto; -import fr.ird.observe.services.dto.referential.longline.HookPositionDto; -import fr.ird.observe.services.dto.referential.longline.HookSizeDto; -import fr.ird.observe.services.dto.referential.longline.HookTypeDto; -import fr.ird.observe.services.dto.referential.longline.ItemHorizontalPositionDto; -import fr.ird.observe.services.dto.referential.longline.ItemVerticalPositionDto; -import fr.ird.observe.services.dto.referential.longline.LightsticksColorDto; -import fr.ird.observe.services.dto.referential.longline.LightsticksTypeDto; -import fr.ird.observe.services.dto.referential.longline.LineTypeDto; -import fr.ird.observe.services.dto.referential.longline.MaturityStatusDto; -import fr.ird.observe.services.dto.referential.longline.MitigationTypeDto; -import fr.ird.observe.services.dto.referential.longline.SensorBrandDto; -import fr.ird.observe.services.dto.referential.longline.SensorDataFormatDto; -import fr.ird.observe.services.dto.referential.longline.SensorTypeDto; -import fr.ird.observe.services.dto.referential.longline.SettingShapeDto; -import fr.ird.observe.services.dto.referential.longline.SizeMeasureTypeDto; -import fr.ird.observe.services.dto.referential.longline.StomacFullnessDto; -import fr.ird.observe.services.dto.referential.longline.TripTypeDto; -import fr.ird.observe.services.dto.referential.longline.VesselActivityLonglineDto; -import fr.ird.observe.services.dto.referential.longline.WeightMeasureTypeDto; -import fr.ird.observe.services.dto.referential.seine.DetectionModeDto; -import fr.ird.observe.services.dto.referential.seine.ObjectFateDto; -import fr.ird.observe.services.dto.referential.seine.ObjectOperationDto; -import fr.ird.observe.services.dto.referential.seine.ObjectTypeDto; -import fr.ird.observe.services.dto.referential.seine.ObservedSystemDto; -import fr.ird.observe.services.dto.referential.seine.ReasonForDiscardDto; -import fr.ird.observe.services.dto.referential.seine.ReasonForNoFishingDto; -import fr.ird.observe.services.dto.referential.seine.ReasonForNullSetDto; -import fr.ird.observe.services.dto.referential.seine.SpeciesFateDto; -import fr.ird.observe.services.dto.referential.seine.SpeciesStatusDto; -import fr.ird.observe.services.dto.referential.seine.SurroundingActivityDto; -import fr.ird.observe.services.dto.referential.seine.TransmittingBuoyOperationDto; -import fr.ird.observe.services.dto.referential.seine.TransmittingBuoyTypeDto; -import fr.ird.observe.services.dto.referential.seine.VesselActivitySeineDto; -import fr.ird.observe.services.dto.referential.seine.WeightCategoryDto; -import fr.ird.observe.services.dto.referential.seine.WindDto; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; -import java.io.Serializable; -import java.util.Map; +import java.util.Set; public class ReferentialReferenceDtos extends AbstractReferentialReferenceDtos { - /** - * Les noms des propriétés à utiliser dans le label par type de référentiel. - */ - protected static final ImmutableMap<Class<?>, String[]> LABEL_PROPERTY_NAMES_MAPPING; - - static { - - String[] DEFAULT_PROPERTY_NAMES = {ReferentialDto.PROPERTY_CODE, I18nReferentialDto.PROPERTY_LABEL1, I18nReferentialDto.PROPERTY_LABEL2, I18nReferentialDto.PROPERTY_LABEL3}; - - LABEL_PROPERTY_NAMES_MAPPING = ImmutableMap.<Class<?>, String[]>builder() - - .put(CountryDto.class, DEFAULT_PROPERTY_NAMES) - .put(FpaZoneDto.class, DEFAULT_PROPERTY_NAMES) - .put(GearCaracteristicDto.class, DEFAULT_PROPERTY_NAMES) - .put(GearCaracteristicTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(GearDto.class, DEFAULT_PROPERTY_NAMES) - .put(HarbourDto.class, new String[]{ReferentialDto.PROPERTY_CODE, HarbourDto.PROPERTY_NAME, HarbourDto.PROPERTY_LOCODE}) - // FIXME A revoir car on veut en fait ocean/libelle et species/scientificLabel - .put(LengthWeightParameterDto.class, new String[]{LengthWeightParameterDto.PROPERTY_SEX, LengthWeightParameterDto.PROPERTY_OCEAN, LengthWeightParameterDto.PROPERTY_SPECIES, LengthWeightParameterDto.PROPERTY_LENGTH_WEIGHT_FORMULA, LengthWeightParameterDto.PROPERTY_WEIGHT_LENGTH_FORMULA}) - .put(OceanDto.class, DEFAULT_PROPERTY_NAMES) - .put(OrganismDto.class, DEFAULT_PROPERTY_NAMES) - .put(PersonDto.class, new String[]{PersonDto.PROPERTY_FIRST_NAME, PersonDto.PROPERTY_LAST_NAME}) - .put(ProgramDto.class, new String[]{I18nReferentialDto.PROPERTY_LABEL1, I18nReferentialDto.PROPERTY_LABEL2, I18nReferentialDto.PROPERTY_LABEL3}) - .put(SexDto.class, DEFAULT_PROPERTY_NAMES) - .put(SpeciesDto.class, new String[]{SpeciesDto.PROPERTY_FAO_CODE, SpeciesDto.PROPERTY_SCIENTIFIC_LABEL, SpeciesDto.PROPERTY_HOME_ID}) - .put(SpeciesGroupDto.class, DEFAULT_PROPERTY_NAMES) - .put(SpeciesListDto.class, DEFAULT_PROPERTY_NAMES) - .put(VesselDto.class, DEFAULT_PROPERTY_NAMES) - .put(VesselSizeCategoryDto.class, new String[]{ReferentialDto.PROPERTY_CODE, VesselSizeCategoryDto.PROPERTY_GAUGE_LABEL, VesselSizeCategoryDto.PROPERTY_CAPACITY_LABEL}) - .put(VesselTypeDto.class, DEFAULT_PROPERTY_NAMES) - - .put(DetectionModeDto.class, DEFAULT_PROPERTY_NAMES) - .put(ObjectFateDto.class, DEFAULT_PROPERTY_NAMES) - .put(ObjectOperationDto.class, DEFAULT_PROPERTY_NAMES) - .put(ObjectTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(ObservedSystemDto.class, DEFAULT_PROPERTY_NAMES) - .put(ReasonForDiscardDto.class, DEFAULT_PROPERTY_NAMES) - .put(ReasonForNoFishingDto.class, DEFAULT_PROPERTY_NAMES) - .put(ReasonForNullSetDto.class, DEFAULT_PROPERTY_NAMES) - .put(SpeciesFateDto.class, DEFAULT_PROPERTY_NAMES) - .put(SpeciesStatusDto.class, DEFAULT_PROPERTY_NAMES) - .put(SurroundingActivityDto.class, DEFAULT_PROPERTY_NAMES) - .put(TransmittingBuoyOperationDto.class, DEFAULT_PROPERTY_NAMES) - .put(TransmittingBuoyTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(VesselActivitySeineDto.class, DEFAULT_PROPERTY_NAMES) - .put(WeightCategoryDto.class, DEFAULT_PROPERTY_NAMES) - .put(WindDto.class, new String[]{ReferentialDto.PROPERTY_CODE, I18nReferentialDto.PROPERTY_LABEL1, I18nReferentialDto.PROPERTY_LABEL2, I18nReferentialDto.PROPERTY_LABEL3, WindDto.PROPERTY_SPEED_RANGE}) - - .put(BaitHaulingStatusDto.class, DEFAULT_PROPERTY_NAMES) - .put(BaitSettingStatusDto.class, DEFAULT_PROPERTY_NAMES) - .put(BaitTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(CatchFateLonglineDto.class, DEFAULT_PROPERTY_NAMES) - .put(EncounterTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(HealthnessDto.class, DEFAULT_PROPERTY_NAMES) - .put(HookPositionDto.class, DEFAULT_PROPERTY_NAMES) - .put(HookSizeDto.class, DEFAULT_PROPERTY_NAMES) - .put(HookTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(ItemHorizontalPositionDto.class, DEFAULT_PROPERTY_NAMES) - .put(ItemVerticalPositionDto.class, DEFAULT_PROPERTY_NAMES) - .put(LightsticksColorDto.class, DEFAULT_PROPERTY_NAMES) - .put(LightsticksTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(LineTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(MaturityStatusDto.class, DEFAULT_PROPERTY_NAMES) - .put(MitigationTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(SensorBrandDto.class, new String[]{ReferentialDto.PROPERTY_CODE, SensorBrandDto.PROPERTY_BRAND_NAME}) - .put(SensorDataFormatDto.class, DEFAULT_PROPERTY_NAMES) - .put(SensorTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(SettingShapeDto.class, DEFAULT_PROPERTY_NAMES) - .put(SizeMeasureTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(StomacFullnessDto.class, DEFAULT_PROPERTY_NAMES) - .put(TripTypeDto.class, DEFAULT_PROPERTY_NAMES) - .put(VesselActivityLonglineDto.class, DEFAULT_PROPERTY_NAMES) - .put(WeightMeasureTypeDto.class, DEFAULT_PROPERTY_NAMES) - - .build(); - - } - public static <R extends ReferentialDto> ReferentialReferenceDto<R> newReferentialReferenceDto(Class<R> type, ReferentialLocale referentialLocale, - Object source) { - String[] propertyNames = LABEL_PROPERTY_NAMES_MAPPING.get(type); + Set<String> propertyNames) { ReferentialReferenceDto<R> dto = new ReferentialReferenceDto<>(); dto.init(type, referentialLocale, propertyNames); - - Binder binder = BinderFactory.newBinder(source.getClass()); - Map<String, Object> properties = binder.obtainProperties(source, propertyNames); - for (Map.Entry<String, Object> entry : properties.entrySet()) { - String propertyName = entry.getKey(); - Object propertyValue = entry.getValue(); - dto.setPropertyValue(referentialLocale, propertyName, (Serializable) propertyValue); - } return dto; } diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/service/ReferentialServiceRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/service/ReferentialServiceRest.java index 679c212..fa73b4a 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/service/ReferentialServiceRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/service/ReferentialServiceRest.java @@ -16,9 +16,9 @@ import java.util.Collection; public class ReferentialServiceRest extends ObserveServiceRest implements ReferentialService { @Override - public <R extends ReferentialDto> ReferenceSetDto getReferentialReferenceSet(Class<R> type) { + public <R extends ReferentialDto> ReferenceSetDto<R> getReferentialReferenceSet(Class<R> type) { - return new ReferenceSetDto(type); + return new ReferenceSetDto<>(type); } @Override diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/EntityToDtoBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/EntityToDtoBuilder.java new file mode 100644 index 0000000..7f7d2d2 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/EntityToDtoBuilder.java @@ -0,0 +1,202 @@ +package fr.ird.observe.services.dto; + +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 fr.ird.observe.entities.Set; +import fr.ird.observe.entities.constants.GearType; +import fr.ird.observe.entities.constants.ReferenceStatus; +import fr.ird.observe.entities.constants.seine.NonTargetCatchComputedValueSource; +import fr.ird.observe.entities.constants.seine.Ownership; +import fr.ird.observe.entities.constants.seine.SchoolType; +import fr.ird.observe.entities.constants.seine.TypeTransmittingBuoyOperation; +import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.dto.constants.ReferentialLocale; +import fr.ird.observe.services.dto.referential.ReferentialDto; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.beans.Binder; + +import java.io.Closeable; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.Map; + +/** + * Created on 18/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class EntityToDtoBuilder<E extends TopiaEntity, D extends IdDto> implements Closeable { + + private final D result; + + private final Binder<E, D> binder; + + private ImmutableSet<Class<? extends IdDto>> referencesTypes; + + public EntityToDtoBuilder(D result, Binder<E, D> binder) { + this.result = result; + this.binder = binder; + } + + public static <E extends TopiaEntity, D extends ReferentialDto> EntityToDtoBuilder<E, D> create(Class<E> entityType, Class<D> dtoType) { + + Preconditions.checkNotNull(entityType, "entityType can't be null."); + Preconditions.checkNotNull(dtoType, "dtoType can't be null."); + D result; + try { + result = dtoType.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalStateException("Could not instanciate dto of type: " + dtoType.getName()); + } + + Binder<E, D> binder = ObserveDtoBinders.newEntityToDtoBinder(entityType, dtoType); + EntityToDtoBuilder<E, D> builder = new EntityToDtoBuilder<>(result, binder); + return builder; + } + + public D build(ReferentialLocale referentialLocale, E entity) { + + ImmutableSet.Builder<Class<? extends IdDto>> referenceTypesBuilder = new ImmutableSet.Builder<>(); + + Map<String, Object> entityProperties = binder.obtainProperties(entity, false); + + ImmutableMap.Builder<String, Object> dtoPropertiesBuilder = new ImmutableMap.Builder<>(); + + for (Map.Entry<String, Object> entry : entityProperties.entrySet()) { + String propertyName = entry.getKey(); + Object propertyValue = entry.getValue(); + + Collection<Object> propertyValueCollection = null; + if (propertyValue instanceof Set) { + + propertyValueCollection = new LinkedHashSet<>(); + } + if (propertyValue instanceof Collection) { + propertyValueCollection = new LinkedList<>(); + } + + if (propertyValueCollection != null) { + + Collection collection = (Collection) propertyValue; + if (collection.isEmpty()) { + continue; + } + Object valueToAdd = collection; + + Object o1 = Iterables.get(collection, 0); + + if (o1 instanceof TopiaEntity) { + + Class<? extends TopiaEntity> entityType = ObserveEntityEnum.valueOf((TopiaEntity)o1).getContract(); + + Class dtoType = ObserveServiceTopia.getDtoType(entityType); + + Collection<? extends TopiaEntity> topiaEntities = (Collection<? extends TopiaEntity>) collection; + LinkedHashSet<ReferenceDto> references = new LinkedHashSet<>(topiaEntities.size()); + for (TopiaEntity entityValue : topiaEntities) { + + references.add(entityToRef(referentialLocale, dtoType, entityValue, referenceTypesBuilder)); + } + valueToAdd = references; + + } + + addProperty(propertyName, valueToAdd, dtoPropertiesBuilder); + + continue; + } + + if (propertyValue instanceof TopiaEntity) { + + TopiaEntity entityValue = (TopiaEntity) propertyValue; + + Class<? extends TopiaEntity> entityType = ObserveEntityEnum.valueOf(entityValue).getContract(); + Class dtoType = ObserveServiceTopia.getDtoType(entityType); + propertyValue = entityToRef(referentialLocale, dtoType, entityValue, referenceTypesBuilder); + + } + + addProperty(propertyName, propertyValue, dtoPropertiesBuilder); + + } + + ImmutableMap<String, Object> properties = dtoPropertiesBuilder.build(); + binder.injectProperties(properties, result); + + referencesTypes = referenceTypesBuilder.build(); + + return result; + + } + + private void addProperty(String propertyName, Object propertyValue, ImmutableMap.Builder<String, Object> dtoPropertiesBuilder) { + + if (TopiaEntity.TOPIA_ID.equals(propertyName)) { + propertyName = ReferentialDto.PROPERTY_ID; + } else if (propertyValue instanceof GearType) { + + GearType entityGearType = (GearType) propertyValue; + propertyValue = fr.ird.observe.services.dto.constants.GearType.valueOf(entityGearType.name()); + + } else if (propertyValue instanceof ReferenceStatus) { + + ReferenceStatus referenceStatus = (ReferenceStatus) propertyValue; + propertyValue = fr.ird.observe.services.dto.constants.ReferenceStatus.valueOf(referenceStatus.name()); + + } else if (propertyValue instanceof Ownership) { + + Ownership ownership = (Ownership) propertyValue; + propertyValue = fr.ird.observe.services.dto.constants.seine.Ownership.valueOf(ownership.name()); + + } else if (propertyValue instanceof SchoolType) { + + SchoolType schoolType = (SchoolType) propertyValue; + propertyValue = fr.ird.observe.services.dto.constants.seine.SchoolType.valueOf(schoolType.name()); + + } else if (propertyValue instanceof TypeTransmittingBuoyOperation) { + + TypeTransmittingBuoyOperation typeTransmittingBuoyOperation = (TypeTransmittingBuoyOperation) propertyValue; + propertyValue = fr.ird.observe.services.dto.constants.seine.TypeTransmittingBuoyOperation.valueOf(typeTransmittingBuoyOperation.name()); + + } else if (propertyValue instanceof NonTargetCatchComputedValueSource) { + + NonTargetCatchComputedValueSource nonTargetCatchComputedValueSource = (NonTargetCatchComputedValueSource) propertyValue; + propertyValue = fr.ird.observe.services.dto.constants.seine.NonTargetCatchComputedValueSource.valueOf(nonTargetCatchComputedValueSource.name()); + + } + + dtoPropertiesBuilder.put(propertyName, propertyValue); + + } + + protected <R extends IdDto> ReferenceDto<R> entityToRef(ReferentialLocale referentialLocale, Class<R> dtoType, TopiaEntity entityValue, ImmutableSet.Builder<Class<? extends IdDto>> referenceTypesBuilder) { + + referenceTypesBuilder.add(dtoType); + + ReferenceDto<R> label; + if (ReferentialDto.class.isAssignableFrom(dtoType)) { + + label = EntityToReferenceDtoBuilder.buildReferential((Class) dtoType, referentialLocale, entityValue); + + } else { + label = EntityToReferenceDtoBuilder.build(dtoType, entityValue); + } + + label.setId(entityValue.getTopiaId()); + return label; + + } + + @Override + public void close() { + + } + + public ImmutableSet<Class<? extends IdDto>> getReferenceTypes() { + return referencesTypes; + } +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/EntityToReferenceDtoBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/EntityToReferenceDtoBuilder.java new file mode 100644 index 0000000..0c8d288 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/EntityToReferenceDtoBuilder.java @@ -0,0 +1,61 @@ +package fr.ird.observe.services.dto; + +import fr.ird.observe.ObserveEntityEnum; +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 fr.ird.observe.services.dto.referential.ReferentialReferenceDtos; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.beans.Binder; + +import java.io.Serializable; +import java.util.Map; +import java.util.Set; + +/** + * Created on 19/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class EntityToReferenceDtoBuilder<E extends TopiaEntity, D extends IdDto> { + + public static <E extends TopiaEntity, D extends IdDto> ReferenceDto<D> build(Class<D> dtoType, E entity) { + + Class<E> entityType = (Class<E>) ObserveEntityEnum.valueOf(entity).getContract(); + Binder<E, E> binder = ObserveDtoBinders.newEntityToReferenceBinder(entityType); + + Map<String, Object> entityProperties = binder.obtainProperties(entity); + Set<String> propertyNames = entityProperties.keySet(); + + ReferenceDto<D> result = ReferenceDtos.newReferenceDto(dtoType, propertyNames); + + for (Map.Entry<String, Object> entry : entityProperties.entrySet()) { + String propertyName = entry.getKey(); + Object propertyValue = entry.getValue(); + result.setPropertyValue(propertyName, (Serializable) propertyValue); + } + return result; + + } + + public static <E extends TopiaEntity, D extends ReferentialDto> ReferentialReferenceDto<D> buildReferential(Class<D> dtoType, ReferentialLocale referentialLocale, E entity) { + + Class<E> entityType = (Class<E>) ObserveEntityEnum.valueOf(entity).getContract(); + Binder<E, E> binder = ObserveDtoBinders.newEntityToReferenceBinder(entityType); + + Map<String, Object> entityProperties = binder.obtainProperties(entity); + Set<String> propertyNames = entityProperties.keySet(); + + ReferentialReferenceDto<D> result = ReferentialReferenceDtos.newReferentialReferenceDto(dtoType, referentialLocale, propertyNames); + + for (Map.Entry<String, Object> entry : entityProperties.entrySet()) { + String propertyName = entry.getKey(); + Object propertyValue = entry.getValue(); + result.setPropertyValue(referentialLocale, propertyName, (Serializable) propertyValue); + } + + return result; + + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtoBinders.java b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtoBinders.java new file mode 100644 index 0000000..fc11b56 --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtoBinders.java @@ -0,0 +1,38 @@ +package fr.ird.observe.services.dto; + +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +/** + * Created on 18/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveDtoBinders { + + public static final String DTO_TO_ENTITY = "dtoToEntity"; + + public static final String DTO_TO_REFERENCE = "dtoToReference"; + + public static final String ENTITY_TO_REFERENCE = "entityToReference"; + + public static final String ENTITY_TO_DTO = "entityToDto"; + + public static <R extends IdDto, E extends TopiaEntity> Binder<R, E> newDtoToEntityBinder(Class<R> dtoType, Class<E> entityType) { + return BinderFactory.newBinder(dtoType, entityType, DTO_TO_ENTITY); + } + + public static <E extends TopiaEntity, R extends IdDto> Binder<E, R> newEntityToDtoBinder(Class<E> entityType, Class<R> dtoType) { + return BinderFactory.newBinder(entityType, dtoType, ENTITY_TO_DTO); + } + + public static <R extends IdDto> Binder<R, R> newDtoToReferenceBinder(Class<R> dtoType) { + return BinderFactory.newBinder(dtoType, DTO_TO_ENTITY); + } + + public static <E extends TopiaEntity> Binder<E, E> newEntityToReferenceBinder(Class<E> entityType) { + return BinderFactory.newBinder(entityType, DTO_TO_ENTITY); + } + +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialDtoBuilder.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialDtoBuilder.java deleted file mode 100644 index 1f24107..0000000 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialDtoBuilder.java +++ /dev/null @@ -1,209 +0,0 @@ -package fr.ird.observe.services.service; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.entities.constants.GearType; -import fr.ird.observe.entities.constants.ReferenceStatus; -import fr.ird.observe.entities.constants.seine.NonTargetCatchComputedValueSource; -import fr.ird.observe.entities.constants.seine.Ownership; -import fr.ird.observe.entities.constants.seine.SchoolType; -import fr.ird.observe.entities.constants.seine.TypeTransmittingBuoyOperation; -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 fr.ird.observe.services.dto.referential.ReferentialReferenceDtos; -import org.nuiton.topia.persistence.EntityVisitor; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.io.Closeable; -import java.util.Collection; -import java.util.LinkedHashSet; - -/** - * Created on 16/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ReferentialDtoBuilder<M extends ReferentialDto> implements Closeable { - - private M result; - - private final ReferentialLocale referentialLocale; - - private ImmutableMap.Builder<String, Object> valuesBuilder; - - private Binder<M, M> binder; - - private final EntityVisitor visitor; - - private ImmutableSet.Builder<Class<? extends ReferentialDto>> referentialDtoTypesBuilder; - - public static <M extends ReferentialDto> ReferentialDtoBuilder<M> create(Class<M> dtoType, ReferentialLocale referentialLocale) { - - Preconditions.checkNotNull(dtoType, "dtoType can't be null."); - M result; - try { - result = dtoType.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException("Could not instanciate dto of type: " + dtoType.getName()); - } - ReferentialDtoBuilder<M> visitor = new ReferentialDtoBuilder<>(result, referentialLocale); - return visitor; - } - - public ReferentialDtoBuilder<M> copyEntity(TopiaEntity entity) { - entity.accept(visitor); - return this; - } - - public M build() { - - ImmutableMap<String, Object> properties = valuesBuilder.build(); - binder.injectProperties(properties, result); - return result; - - } - - public ImmutableSet<Class<? extends ReferentialDto>> getReferentialDtoTypes() { - return referentialDtoTypesBuilder.build(); - } - - protected ReferentialDtoBuilder(M result, ReferentialLocale referentialLocale) { - this.result = result; - this.referentialLocale = referentialLocale; - this.binder = (Binder<M, M>) BinderFactory.newBinder(result.getClass()); - this.valuesBuilder = new ImmutableMap.Builder<>(); - this.visitor = new ToModelVisitor(); - this.referentialDtoTypesBuilder = new ImmutableSet.Builder<>(); - } - - protected void putPropertyValue(String propertyName, Object propertyValue) { - - if (TopiaEntity.TOPIA_ID.equals(propertyName)) { - propertyName = ReferentialDto.PROPERTY_ID; - } else if (propertyValue instanceof GearType) { - - GearType entityGearType = (GearType) propertyValue; - propertyValue = fr.ird.observe.services.dto.constants.GearType.valueOf(entityGearType.name()); - - } else if (propertyValue instanceof ReferenceStatus) { - - ReferenceStatus referenceStatus = (ReferenceStatus) propertyValue; - propertyValue = fr.ird.observe.services.dto.constants.ReferenceStatus.valueOf(referenceStatus.name()); - - } else if (propertyValue instanceof Ownership) { - - Ownership ownership = (Ownership) propertyValue; - propertyValue = fr.ird.observe.services.dto.constants.seine.Ownership.valueOf(ownership.name()); - - } else if (propertyValue instanceof SchoolType) { - - SchoolType schoolType = (SchoolType) propertyValue; - propertyValue = fr.ird.observe.services.dto.constants.seine.SchoolType.valueOf(schoolType.name()); - - } else if (propertyValue instanceof TypeTransmittingBuoyOperation) { - - TypeTransmittingBuoyOperation typeTransmittingBuoyOperation = (TypeTransmittingBuoyOperation) propertyValue; - propertyValue = fr.ird.observe.services.dto.constants.seine.TypeTransmittingBuoyOperation.valueOf(typeTransmittingBuoyOperation.name()); - - } else if (propertyValue instanceof NonTargetCatchComputedValueSource) { - - NonTargetCatchComputedValueSource nonTargetCatchComputedValueSource = (NonTargetCatchComputedValueSource) propertyValue; - propertyValue = fr.ird.observe.services.dto.constants.seine.NonTargetCatchComputedValueSource.valueOf(nonTargetCatchComputedValueSource.name()); - - } - - valuesBuilder.put(propertyName, propertyValue); - - } - - protected <R extends ReferentialDto> ReferentialReferenceDto<R> entityToRef(Class<R> dtoType, TopiaEntity entityValue) { - - referentialDtoTypesBuilder.add(dtoType); - ReferentialReferenceDto<R> label = ReferentialReferenceDtos.newReferentialReferenceDto(dtoType, referentialLocale, entityValue); - label.setId(entityValue.getTopiaId()); - return label; - - } - - @Override - public void close() { - valuesBuilder = null; - result = null; - binder = null; - visitor.clear(); - } - - protected class ToModelVisitor implements EntityVisitor { - - @Override - public void start(TopiaEntity entity) { - visit(entity, TopiaEntity.TOPIA_ID, String.class, entity.getTopiaId()); - //visit(entity, TopiaEntity.TOPIA_VERSION, long.class, entity.getTopiaVersion()); - //visit(entity, TopiaEntity.TOPIA_CREATE_DATE, Date.class, entity.getTopiaCreateDate()); - } - - @Override - public void end(TopiaEntity entity) { - } - - @Override - public void visit(TopiaEntity entity, String propertyName, Class<?> type, Object value) { - - if (value != null) { - - Object valueToAdd = value; - if (value instanceof TopiaEntity) { - - TopiaEntity entityValue = (TopiaEntity) value; - - Class dtoType = ReferentialServiceTopia.entityToModelTypeCache.get(type); - valueToAdd = entityToRef(dtoType, entityValue); - - } - - putPropertyValue(propertyName, valueToAdd); - - } - - } - - @Override - public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object value) { - - if (value != null) { - - Object valueToAdd = value; - if (TopiaEntity.class.isAssignableFrom(type)) { - - Class dtoType = ReferentialServiceTopia.entityToModelTypeCache.get(type); - - Collection<? extends TopiaEntity> topiaEntities = (Collection<? extends TopiaEntity>) value; - LinkedHashSet<ReferentialReferenceDto> models = new LinkedHashSet<>(topiaEntities.size()); - for (TopiaEntity entityValue : topiaEntities) { - - models.add(entityToRef(dtoType, entityValue)); - } - valueToAdd = models; - - } - - putPropertyValue(propertyName, valueToAdd); - - } - - } - - @Override - public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, int index, Object value) { - } - - @Override - public void clear() { - - } - } -} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java index 6983bdd..393cd4a 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/ReferentialServiceTopia.java @@ -1,134 +1,17 @@ package fr.ird.observe.services.service; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import fr.ird.observe.ObserveDAOHelper; -import fr.ird.observe.entities.referentiel.Country; -import fr.ird.observe.entities.referentiel.FpaZone; -import fr.ird.observe.entities.referentiel.Gear; -import fr.ird.observe.entities.referentiel.GearCaracteristic; -import fr.ird.observe.entities.referentiel.GearCaracteristicType; -import fr.ird.observe.entities.referentiel.Harbour; -import fr.ird.observe.entities.referentiel.LengthWeightParameter; -import fr.ird.observe.entities.referentiel.Ocean; -import fr.ird.observe.entities.referentiel.Organism; -import fr.ird.observe.entities.referentiel.Person; -import fr.ird.observe.entities.referentiel.Program; -import fr.ird.observe.entities.referentiel.Sex; -import fr.ird.observe.entities.referentiel.Species; -import fr.ird.observe.entities.referentiel.SpeciesGroup; -import fr.ird.observe.entities.referentiel.SpeciesList; -import fr.ird.observe.entities.referentiel.Vessel; -import fr.ird.observe.entities.referentiel.VesselSizeCategory; -import fr.ird.observe.entities.referentiel.VesselType; -import fr.ird.observe.entities.referentiel.longline.BaitHaulingStatus; -import fr.ird.observe.entities.referentiel.longline.BaitSettingStatus; -import fr.ird.observe.entities.referentiel.longline.BaitType; -import fr.ird.observe.entities.referentiel.longline.CatchFateLongline; -import fr.ird.observe.entities.referentiel.longline.EncounterType; -import fr.ird.observe.entities.referentiel.longline.Healthness; -import fr.ird.observe.entities.referentiel.longline.HookPosition; -import fr.ird.observe.entities.referentiel.longline.HookSize; -import fr.ird.observe.entities.referentiel.longline.HookType; -import fr.ird.observe.entities.referentiel.longline.ItemHorizontalPosition; -import fr.ird.observe.entities.referentiel.longline.ItemVerticalPosition; -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.MaturityStatus; -import fr.ird.observe.entities.referentiel.longline.MitigationType; -import fr.ird.observe.entities.referentiel.longline.SensorBrand; -import fr.ird.observe.entities.referentiel.longline.SensorDataFormat; -import fr.ird.observe.entities.referentiel.longline.SensorType; -import fr.ird.observe.entities.referentiel.longline.SettingShape; -import fr.ird.observe.entities.referentiel.longline.SizeMeasureType; -import fr.ird.observe.entities.referentiel.longline.StomacFullness; -import fr.ird.observe.entities.referentiel.longline.TripType; -import fr.ird.observe.entities.referentiel.longline.VesselActivityLongline; -import fr.ird.observe.entities.referentiel.longline.WeightMeasureType; -import fr.ird.observe.entities.referentiel.seine.DetectionMode; -import fr.ird.observe.entities.referentiel.seine.ObjectFate; -import fr.ird.observe.entities.referentiel.seine.ObjectOperation; -import fr.ird.observe.entities.referentiel.seine.ObjectType; -import fr.ird.observe.entities.referentiel.seine.ObservedSystem; -import fr.ird.observe.entities.referentiel.seine.ReasonForDiscard; -import fr.ird.observe.entities.referentiel.seine.ReasonForNoFishing; -import fr.ird.observe.entities.referentiel.seine.ReasonForNullSet; -import fr.ird.observe.entities.referentiel.seine.SpeciesFate; -import fr.ird.observe.entities.referentiel.seine.SpeciesStatus; -import fr.ird.observe.entities.referentiel.seine.SurroundingActivity; -import fr.ird.observe.entities.referentiel.seine.TransmittingBuoyOperation; -import fr.ird.observe.entities.referentiel.seine.TransmittingBuoyType; -import fr.ird.observe.entities.referentiel.seine.VesselActivitySeine; -import fr.ird.observe.entities.referentiel.seine.WeightCategory; -import fr.ird.observe.entities.referentiel.seine.Wind; import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.dto.EntityToDtoBuilder; +import fr.ird.observe.services.dto.EntityToReferenceDtoBuilder; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.FormDtos; +import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.ReferenceSetDto; import fr.ird.observe.services.dto.ReferenceSetDtos; -import fr.ird.observe.services.dto.referential.CountryDto; -import fr.ird.observe.services.dto.referential.FpaZoneDto; -import fr.ird.observe.services.dto.referential.GearCaracteristicDto; -import fr.ird.observe.services.dto.referential.GearCaracteristicTypeDto; -import fr.ird.observe.services.dto.referential.GearDto; -import fr.ird.observe.services.dto.referential.HarbourDto; -import fr.ird.observe.services.dto.referential.LengthWeightParameterDto; -import fr.ird.observe.services.dto.referential.OceanDto; -import fr.ird.observe.services.dto.referential.OrganismDto; -import fr.ird.observe.services.dto.referential.PersonDto; -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.dto.referential.ReferentialReferenceDtos; -import fr.ird.observe.services.dto.referential.SexDto; -import fr.ird.observe.services.dto.referential.SpeciesDto; -import fr.ird.observe.services.dto.referential.SpeciesGroupDto; -import fr.ird.observe.services.dto.referential.SpeciesListDto; -import fr.ird.observe.services.dto.referential.VesselDto; -import fr.ird.observe.services.dto.referential.VesselSizeCategoryDto; -import fr.ird.observe.services.dto.referential.VesselTypeDto; -import fr.ird.observe.services.dto.referential.longline.BaitHaulingStatusDto; -import fr.ird.observe.services.dto.referential.longline.BaitSettingStatusDto; -import fr.ird.observe.services.dto.referential.longline.BaitTypeDto; -import fr.ird.observe.services.dto.referential.longline.CatchFateLonglineDto; -import fr.ird.observe.services.dto.referential.longline.EncounterTypeDto; -import fr.ird.observe.services.dto.referential.longline.HealthnessDto; -import fr.ird.observe.services.dto.referential.longline.HookPositionDto; -import fr.ird.observe.services.dto.referential.longline.HookSizeDto; -import fr.ird.observe.services.dto.referential.longline.HookTypeDto; -import fr.ird.observe.services.dto.referential.longline.ItemHorizontalPositionDto; -import fr.ird.observe.services.dto.referential.longline.ItemVerticalPositionDto; -import fr.ird.observe.services.dto.referential.longline.LightsticksColorDto; -import fr.ird.observe.services.dto.referential.longline.LightsticksTypeDto; -import fr.ird.observe.services.dto.referential.longline.LineTypeDto; -import fr.ird.observe.services.dto.referential.longline.MaturityStatusDto; -import fr.ird.observe.services.dto.referential.longline.MitigationTypeDto; -import fr.ird.observe.services.dto.referential.longline.SensorBrandDto; -import fr.ird.observe.services.dto.referential.longline.SensorDataFormatDto; -import fr.ird.observe.services.dto.referential.longline.SensorTypeDto; -import fr.ird.observe.services.dto.referential.longline.SettingShapeDto; -import fr.ird.observe.services.dto.referential.longline.SizeMeasureTypeDto; -import fr.ird.observe.services.dto.referential.longline.StomacFullnessDto; -import fr.ird.observe.services.dto.referential.longline.TripTypeDto; -import fr.ird.observe.services.dto.referential.longline.VesselActivityLonglineDto; -import fr.ird.observe.services.dto.referential.longline.WeightMeasureTypeDto; -import fr.ird.observe.services.dto.referential.seine.DetectionModeDto; -import fr.ird.observe.services.dto.referential.seine.ObjectFateDto; -import fr.ird.observe.services.dto.referential.seine.ObjectOperationDto; -import fr.ird.observe.services.dto.referential.seine.ObjectTypeDto; -import fr.ird.observe.services.dto.referential.seine.ObservedSystemDto; -import fr.ird.observe.services.dto.referential.seine.ReasonForDiscardDto; -import fr.ird.observe.services.dto.referential.seine.ReasonForNoFishingDto; -import fr.ird.observe.services.dto.referential.seine.ReasonForNullSetDto; -import fr.ird.observe.services.dto.referential.seine.SpeciesFateDto; -import fr.ird.observe.services.dto.referential.seine.SpeciesStatusDto; -import fr.ird.observe.services.dto.referential.seine.SurroundingActivityDto; -import fr.ird.observe.services.dto.referential.seine.TransmittingBuoyOperationDto; -import fr.ird.observe.services.dto.referential.seine.TransmittingBuoyTypeDto; -import fr.ird.observe.services.dto.referential.seine.VesselActivitySeineDto; -import fr.ird.observe.services.dto.referential.seine.WeightCategoryDto; -import fr.ird.observe.services.dto.referential.seine.WindDto; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; @@ -137,7 +20,6 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; /** * Created on 16/08/15. @@ -146,130 +28,44 @@ import java.util.Map; */ public class ReferentialServiceTopia extends ObserveServiceTopia implements ReferentialService { - protected static final ImmutableMap<Class<?>, Class<?>> entityToModelTypeCache = new ImmutableMap.Builder<Class<?>, Class<?>>() - - .put(Country.class, CountryDto.class) - .put(FpaZone.class, FpaZoneDto.class) - .put(GearCaracteristic.class, GearCaracteristicDto.class) - .put(GearCaracteristicType.class, GearCaracteristicTypeDto.class) - .put(Gear.class, GearDto.class) - .put(Harbour.class, HarbourDto.class) - .put(LengthWeightParameter.class, LengthWeightParameterDto.class) - .put(Ocean.class, OceanDto.class) - .put(Organism.class, OrganismDto.class) - .put(Person.class, PersonDto.class) - .put(Program.class, ProgramDto.class) - .put(Sex.class, SexDto.class) - .put(Species.class, SpeciesDto.class) - .put(SpeciesGroup.class, SpeciesGroupDto.class) - .put(SpeciesList.class, SpeciesListDto.class) - .put(Vessel.class, VesselDto.class) - .put(VesselSizeCategory.class, VesselSizeCategoryDto.class) - .put(VesselType.class, VesselTypeDto.class) - - .put(DetectionMode.class, DetectionModeDto.class) - .put(ObjectFate.class, ObjectFateDto.class) - .put(ObjectOperation.class, ObjectOperationDto.class) - .put(ObjectType.class, ObjectTypeDto.class) - .put(ObservedSystem.class, ObservedSystemDto.class) - .put(ReasonForDiscard.class, ReasonForDiscardDto.class) - .put(ReasonForNoFishing.class, ReasonForNoFishingDto.class) - .put(ReasonForNullSet.class, ReasonForNullSetDto.class) - .put(SpeciesFate.class, SpeciesFateDto.class) - .put(SpeciesStatus.class, SpeciesStatusDto.class) - .put(SurroundingActivity.class, SurroundingActivityDto.class) - .put(TransmittingBuoyOperation.class, TransmittingBuoyOperationDto.class) - .put(TransmittingBuoyType.class, TransmittingBuoyTypeDto.class) - .put(VesselActivitySeine.class, VesselActivitySeineDto.class) - .put(WeightCategory.class, WeightCategoryDto.class) - .put(Wind.class, WindDto.class) - - .put(BaitHaulingStatus.class, BaitHaulingStatusDto.class) - .put(BaitSettingStatus.class, BaitSettingStatusDto.class) - .put(BaitType.class, BaitTypeDto.class) - .put(CatchFateLongline.class, CatchFateLonglineDto.class) - .put(EncounterType.class, EncounterTypeDto.class) - .put(Healthness.class, HealthnessDto.class) - .put(HookPosition.class, HookPositionDto.class) - .put(HookSize.class, HookSizeDto.class) - .put(HookType.class, HookTypeDto.class) - .put(ItemHorizontalPosition.class, ItemHorizontalPositionDto.class) - .put(ItemVerticalPosition.class, ItemVerticalPositionDto.class) - .put(LightsticksColor.class, LightsticksColorDto.class) - .put(LightsticksType.class, LightsticksTypeDto.class) - .put(LineType.class, LineTypeDto.class) - .put(MaturityStatus.class, MaturityStatusDto.class) - .put(MitigationType.class, MitigationTypeDto.class) - .put(SensorBrand.class, SensorBrandDto.class) - .put(SensorDataFormat.class, SensorDataFormatDto.class) - .put(SensorType.class, SensorTypeDto.class) - .put(SettingShape.class, SettingShapeDto.class) - .put(SizeMeasureType.class, SizeMeasureTypeDto.class) - .put(StomacFullness.class, StomacFullnessDto.class) - .put(TripType.class, TripTypeDto.class) - .put(VesselActivityLongline.class, VesselActivityLonglineDto.class) - .put(WeightMeasureType.class, WeightMeasureTypeDto.class) - - .build(); - - protected static final ImmutableMap<Class<?>, Class<?>> modelToEntityTypeCache; - - static { - - // FIXME Voir si y'a pas une api guava pour ça - ImmutableMap.Builder<Class<?>, Class<?>> builder = new ImmutableMap.Builder<>(); - for (Map.Entry<Class<?>, Class<?>> entry : entityToModelTypeCache.entrySet()) { - builder.put(entry.getValue(), entry.getKey()); - } - modelToEntityTypeCache = builder.build(); - - } - @Override - public <D extends ReferentialDto> ReferenceSetDto getReferentialReferenceSet(Class<D> dtoType) { + public <D extends ReferentialDto> ReferenceSetDto<D> getReferentialReferenceSet(Class<D> dtoType) { Class<TopiaEntity> entityType = getEntityType(dtoType); List<TopiaEntity> entities = loadEntities(entityType); LinkedHashSet<ReferentialReferenceDto<D>> labels = new LinkedHashSet<>(); for (TopiaEntity entity : entities) { - ReferentialReferenceDto<D> dto = ReferentialReferenceDtos.newReferentialReferenceDto(dtoType, serviceContext.getReferentialLocale(), entity); + + ReferentialReferenceDto<D> dto = EntityToReferenceDtoBuilder.buildReferential(dtoType, serviceContext.getReferentialLocale(), entity); labels.add(dto); - } - ReferenceSetDto labelSetDto = ReferenceSetDtos.newReferenceSetDto(dtoType, labels); - return labelSetDto; - } - public <D extends ReferentialDto> ReferenceSetDto getReferentialLabelSet(Class<D> dtoType, String id) { - Class<TopiaEntity> entityType = getEntityType(dtoType); - TopiaEntity entity = loadEntity(dtoType, entityType, id); - LinkedHashSet<ReferentialReferenceDto<D>> labels = new LinkedHashSet<>(1); - ReferentialReferenceDto<D> dto = ReferentialReferenceDtos.newReferentialReferenceDto(dtoType, serviceContext.getReferentialLocale(), entity); - labels.add(dto); + } ReferenceSetDto labelSetDto = ReferenceSetDtos.newReferenceSetDto(dtoType, labels); return labelSetDto; } @Override public <D extends ReferentialDto> FormDto<D> loadToRead(Class<D> dtoType, String id) { - Class<? extends TopiaEntity> entityType = getEntityType(dtoType); + Class<TopiaEntity> entityType = getEntityType(dtoType); TopiaEntity entity = loadEntity(dtoType, entityType, id); - FormDto<D> form = entityToReadReferentialFormDto(dtoType, entity); + FormDto<D> form = entityToReadReferentialFormDto(dtoType, entityType, entity); return form; } + @Override public <D extends ReferentialDto> FormDto<D> loadToEdit(Class<D> dtoType, String id) { - Class<? extends TopiaEntity> entityType = getEntityType(dtoType); + Class<TopiaEntity> entityType = getEntityType(dtoType); TopiaEntity entity = loadEntity(dtoType, entityType, id); - FormDto<D> form = entityToEditReferentialFormDto(dtoType, entity); + FormDto<D> form = entityToEditReferentialFormDto(dtoType, entityType, entity); return form; } @Override public <D extends ReferentialDto> FormDto<D> preCreate(Class<D> dtoType) { - Class<? extends TopiaEntity> entityType = getEntityType(dtoType); + Class<TopiaEntity> entityType = getEntityType(dtoType); TopiaEntity entity = newEntity(entityType); //TODO Voir selon le type d'entité si il y a des valeurs par défaut à utiliser - FormDto<D> form = entityToEditReferentialFormDto(dtoType, entity); + FormDto<D> form = entityToEditReferentialFormDto(dtoType, entityType, entity); return form; } @@ -278,7 +74,7 @@ public class ReferentialServiceTopia extends ObserveServiceTopia implements Refe TopiaEntity entity = referentialDtoToEntity(form.getForm()); Class<TopiaEntity> entityType = getEntityType(dtoType); entity = saveEntity(entityType, entity); - FormDto<D> model = entityToEditReferentialFormDto(dtoType, entity); + FormDto<D> model = entityToEditReferentialFormDto(dtoType, entityType, entity); return model.getForm().getId(); } @@ -337,19 +133,18 @@ public class ReferentialServiceTopia extends ObserveServiceTopia implements Refe } } - protected <D extends ReferentialDto> FormDto<D> entityToEditReferentialFormDto(Class<D> dtoType, TopiaEntity entity) { - try (ReferentialDtoBuilder<D> dtoBuilder = ReferentialDtoBuilder.create(dtoType, serviceContext.getReferentialLocale())) { + protected <E extends TopiaEntity, D extends ReferentialDto> FormDto<D> entityToEditReferentialFormDto(Class<D> dtoType, Class<E> entityType, E entity) { + try (EntityToDtoBuilder<E, D> dtoBuilder = EntityToDtoBuilder.create(entityType, dtoType)) { // copy entity - dtoBuilder.copyEntity(entity); - D dto = dtoBuilder.build(); + D dto = dtoBuilder.build(serviceContext.getReferentialLocale(), entity); // build label sets detected while copy - ImmutableSet<Class<? extends ReferentialDto>> referentialDtoTypes = dtoBuilder.getReferentialDtoTypes(); + ImmutableSet<Class<? extends IdDto>> referentialDtoTypes = dtoBuilder.getReferenceTypes(); ImmutableSet.Builder<ReferenceSetDto> labels = new ImmutableSet.Builder<>(); - for (Class<? extends ReferentialDto> referenceDtoType : referentialDtoTypes) { - ReferenceSetDto referentialLabelSet = getReferentialReferenceSet(referenceDtoType); - labels.add(referentialLabelSet); + for (Class<? extends IdDto> referenceDtoType : referentialDtoTypes) { + ReferenceSetDto referenceSet = getReferentialReferenceSet((Class<ReferentialDto>) referenceDtoType); + labels.add(referenceSet); } FormDto<D> form = FormDtos.newFormDto(dtoType, dto, labels.build()); return form; @@ -357,17 +152,16 @@ public class ReferentialServiceTopia extends ObserveServiceTopia implements Refe } } - protected <D extends ReferentialDto> FormDto<D> entityToReadReferentialFormDto(Class<D> dtoType, TopiaEntity entity) { - try (ReferentialDtoBuilder<D> dtoBuilder = ReferentialDtoBuilder.create(dtoType, serviceContext.getReferentialLocale())) { + protected <E extends TopiaEntity, D extends ReferentialDto> FormDto<D> entityToReadReferentialFormDto(Class<D> dtoType, Class<E> entityType, E entity) { + try (EntityToDtoBuilder<E, D> dtoBuilder = EntityToDtoBuilder.create(entityType, dtoType)) { // copy entity - dtoBuilder.copyEntity(entity); - D dto = dtoBuilder.build(); + D dto = dtoBuilder.build(serviceContext.getReferentialLocale(), entity); // build label sets detected while copy (keep the reference for each label, or nothing if value not set) - ImmutableSet<Class<? extends ReferentialDto>> referentialDtoTypes = dtoBuilder.getReferentialDtoTypes(); + ImmutableSet<Class<? extends IdDto>> referentialDtoTypes = dtoBuilder.getReferenceTypes(); ImmutableSet.Builder<ReferenceSetDto> labels = new ImmutableSet.Builder<>(); - for (Class<? extends ReferentialDto> referentialDtoType : referentialDtoTypes) { + for (Class<? extends IdDto> referentialDtoType : referentialDtoTypes) { ReferenceSetDto referentialLabelSet = ReferenceSetDtos.newEmptyReferenceSetDto(referentialDtoType); labels.add(referentialLabelSet); @@ -386,14 +180,4 @@ public class ReferentialServiceTopia extends ObserveServiceTopia implements Refe return null; } - protected <D extends ReferentialDto, E extends TopiaEntity> Class<E> getEntityType(Class<D> dtoType) { - Class<?> entityType = modelToEntityTypeCache.get(dtoType); - return (Class<E>) entityType; - } - - protected <E extends TopiaEntity, M extends ReferentialDto> Class<M> getDtoType(Class<E> entityType) { - Class<?> modelType = entityToModelTypeCache.get(entityType); - return (Class<M>) modelType; - } - } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java index 8b4cbcb..4ebd5e1 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ApplicationContextResource.java @@ -3,6 +3,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.IObserveConfig; import fr.ird.observe.ObserveApplicationContext; import fr.ird.observe.ObserveServiceHelper; +import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.test.TestHelper; import fr.ird.observe.util.Scripts; import org.apache.commons.logging.Log; @@ -62,6 +63,8 @@ public class ApplicationContextResource implements TestRule { TestHelper.createApplicationContext(); TestHelper.setConfig(IObserveConfig.DB_VERSION, databaseVersion.toString()); + ObserveServiceTopia.init(); + } protected void after(Description description) { diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java index 0424d0e..d0909ec 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialServiceTopiaTest.java @@ -12,6 +12,7 @@ import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.services.dto.referential.LengthWeightParameterDto; import fr.ird.observe.services.dto.referential.ProgramDto; import fr.ird.observe.services.dto.ReferenceSetDto; +import fr.ird.observe.services.dto.referential.ReferentialDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; @@ -62,8 +63,11 @@ public class ReferentialServiceTopiaTest { TopiaContext tx = dataSourceResource.newTransaction("testGetReferentialLabelSet"); - for (Map.Entry<Class<?>, Class<?>> entry : ReferentialServiceTopia.modelToEntityTypeCache.entrySet()) { + for (Map.Entry<Class<?>, Class<?>> entry : ReferentialServiceTopia.getDtoTypes()) { Class dtoType = entry.getKey(); + if (!ReferentialDto.class.isAssignableFrom(dtoType)) { + continue; + } Class entityType = entry.getValue(); TopiaDAO dao = dataSourceResource.getDataSource().getDAO(tx, entityType); @@ -86,9 +90,12 @@ public class ReferentialServiceTopiaTest { TopiaContext tx = dataSourceResource.newTransaction("testLoadToRead"); - for (Map.Entry<Class<?>, Class<?>> entry : ReferentialServiceTopia.modelToEntityTypeCache.entrySet()) { + for (Map.Entry<Class<?>, Class<?>> entry : ReferentialServiceTopia.getDtoTypes()) { Class dtoType = entry.getKey(); + if (!ReferentialDto.class.isAssignableFrom(dtoType)) { + continue; + } Class entityType = entry.getValue(); loadToRead(tx, dtoType, entityType); @@ -101,10 +108,13 @@ public class ReferentialServiceTopiaTest { TopiaContext tx = dataSourceResource.newTransaction("testLoadToEdit"); - for (Map.Entry<Class<?>, Class<?>> entry : ReferentialServiceTopia.modelToEntityTypeCache.entrySet()) { + for (Map.Entry<Class<?>, Class<?>> entry : ReferentialServiceTopia.getDtoTypes()) { Class dtoType = entry.getKey(); Class entityType = entry.getValue(); + if (!ReferentialDto.class.isAssignableFrom(dtoType)) { + continue; + } loadToEdit(tx, dtoType, entityType); } @@ -175,7 +185,7 @@ public class ReferentialServiceTopiaTest { for (ReferenceSetDto labelSetDto : formDto.getLabels()) { - Class refEntityType = ReferentialServiceTopia.modelToEntityTypeCache.get(labelSetDto.getType()); + Class refEntityType = ReferentialServiceTopia.getEntityType(labelSetDto.getType()); long refExpected = dataSourceResource.getDataSource().getDAO(tx, refEntityType).count(); Assert.assertEquals(refExpected, labelSetDto.sizeReference()); diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialDtoBuilderTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/dto/EntityToDtoBuilderTest.java similarity index 88% rename from observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialDtoBuilderTest.java rename to observe-services-topia/src/test/java/fr/ird/observe/services/service/dto/EntityToDtoBuilderTest.java index 94667cd..c587a10 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/ReferentialDtoBuilderTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/dto/EntityToDtoBuilderTest.java @@ -1,4 +1,4 @@ -package fr.ird.observe.services.service; +package fr.ird.observe.services.service.dto; import com.google.common.collect.ImmutableSet; import fr.ird.observe.entities.constants.GearType; @@ -7,6 +7,9 @@ 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.ObserveServiceTopia; +import fr.ird.observe.services.dto.EntityToDtoBuilder; +import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.ReferenceValueNotFoundException; import fr.ird.observe.services.dto.constants.ReferentialLocale; @@ -16,6 +19,7 @@ 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 org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import org.nuiton.util.DateUtil; @@ -24,7 +28,12 @@ import org.nuiton.util.DateUtil; * * @author Tony Chemit - chemit@codelutin.com */ -public class ReferentialDtoBuilderTest { +public class EntityToDtoBuilderTest { + + @BeforeClass + public static void setUp() throws Exception { + ObserveServiceTopia.init(); + } @Test public void testCopy() { @@ -59,10 +68,10 @@ public class ReferentialDtoBuilderTest { organism.setCode("organismCode"); program.setOrganism(organism); - ReferentialDtoBuilder<ProgramDto> builder = ReferentialDtoBuilder.create(ProgramDto.class, ReferentialLocale.FR); - builder.copyEntity(program); - ProgramDto programDto = builder.build(); - ImmutableSet<Class<? extends ReferentialDto>> referentialDtoTypes = builder.getReferentialDtoTypes(); + EntityToDtoBuilder<Program, ProgramDto> builder = EntityToDtoBuilder.create(Program.class, ProgramDto.class); + ProgramDto programDto = builder.build(ReferentialLocale.FR, program); + + ImmutableSet<Class<? extends IdDto>> referentialDtoTypes = builder.getReferenceTypes(); // On verifie les types de listes de labels détectées Assert.assertNotNull(referentialDtoTypes); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.