Search in sources :

Example 1 with UuidToEntityConditionalConverter

use of eu.bcvsolutions.idm.core.config.domain.UuidToEntityConditionalConverter in project CzechIdMng by bcvsolutions.

the class ModelMapperConfig method modelMapper.

@SuppressWarnings("unchecked")
@Bean
public ModelMapper modelMapper() {
    ModelMapper modeler = new ModelMapper();
    modeler.getConfiguration().setMatchingStrategy(// We want use STRICT matching strategy ... others can be ambiguous.
    MatchingStrategies.STRICT).setSkipNullEnabled(// prevent to skip null property values
    false);
    // Convert BaseEntity to UIID (get ID)
    // FIXME: Fix EntityToUuidConditionalConverter field resolving and use conditional converter instead this.
    Converter<? extends BaseEntity, UUID> entityToUuid = new EntityToUuidConverter(modeler, applicationContext);
    // Convert UIID to Entity
    // Conditional converter is using here, because ModelMapper contains bug with
    // skipping converter if source value is null. More here https://redmine.czechidm.com/issues/2271.
    modeler.getConfiguration().getConverters().add(new UuidToEntityConditionalConverter(applicationContext));
    // This converter must be set for only one purpose... workaround fixed
    // error in ModelMapper.
    // When is in DTO field (applicant for example) with type UUID (with
    // conversion to IdmIdentity) and other UUID field (for example
    // modifierId), but with same value as first field, then mapper will be
    // set converted value from first field (applicant) to second field (IdmIdentity to UUID) ->
    // Class cast exception will be throw.
    // + Additionally this converter allows load DTO (by UUID) and put him to embedded map.
    Converter<UUID, UUID> uuidToUuid = new UuidToUuidConverter(applicationContext);
    modeler.createTypeMap(UUID.class, UUID.class).setConverter(uuidToUuid);
    // Converter for resolve problem with 0x00 character in Postgress.
    modeler.createTypeMap(String.class, String.class).setConverter(new StringToStringConverter());
    // Converter OperationResult for resolve problem with 0x00 character in PostgreSQL.
    modeler.createTypeMap(OperationResult.class, OperationResult.class).setConverter(new OperationResultConverter(modeler));
    // Simple ConfigurationMap converter - map without template is not provided by model mapper out of box.
    modeler.createTypeMap(ConfigurationMap.class, ConfigurationMap.class).setConverter(new ConfigurationMapToConfigurationMapConverter());
    // Condition for property ... if is property list and dto is trimmed,
    // then will be not used (set null)
    // or if is property list and have parent dto, then will be to set null
    // (only two levels are allowed).
    Condition<Object, Object> trimListCondition = new Condition<Object, Object>() {

        @Override
        public boolean applies(MappingContext<Object, Object> context) {
            if (List.class.isAssignableFrom(context.getDestinationType())) {
                MappingContext<?, ?> parentContext = context.getParent();
                MappingContext<?, ?> superContext = parentContext != null ? parentContext.getParent() : null;
                if (superContext != null) {
                    if (parentContext != null && parentContext.getDestination() instanceof AbstractDto) {
                        ((AbstractDto) parentContext.getDestination()).setTrimmed(true);
                    }
                    return false;
                }
                if (parentContext != null && parentContext.getDestination() instanceof AbstractDto && ((AbstractDto) parentContext.getDestination()).isTrimmed()) {
                    return false;
                }
            }
            return true;
        }
    };
    modeler.getConfiguration().setPropertyCondition(trimListCondition);
    // entity to uuid converters will be set for all entities
    entityManager.getMetamodel().getEntities().forEach(entityType -> {
        if (entityType.getJavaType() == null) {
            return;
        }
        @SuppressWarnings("rawtypes") TypeMap typeMapEntityToUuid = modeler.createTypeMap(entityType.getJavaType(), UUID.class);
        typeMapEntityToUuid.setConverter(entityToUuid);
    });
    // configure default type map for entities
    // this behavior must be placed in this class, not in toDto methods (getEmbedded use mapper for map entity to dto)
    // identity role and backward compatibility with automatic role
    TypeMap<IdmIdentityRole, IdmIdentityRoleDto> typeMapIdentityRole = modeler.getTypeMap(IdmIdentityRole.class, IdmIdentityRoleDto.class);
    if (typeMapIdentityRole == null) {
        modeler.createTypeMap(IdmIdentityRole.class, IdmIdentityRoleDto.class);
        typeMapIdentityRole = modeler.getTypeMap(IdmIdentityRole.class, IdmIdentityRoleDto.class);
        typeMapIdentityRole.addMappings(new PropertyMap<IdmIdentityRole, IdmIdentityRoleDto>() {

            @Override
            protected void configure() {
                this.skip().setAutomaticRole(null);
            }
        });
    }
    // concept role request and automatic role backward compatibility
    TypeMap<IdmConceptRoleRequest, IdmConceptRoleRequestDto> typeMapRoleConcept = modeler.getTypeMap(IdmConceptRoleRequest.class, IdmConceptRoleRequestDto.class);
    if (typeMapRoleConcept == null) {
        modeler.createTypeMap(IdmConceptRoleRequest.class, IdmConceptRoleRequestDto.class);
        typeMapRoleConcept = modeler.getTypeMap(IdmConceptRoleRequest.class, IdmConceptRoleRequestDto.class);
        typeMapRoleConcept.addMappings(new PropertyMap<IdmConceptRoleRequest, IdmConceptRoleRequestDto>() {

            @Override
            protected void configure() {
                this.skip().setAutomaticRole(null);
            }
        });
    }
    // 
    return modeler;
}
Also used : UuidToEntityConditionalConverter(eu.bcvsolutions.idm.core.config.domain.UuidToEntityConditionalConverter) IdmConceptRoleRequest(eu.bcvsolutions.idm.core.model.entity.IdmConceptRoleRequest) OperationResult(eu.bcvsolutions.idm.core.api.entity.OperationResult) OperationResultConverter(eu.bcvsolutions.idm.core.config.domain.OperationResultConverter) EntityToUuidConverter(eu.bcvsolutions.idm.core.config.domain.EntityToUuidConverter) MappingContext(org.modelmapper.spi.MappingContext) IdmIdentityRole(eu.bcvsolutions.idm.core.model.entity.IdmIdentityRole) AbstractDto(eu.bcvsolutions.idm.core.api.dto.AbstractDto) UuidToUuidConverter(eu.bcvsolutions.idm.core.config.domain.UuidToUuidConverter) IdmConceptRoleRequestDto(eu.bcvsolutions.idm.core.api.dto.IdmConceptRoleRequestDto) UUID(java.util.UUID) Condition(org.modelmapper.Condition) ModelMapper(org.modelmapper.ModelMapper) StringToStringConverter(eu.bcvsolutions.idm.core.config.domain.StringToStringConverter) ConfigurationMap(eu.bcvsolutions.idm.core.api.domain.ConfigurationMap) ConfigurationMapToConfigurationMapConverter(eu.bcvsolutions.idm.core.config.domain.ConfigurationMapToConfigurationMapConverter) IdmIdentityRoleDto(eu.bcvsolutions.idm.core.api.dto.IdmIdentityRoleDto) TypeMap(org.modelmapper.TypeMap) Bean(org.springframework.context.annotation.Bean)

