package eu.eudat.model.builder.filetransformer; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.JsonHandlingService; import eu.eudat.commons.XmlHandlingService; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.types.description.PropertyDefinitionEntity; import eu.eudat.convention.ConventionService; import eu.eudat.data.*; import eu.eudat.depositinterface.models.DescriptionDepositModel; import eu.eudat.file.transformer.enums.DescriptionStatus; import eu.eudat.file.transformer.models.description.DescriptionFileTransformerModel; import eu.eudat.file.transformer.models.description.DescriptionReferenceFileTransformerModel; import eu.eudat.file.transformer.models.description.DescriptionTagFileTransformerModel; import eu.eudat.file.transformer.models.descriptiontemplate.DescriptionTemplateFileTransformerModel; import eu.eudat.file.transformer.models.dmp.DmpFileTransformerModel; import eu.eudat.file.transformer.models.dmp.DmpReferenceFileTransformerModel; import eu.eudat.file.transformer.models.reference.ReferenceFileTransformerModel; import eu.eudat.file.transformer.models.tag.TagFileTransformerModel; import eu.eudat.file.transformer.models.user.UserFileTransformerModel; import eu.eudat.model.DescriptionReference; import eu.eudat.model.DescriptionTemplate; import eu.eudat.model.DmpReference; import eu.eudat.model.Tag; import eu.eudat.model.builder.TagBuilder; import eu.eudat.query.*; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.exception.MyApplicationException; import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.logging.LoggerService; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.*; import java.util.stream.Collectors; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class DescriptionFileTransformerBuilder extends BaseFileTransformerBuilder { private final QueryFactory queryFactory; private final BuilderFactory builderFactory; private final JsonHandlingService jsonHandlingService; private final XmlHandlingService xmlHandlingService; private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired public DescriptionFileTransformerBuilder( ConventionService conventionService, QueryFactory queryFactory, BuilderFactory builderFactory, JsonHandlingService jsonHandlingService, XmlHandlingService xmlHandlingService) { super(conventionService, new LoggerService(LoggerFactory.getLogger(DescriptionFileTransformerBuilder.class))); this.queryFactory = queryFactory; this.builderFactory = builderFactory; this.jsonHandlingService = jsonHandlingService; this.xmlHandlingService = xmlHandlingService; } public DescriptionFileTransformerBuilder authorize(EnumSet values) { this.authorize = values; return this; } @Override protected List> buildInternal(List data) throws MyApplicationException { this.logger.debug("building for {}", Optional.ofNullable(data).map(List::size).orElse(0)); if (data == null || data.isEmpty()) return new ArrayList<>(); List definitionMap = this.collectDescriptionTemplates(data); Map> referenceMap = collectReferences(data); Map> tagMap = collectTags(data); DmpFileTransformerModel dmp = this.getDmp(data.get(0).getDmpId()); List> models = new ArrayList<>(); for (DescriptionEntity d : data) { DescriptionFileTransformerModel m = new DescriptionFileTransformerModel(); m.setId(d.getId()); m.setLabel(d.getLabel()); m.setDescription(d.getDescription()); m.setCreatedAt(d.getCreatedAt()); m.setFinalizedAt(d.getFinalizedAt()); m.setUpdatedAt(d.getUpdatedAt()); m.setStatus(DescriptionStatus.of(d.getStatus().getValue())); if (d.getProperties() != null){ PropertyDefinitionEntity propertyDefinition = this.jsonHandlingService.fromJsonSafe(PropertyDefinitionEntity.class, d.getProperties()); if (definitionMap != null && definitionMap.stream().anyMatch(dt -> dt.getId().equals(d.getDescriptionTemplateId())) && propertyDefinition != null && !this.conventionService.isListNullOrEmpty(propertyDefinition.getFields())) m.setDescriptionTemplate(this.builderFactory.builder(DescriptionFieldFileTransformerBuilder.class).authorize(this.authorize).setDefinition(definitionMap.stream().filter(dm -> dm.getId().equals(d.getDescriptionTemplateId())).findFirst().get()).build(propertyDefinition.getFields()).get(0)); } if (referenceMap != null && !referenceMap.isEmpty() && referenceMap.containsKey(d.getId())) m.setDescriptionReferenceFileTransformerModels(referenceMap.get(d.getId())); if (tagMap != null && !tagMap.isEmpty() && tagMap.containsKey(d.getId())) m.setDescriptionTagFileTransformerModels(tagMap.get(d.getId())); m.setDmp(dmp); models.add(new FileTransformerBuilderItemResponse<>(m, d)); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); return models; } private DmpFileTransformerModel getDmp(UUID id) { DmpQuery query = queryFactory.query(DmpQuery.class).authorize(authorize).isActive(IsActive.Active).ids(id); return builderFactory.builder(DmpFileTransformerBuilder.class).ignoreDescriptions(true).authorize(authorize).build(query.first()); } private List collectDescriptionTemplates(List data) throws MyApplicationException { if (data.isEmpty()) return null; this.logger.debug("checking related - {}", DescriptionTemplate.class.getSimpleName()); List descriptionTemplateEntities = this.queryFactory.query(DescriptionTemplateQuery.class).isActive(IsActive.Active).authorize(this.authorize).ids(data.stream().map(DescriptionEntity::getDescriptionTemplateId).distinct().collect(Collectors.toList())).collectAs(new BaseFieldSet().ensure(DescriptionTemplate._id).ensure(DescriptionTemplate._definition)); return this.builderFactory.builder(DescriptionTemplateFileTransformerBuilder.class).authorize(authorize).build(descriptionTemplateEntities); } private Map> collectReferences(List data) throws MyApplicationException { if (data.isEmpty()) return null; this.logger.debug("checking related - {}", DmpReference.class.getSimpleName()); List descriptionReferences = this.queryFactory.query(DescriptionReferenceQuery.class).authorize(this.authorize).descriptionIds(data.stream().map(DescriptionEntity::getId).distinct().collect(Collectors.toList())).collectAs(new BaseFieldSet().ensure(DescriptionReference._description).ensure(DescriptionReference._reference)); Map> itemMap = new HashMap<>(); ReferenceQuery query = this.queryFactory.query(ReferenceQuery.class).authorize(this.authorize).isActive(IsActive.Active).ids(descriptionReferences.stream().map(DescriptionReferenceEntity::getReferenceId).distinct().collect(Collectors.toList())); Map referenceDepositModelMap = this.builderFactory.builder(ReferenceFileTransformerBuilder.class).authorize(this.authorize).asForeignKey(query, ReferenceEntity::getId); if (referenceDepositModelMap == null) return null; for (DescriptionReferenceEntity descriptionReference : descriptionReferences) { DescriptionReferenceFileTransformerModel descriptionReferenceFileTransformerModel = new DescriptionReferenceFileTransformerModel(); descriptionReferenceFileTransformerModel.setId(descriptionReference.getId()); descriptionReferenceFileTransformerModel.setReference(referenceDepositModelMap.getOrDefault(descriptionReference.getReferenceId(), null)); DescriptionReferenceFileTransformerModel model = descriptionReferenceFileTransformerModel; if (model == null) continue; UUID key = descriptionReference.getDescriptionId(); if (!itemMap.containsKey(key)) itemMap.put(key, new ArrayList<>()); itemMap.get(key).add(model); } return itemMap; } private Map> collectTags(List data) { if (data.isEmpty()) return null; List descriptionTags = this.queryFactory.query(DescriptionTagQuery.class).authorize(this.authorize).descriptionIds(data.stream().map(DescriptionEntity::getId).distinct().toList()).collect(); Map> itemMap = new HashMap<>(); TagQuery query = this.queryFactory.query(TagQuery.class).authorize(this.authorize).isActive(IsActive.Active).ids(descriptionTags.stream().map(DescriptionTagEntity::getTagId).distinct().toList()); Map tagMap = this.builderFactory.builder(TagFileTransformerBuilder.class).asForeignKey(query, TagEntity::getId); for (DescriptionTagEntity descriptionTag : descriptionTags) { DescriptionTagFileTransformerModel descriptionTagFileTransformerModel = new DescriptionTagFileTransformerModel(); descriptionTagFileTransformerModel.setId(descriptionTag.getId()); descriptionTagFileTransformerModel.setTagFileTransformerModel(tagMap.getOrDefault(descriptionTag.getTagId(), null)); DescriptionTagFileTransformerModel model = descriptionTagFileTransformerModel; if (model == null) continue; UUID key = descriptionTag.getDescriptionId(); if (!itemMap.containsKey(key)) itemMap.put(key, new ArrayList<>()); itemMap.get(key).add(model); } return itemMap; } }