From 02c3ed7563ce402a574ac67f7b701bf44031167c Mon Sep 17 00:00:00 2001 From: amentis Date: Tue, 9 Apr 2024 16:15:15 +0300 Subject: [PATCH] create list of static external fetcher items --- ...StaticOptionSourceConfigurationEntity.java | 14 +- .../types/externalfetcher/StaticEntity.java | 22 +++ ...taticOptionSourceConfigurationBuilder.java | 6 +- .../externalfetcher/StaticBuilder.java | 65 ++++++++ ...enceTypeSourceBaseConfigurationCensor.java | 2 +- ...etcherStaticOptionSourceConfiguration.java | 12 +- .../eudat/model/externalfetcher/Static.java | 18 +++ ...taticOptionSourceConfigurationPersist.java | 30 ++-- .../externalfetcher/StaticOptionPersist.java | 8 +- .../externalfetcher/StaticPersist.java | 65 ++++++++ .../ExternalFetcherServiceImpl.java | 33 +++-- .../SourceStaticOptionConfiguration.java | 4 +- .../config/entities/Static.java | 8 + .../external-fetcher/external-fetcher.ts | 8 + .../reference-type-editor.component.html | 2 +- .../editor/reference-type-editor.component.ts | 45 ------ .../editor/reference-type-editor.model.ts | 15 -- .../editor/reference-type-editor.resolver.ts | 6 +- .../external-fetcher-source-editor.model.ts | 107 +++++++++++--- .../external-fetcher-source.component.html | 139 ++++++++++-------- .../external-fetcher-source.component.scss | 18 +++ .../external-fetcher-source.component.ts | 48 ++++-- dmp-frontend/src/assets/i18n/en.json | 40 +++-- 23 files changed, 507 insertions(+), 208 deletions(-) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/StaticEntity.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/StaticBuilder.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/Static.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticPersist.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/config/entities/Static.java diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationEntity.java b/dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationEntity.java index a593766e8..91f4a658e 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationEntity.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationEntity.java @@ -6,17 +6,17 @@ import jakarta.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class ExternalFetcherStaticOptionSourceConfigurationEntity extends ExternalFetcherBaseSourceConfigurationEntity implements SourceStaticOptionConfiguration { +public class ExternalFetcherStaticOptionSourceConfigurationEntity extends ExternalFetcherBaseSourceConfigurationEntity implements SourceStaticOptionConfiguration { - List options; + List items; - public List getOptions() { - return options; + public List getItems() { + return items; } @XmlElementWrapper - @XmlElement(name = "option") - public void setOptions(List options) { - this.options = options; + @XmlElement(name = "item") + public void setItems(List options) { + this.items = options; } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/StaticEntity.java b/dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/StaticEntity.java new file mode 100644 index 000000000..9c4ef0950 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/types/externalfetcher/StaticEntity.java @@ -0,0 +1,22 @@ +package eu.eudat.commons.types.externalfetcher; + +import eu.eudat.service.externalfetcher.config.entities.Static; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; + +import java.util.List; + +public class StaticEntity implements Static { + + private List options; + + public List getOptions() { + return options; + } + + @XmlElementWrapper + @XmlElement(name = "option") + public void setOptions(List options) { + this.options = options; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationBuilder.java index cb10a0215..8c78b6537 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationBuilder.java @@ -42,12 +42,12 @@ public class ExternalFetcherStaticOptionSourceConfigurationBuilder extends Exter @Override protected ExternalFetcherStaticOptionSourceConfiguration buildChild(FieldSet fields, ExternalFetcherStaticOptionSourceConfigurationEntity d, ExternalFetcherStaticOptionSourceConfiguration m) { - FieldSet optionsFields = fields.extractPrefixed(this.asPrefix(ExternalFetcherStaticOptionSourceConfiguration._options)); + FieldSet itemsFields = fields.extractPrefixed(this.asPrefix(ExternalFetcherStaticOptionSourceConfiguration._items)); if(!authorizationService.authorize(Permission.EditReferenceType)) return m; - if (!optionsFields.isEmpty() && d.getOptions() != null) { - m.setOptions(this.builderFactory.builder(StaticOptionBuilder.class).authorize(this.authorize).build(optionsFields, d.getOptions())); + if (!itemsFields.isEmpty() && d.getItems() != null) { + m.setItems(this.builderFactory.builder(StaticBuilder.class).authorize(this.authorize).build(itemsFields, d.getItems())); } return m; diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/StaticBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/StaticBuilder.java new file mode 100644 index 000000000..6f41497a6 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/externalfetcher/StaticBuilder.java @@ -0,0 +1,65 @@ +package eu.eudat.model.builder.externalfetcher; + +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.types.externalfetcher.StaticEntity; +import eu.eudat.convention.ConventionService; +import eu.eudat.model.builder.BaseBuilder; +import eu.eudat.model.externalfetcher.Static; +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.FieldSet; +import gr.cite.tools.logging.DataLogEntry; +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.*; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class StaticBuilder extends BaseBuilder { + + private final BuilderFactory builderFactory; + private final QueryFactory queryFactory; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); + + @Autowired + public StaticBuilder( + ConventionService conventionService, BuilderFactory builderFactory, QueryFactory queryFactory) { + super(conventionService, new LoggerService(LoggerFactory.getLogger(QueryCaseConfigBuilder.class))); + this.builderFactory = builderFactory; + this.queryFactory = queryFactory; + } + + public StaticBuilder authorize(EnumSet values) { + this.authorize = values; + return this; + } + + @Override + public List build(FieldSet fields, List data) throws MyApplicationException { + this.logger.debug("building for {} items requesting {} fields", Optional.ofNullable(data).map(List::size).orElse(0), Optional.ofNullable(fields).map(FieldSet::getFields).map(Set::size).orElse(0)); + this.logger.trace(new DataLogEntry("requested fields", fields)); + if (fields == null || data == null || fields.isEmpty()) + return new ArrayList<>(); + + FieldSet optionsFields = fields.extractPrefixed(this.asPrefix(Static._options)); + + List models = new ArrayList<>(); + for (StaticEntity d : data) { + Static m = new Static(); + if (!optionsFields.isEmpty() && d.getOptions() != null) { + m.setOptions(this.builderFactory.builder(StaticOptionBuilder.class).authorize(this.authorize).build(optionsFields, d.getOptions())); + } + + models.add(m); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); + return models; + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/referencetypedefinition/ReferenceTypeSourceBaseConfigurationCensor.java b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/referencetypedefinition/ReferenceTypeSourceBaseConfigurationCensor.java index c71617133..b3c9b62ec 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/censorship/referencetypedefinition/ReferenceTypeSourceBaseConfigurationCensor.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/censorship/referencetypedefinition/ReferenceTypeSourceBaseConfigurationCensor.java @@ -44,7 +44,7 @@ public class ReferenceTypeSourceBaseConfigurationCensor extends BaseCensor { FieldSet referenceTypeDependencyFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalFetcherBaseSourceConfiguration._referenceTypeDependencies)); this.censorFactory.censor(ReferenceTypeCensor.class).censor(referenceTypeDependencyFields, userId); - FieldSet optionsFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalFetcherStaticOptionSourceConfiguration._options)); + FieldSet optionsFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalFetcherStaticOptionSourceConfiguration._items)); this.censorFactory.censor(ReferenceTypeStaticOptionCensor.class).censor(optionsFields, userId); FieldSet authFields = fields.extractPrefixed(this.asIndexerPrefix(ExternalFetcherApiSourceConfiguration._auth)); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/ExternalFetcherStaticOptionSourceConfiguration.java b/dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/ExternalFetcherStaticOptionSourceConfiguration.java index 76493ddd0..6d56b7edf 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/ExternalFetcherStaticOptionSourceConfiguration.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/ExternalFetcherStaticOptionSourceConfiguration.java @@ -5,14 +5,14 @@ import java.util.List; public class ExternalFetcherStaticOptionSourceConfiguration extends ExternalFetcherBaseSourceConfiguration { - public final static String _options = "options"; - List options; + public final static String _items = "items"; + List items; - public List getOptions() { - return options; + public List getItems() { + return items; } - public void setOptions(List options) { - this.options = options; + public void setItems(List items) { + this.items = items; } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/Static.java b/dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/Static.java new file mode 100644 index 000000000..6acb27841 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/externalfetcher/Static.java @@ -0,0 +1,18 @@ +package eu.eudat.model.externalfetcher; + + +import java.util.List; + +public class Static { + + private List options; + public final static String _options = "options"; + + public List getOptions() { + return options; + } + + public void setOptions(List options) { + this.options = options; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationPersist.java index de1e85e55..f7912b35a 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/ExternalFetcherStaticOptionSourceConfigurationPersist.java @@ -7,22 +7,25 @@ import eu.eudat.errorcode.ErrorThesaurusProperties; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Scope; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; +import java.util.Arrays; import java.util.List; public class ExternalFetcherStaticOptionSourceConfigurationPersist extends ExternalFetcherBaseSourceConfigurationPersist { - List options; + List items; - public static final String _options = "options"; + public static final String _items = "items"; - public List getOptions() { - return options; + + public List getItems() { + return items; } - public void setOptions(List options) { - this.options = options; + public void setItems(List items) { + this.items = items; } @Component(ExternalFetcherStaticOptionSourceConfigurationPersistValidator.ValidatorName) @@ -43,13 +46,16 @@ public class ExternalFetcherStaticOptionSourceConfigurationPersist extends Exter @Override protected List specifications(ExternalFetcherStaticOptionSourceConfigurationPersist item) { List specifications = getBaseSpecifications(item); - specifications.add( + specifications.addAll(Arrays.asList( + this.spec() + .must(() -> !this.isListNullOrEmpty(item.getItems())) + .failOn(ExternalFetcherStaticOptionSourceConfigurationPersist._items).failWith(messageSource.getMessage("Validation_Required", new Object[]{ExternalFetcherStaticOptionSourceConfigurationPersist._items}, LocaleContextHolder.getLocale())), this.navSpec() - .iff(() -> !this.isListNullOrEmpty(item.getOptions())) - .on(ExternalFetcherStaticOptionSourceConfigurationPersist._options) - .over(item.getOptions()) - .using((itm) -> this.validatorFactory.validator(StaticOptionPersist.ReferenceTypeStaticOptionPersistValidator.class)) - ); + .iff(() -> !this.isListNullOrEmpty(item.getItems())) + .on(ExternalFetcherStaticOptionSourceConfigurationPersist._items) + .over(item.getItems()) + .using((itm) -> this.validatorFactory.validator(StaticPersist.StaticPersistValidator.class)) + )); return specifications; } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticOptionPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticOptionPersist.java index 8ee5c9e19..e47632773 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticOptionPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticOptionPersist.java @@ -39,15 +39,15 @@ public class StaticOptionPersist { this.value = value; } - @Component(ReferenceTypeStaticOptionPersistValidator.ValidatorName) + @Component(StaticOptionPersistValidator.ValidatorName) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public static class ReferenceTypeStaticOptionPersistValidator extends BaseValidator { + public static class StaticOptionPersistValidator extends BaseValidator { - public static final String ValidatorName = "ReferenceTypeStaticOptionPersistValidator"; + public static final String ValidatorName = "StaticOptionPersistValidator"; private final MessageSource messageSource; - protected ReferenceTypeStaticOptionPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { + protected StaticOptionPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { super(conventionService, errors); this.messageSource = messageSource; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticPersist.java new file mode 100644 index 000000000..f90ffb32a --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/externalfetcher/StaticPersist.java @@ -0,0 +1,65 @@ +package eu.eudat.model.persist.externalfetcher; + +import eu.eudat.commons.validation.BaseValidator; +import eu.eudat.convention.ConventionService; +import eu.eudat.errorcode.ErrorThesaurusProperties; +import gr.cite.tools.validation.ValidatorFactory; +import gr.cite.tools.validation.specification.Specification; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Scope; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +public class StaticPersist { + + private List options; + public final static String _options = "options"; + + public List getOptions() { + return options; + } + + public void setOptions(List options) { + this.options = options; + } + + @Component(StaticPersistValidator.ValidatorName) + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public static class StaticPersistValidator extends BaseValidator { + + public static final String ValidatorName = "StaticPersistValidatorValidator"; + + private final MessageSource messageSource; + private final ValidatorFactory validatorFactory; + + protected StaticPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, ValidatorFactory validatorFactory) { + super(conventionService, errors); + this.messageSource = messageSource; + this.validatorFactory = validatorFactory; + } + + @Override + protected Class modelClass() { + return StaticPersist.class; + } + + @Override + protected List specifications(StaticPersist item) { + return Arrays.asList( + this.spec() + .must(() -> !this.isListNullOrEmpty(item.getOptions())) + .failOn(StaticPersist._options).failWith(messageSource.getMessage("Validation_Required", new Object[]{StaticPersist._options}, LocaleContextHolder.getLocale())), + this.navSpec() + .iff(() -> !this.isListNullOrEmpty(item.getOptions())) + .on(StaticPersist._options) + .over(item.getOptions()) + .using((itm) -> this.validatorFactory.validator(StaticOptionPersist.StaticOptionPersistValidator.class)) + ); + } + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/ExternalFetcherServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/ExternalFetcherServiceImpl.java index 2b06a74d8..058908a7e 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/ExternalFetcherServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/ExternalFetcherServiceImpl.java @@ -99,27 +99,34 @@ public class ExternalFetcherServiceImpl implements ExternalFetcherService { logger.error(e.getLocalizedMessage(), e); } } else if (source.getType() != null && source.getType().equals(ExternalFetcherSourceType.STATIC)) { - SourceStaticOptionConfiguration staticSource = (SourceStaticOptionConfiguration)source; + SourceStaticOptionConfiguration staticSource = (SourceStaticOptionConfiguration)source; results.addAll(queryStaticData(staticSource, externalReferenceCriteria)); } } return results; } - private ExternalDataResult queryStaticData(SourceStaticOptionConfiguration staticSource, ExternalReferenceCriteria externalReferenceCriteria){ - Map result = new HashMap<>(); - Map rawData = new HashMap<>(); - for (StaticOption staticOption : staticSource.getOptions()){ - if (!this.conventionService.isNullOrEmpty(externalReferenceCriteria.getLike()) && !externalReferenceCriteria.getLike().toUpperCase().contains(staticOption.getValue())) continue; - result.put(staticOption.getCode(), staticOption.getValue()); - rawData.put(staticOption.getCode(), staticOption.getValue()); - result.put(ReferenceEntity.KnownFields.SourceLabel, staticSource.getLabel()); - result.put(ReferenceEntity.KnownFields.Key, staticSource.getKey()); - } + private ExternalDataResult queryStaticData(SourceStaticOptionConfiguration staticSource, ExternalReferenceCriteria externalReferenceCriteria){ ExternalDataResult externalDataResult = new ExternalDataResult(); externalDataResult.setRawData(new ArrayList<>()); externalDataResult.setResults(new ArrayList<>()); - externalDataResult.getRawData().add(rawData); - externalDataResult.getResults().add(result); + + for (Static item : staticSource.getItems()){ + if (this.conventionService.isListNullOrEmpty(item.getOptions())) continue; + Map result = new HashMap<>(); + Map rawData = new HashMap<>(); + for (Object object: item.getOptions()) { + eu.eudat.model.externalfetcher.StaticOption staticOption = (eu.eudat.model.externalfetcher.StaticOption) object; + if (!this.conventionService.isNullOrEmpty(externalReferenceCriteria.getLike()) && !externalReferenceCriteria.getLike().toUpperCase().contains(staticOption.getValue())) continue; + result.put(staticOption.getCode(), staticOption.getValue()); + rawData.put(staticOption.getCode(), staticOption.getValue()); + result.put(ReferenceEntity.KnownFields.SourceLabel, staticSource.getLabel()); + result.put(ReferenceEntity.KnownFields.Key, staticSource.getKey()); + + } + externalDataResult.getRawData().add(rawData); + externalDataResult.getResults().add(result); + } + return externalDataResult; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/config/entities/SourceStaticOptionConfiguration.java b/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/config/entities/SourceStaticOptionConfiguration.java index e7c72dbf1..673a4f983 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/config/entities/SourceStaticOptionConfiguration.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/externalfetcher/config/entities/SourceStaticOptionConfiguration.java @@ -2,6 +2,6 @@ package eu.eudat.service.externalfetcher.config.entities; import java.util.List; -public interface SourceStaticOptionConfiguration