Aggregations

ConfigurationMap (eu.bcvsolutions.idm.core.api.domain.ConfigurationMap)1 AbstractDto (eu.bcvsolutions.idm.core.api.dto.AbstractDto)1 IdmConceptRoleRequestDto (eu.bcvsolutions.idm.core.api.dto.IdmConceptRoleRequestDto)1 IdmIdentityRoleDto (eu.bcvsolutions.idm.core.api.dto.IdmIdentityRoleDto)1 OperationResult (eu.bcvsolutions.idm.core.api.entity.OperationResult)1 ConfigurationMapToConfigurationMapConverter (eu.bcvsolutions.idm.core.config.domain.ConfigurationMapToConfigurationMapConverter)1 EntityToUuidConverter (eu.bcvsolutions.idm.core.config.domain.EntityToUuidConverter)1 OperationResultConverter (eu.bcvsolutions.idm.core.config.domain.OperationResultConverter)1 StringToStringConverter (eu.bcvsolutions.idm.core.config.domain.StringToStringConverter)1 UuidToEntityConditionalConverter (eu.bcvsolutions.idm.core.config.domain.UuidToEntityConditionalConverter)1 UuidToUuidConverter (eu.bcvsolutions.idm.core.config.domain.UuidToUuidConverter)1 IdmConceptRoleRequest (eu.bcvsolutions.idm.core.model.entity.IdmConceptRoleRequest)1 IdmIdentityRole (eu.bcvsolutions.idm.core.model.entity.IdmIdentityRole)1 UUID (java.util.UUID)1 Condition (org.modelmapper.Condition)1 ModelMapper (org.modelmapper.ModelMapper)1 TypeMap (org.modelmapper.TypeMap)1 MappingContext (org.modelmapper.spi.MappingContext)1 Bean (org.springframework.context.annotation.Bean)1