package eu.eudat.model.builder.commonmodels.description; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commonmodels.enums.DescriptionStatus; import eu.eudat.commonmodels.models.description.DescriptionModel; import eu.eudat.commonmodels.models.descriptiotemplate.DescriptionTemplateModel; import eu.eudat.commonmodels.models.dmp.DmpModel; import eu.eudat.commons.JsonHandlingService; import eu.eudat.commons.XmlHandlingService; import eu.eudat.commons.types.description.PropertyDefinitionEntity; import eu.eudat.commons.types.descriptiontemplate.DefinitionEntity; import eu.eudat.convention.ConventionService; import eu.eudat.data.DescriptionEntity; import eu.eudat.data.DescriptionTemplateEntity; import eu.eudat.data.DmpDescriptionTemplateEntity; import eu.eudat.data.DmpEntity; import eu.eudat.model.DescriptionTemplate; import eu.eudat.model.DmpDescriptionTemplate; import eu.eudat.model.builder.commonmodels.BaseCommonModelBuilder; import eu.eudat.model.builder.commonmodels.CommonModelBuilderItemResponse; import eu.eudat.model.builder.commonmodels.dmp.DmpCommonModelBuilder; import eu.eudat.model.builder.commonmodels.descriptiontemplate.DescriptionTemplateCommonModelBuilder; import eu.eudat.query.*; import eu.eudat.service.visibility.VisibilityService; import eu.eudat.service.visibility.VisibilityServiceImpl; 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 DescriptionCommonModelBuilder extends BaseCommonModelBuilder { 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 DescriptionCommonModelBuilder( ConventionService conventionService, QueryFactory queryFactory, BuilderFactory builderFactory, JsonHandlingService jsonHandlingService, XmlHandlingService xmlHandlingService) { super(conventionService, new LoggerService(LoggerFactory.getLogger(DescriptionCommonModelBuilder.class))); this.queryFactory = queryFactory; this.builderFactory = builderFactory; this.jsonHandlingService = jsonHandlingService; this.xmlHandlingService = xmlHandlingService; } public DescriptionCommonModelBuilder authorize(EnumSet values) { this.authorize = values; return this; } private boolean useSharedStorage; public DescriptionCommonModelBuilder useSharedStorage(boolean useSharedStorage) { this.useSharedStorage = useSharedStorage; 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<>(); Map descriptionTemplates = this.collectDescriptionTemplates(data); Map dmps = this.collectDmps(data); Map definitionEntityMap = this.collectDescriptionTemplateDefinitions(data); Map dmpDescriptionTemplateSections = this.collectDmpDescriptionTemplateSections(data); List> models = new ArrayList<>(); for (DescriptionEntity d : data) { DescriptionModel m = new DescriptionModel(); m.setId(d.getId()); m.setLabel(d.getLabel()); m.setDescription(d.getDescription()); switch (d.getStatus()){ case Finalized -> m.setStatus(DescriptionStatus.Finalized); case Draft -> m.setStatus(DescriptionStatus.Draft); case Canceled -> m.setStatus(DescriptionStatus.Canceled); default -> throw new MyApplicationException("unrecognized type " + d.getStatus()); } m.setCreatedAt(d.getCreatedAt()); m.setDescription(d.getDescription()); if (dmps != null && d.getDmpId() != null && dmps.containsKey(d.getDmpId())) m.setDmp(dmps.get(d.getDmpId())); if (dmpDescriptionTemplateSections != null && d.getDmpDescriptionTemplateId() != null && dmpDescriptionTemplateSections.containsKey(d.getDmpDescriptionTemplateId())) m.setSectionId(dmpDescriptionTemplateSections.get(d.getDmpDescriptionTemplateId())); if (descriptionTemplates != null && d.getDescriptionTemplateId() != null && descriptionTemplates.containsKey(d.getDescriptionTemplateId())) m.setDescriptionTemplate(descriptionTemplates.get(d.getDescriptionTemplateId())); if (d.getProperties() != null){ PropertyDefinitionEntity propertyDefinition = this.jsonHandlingService.fromJsonSafe(PropertyDefinitionEntity.class, d.getProperties()); DefinitionEntity definition = definitionEntityMap != null ? definitionEntityMap.getOrDefault(d.getDescriptionTemplateId(), null) : null; m.setProperties(this.builderFactory.builder(PropertyDefinitionCommonModelBuilder.class).useSharedStorage(useSharedStorage).withDefinition(definition).authorize(this.authorize).build(propertyDefinition)); VisibilityService visibilityService = new VisibilityServiceImpl(definition, propertyDefinition); m.setVisibilityStates(this.builderFactory.builder(VisibilityStateModelBuilder.class).authorize(this.authorize).build(visibilityService.getVisibilityStates().entrySet().stream().toList())); } models.add(new CommonModelBuilderItemResponse<>(m, d)); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); return models; } private Map collectDescriptionTemplateDefinitions(List data) throws MyApplicationException { if (data.isEmpty()) return null; this.logger.debug("checking related - {}", DefinitionEntity.class.getSimpleName()); Map itemMap = new HashMap<>(); DescriptionTemplateQuery q = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(this.authorize).ids(data.stream().map(DescriptionEntity::getDescriptionTemplateId).distinct().collect(Collectors.toList())); List items = q.collectAs(new BaseFieldSet().ensure(eu.eudat.model.DescriptionTemplate._id).ensure(DescriptionTemplate._definition)); for (DescriptionTemplateEntity item : items){ DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(DefinitionEntity.class, item.getDefinition()); itemMap.put(item.getId(), definition); } return itemMap; } private Map collectDmpDescriptionTemplateSections(List data) throws MyApplicationException { if (data.isEmpty()) return null; this.logger.debug("checking related - {}", DefinitionEntity.class.getSimpleName()); Map itemMap = new HashMap<>(); DmpDescriptionTemplateQuery q = this.queryFactory.query(DmpDescriptionTemplateQuery.class).authorize(this.authorize).ids(data.stream().map(DescriptionEntity::getDmpDescriptionTemplateId).distinct().collect(Collectors.toList())); List items = q.collectAs(new BaseFieldSet().ensure(eu.eudat.model.DmpDescriptionTemplate._id).ensure(DmpDescriptionTemplate._sectionId)); for (DmpDescriptionTemplateEntity item : items){ itemMap.put(item.getId(), item.getSectionId()); } return itemMap; } private Map collectDmps(List data) throws MyApplicationException { if (data.isEmpty()) return null; this.logger.debug("checking related - {}", DmpModel.class.getSimpleName()); Map itemMap; DmpQuery q = this.queryFactory.query(DmpQuery.class).authorize(this.authorize).ids(data.stream().map(DescriptionEntity::getDmpId).distinct().collect(Collectors.toList())); itemMap = this.builderFactory.builder(DmpCommonModelBuilder.class).useSharedStorage(useSharedStorage).setDisableDescriptions(true).authorize(this.authorize).asForeignKey(q, DmpEntity::getId); return itemMap; } private Map collectDescriptionTemplates(List data) throws MyApplicationException { if (data.isEmpty()) return null; this.logger.debug("checking related - {}", DescriptionTemplateModel.class.getSimpleName()); Map itemMap; DescriptionTemplateQuery q = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(this.authorize).ids(data.stream().map(DescriptionEntity::getDescriptionTemplateId).distinct().collect(Collectors.toList())); itemMap = this.builderFactory.builder(DescriptionTemplateCommonModelBuilder.class).authorize(this.authorize).asForeignKey(q, DescriptionTemplateEntity::getId); return itemMap; } }