package eu.eudat.model.builder.descriptiontemplatedefinition.fielddata; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.types.descriptiontemplate.fielddata.ExternalSelectDataEntity; import eu.eudat.convention.ConventionService; import eu.eudat.model.builder.BaseBuilder; import eu.eudat.model.descriptiontemplatedefinition.fielddata.ExternalSelectData; import gr.cite.tools.data.builder.BuilderFactory; 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 ExternalSelectDataBuilder extends BaseFieldDataBuilder { private final BuilderFactory builderFactory; @Autowired public ExternalSelectDataBuilder(ConventionService conventionService, BuilderFactory builderFactory) { super(conventionService, new LoggerService(LoggerFactory.getLogger(ExternalSelectDataBuilder.class))); this.builderFactory = builderFactory; } @Override protected ExternalSelectData getInstance() { return new ExternalSelectData(); } @Override protected void buildChild(FieldSet fields, ExternalSelectDataEntity d, ExternalSelectData m) { FieldSet sourcesFields = fields.extractPrefixed(this.asPrefix(ExternalSelectData._sources)); if (fields.hasField(this.asIndexer(ExternalSelectData._multipleSelect))) m.setMultipleSelect(d.getMultipleSelect()); if (!sourcesFields.isEmpty() && d.getSources() != null) m.setSources(this.builderFactory.builder(ExternalSelectSourceBuilder.class).authorize(this.authorize).build(sourcesFields, d.getSources())); } @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public static class ExternalSelectSourceBindingBuilder extends BaseBuilder { private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired public ExternalSelectSourceBindingBuilder( ConventionService conventionService) { super(conventionService, new LoggerService(LoggerFactory.getLogger(SelectDataBuilder.SelectOptionBuilder.class))); } public ExternalSelectSourceBindingBuilder 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<>(); List models = new ArrayList<>(); for (ExternalSelectDataEntity.ExternalSelectSourceBindingEntity d : data) { ExternalSelectData.ExternalSelectSourceBinding m = new ExternalSelectData.ExternalSelectSourceBinding(); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectSourceBinding._label))) m.setLabel(d.getLabel()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectSourceBinding._value))) m.setValue(d.getValue()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectSourceBinding._source))) m.setSource(d.getSource()); models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); return models; } } @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public static class ExternalSelectSourceBuilder extends BaseBuilder { private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); private final BuilderFactory builderFactory; @Autowired public ExternalSelectSourceBuilder( ConventionService conventionService, BuilderFactory builderFactory) { super(conventionService, new LoggerService(LoggerFactory.getLogger(ExternalSelectSourceBuilder.class))); this.builderFactory = builderFactory; } public ExternalSelectSourceBuilder 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 sourceBindingFields = fields.extractPrefixed(this.asPrefix(ExternalSelectData.ExternalSelectSource._sourceBinding)); FieldSet authFields = fields.extractPrefixed(this.asPrefix(ExternalSelectData.ExternalSelectSource._auth)); List models = new ArrayList<>(); for (ExternalSelectDataEntity.ExternalSelectSourceEntity d : data) { ExternalSelectData.ExternalSelectSource m = new ExternalSelectData.ExternalSelectSource(); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectSource._url))) m.setUrl(d.getUrl()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectSource._optionsRoot))) m.setOptionsRoot(d.getOptionsRoot()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectSource._hasAuth))) m.setHasAuth(d.getHasAuth()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectSource._method))) m.setMethod(d.getMethod()); if (!sourceBindingFields.isEmpty() && d.getSourceBinding() != null) m.setSourceBinding(this.builderFactory.builder(ExternalSelectSourceBindingBuilder.class).authorize(this.authorize).build(sourceBindingFields, d.getSourceBinding())); if (!authFields.isEmpty() && d.getAuth() != null) m.setAuth(this.builderFactory.builder(ExternalSelectAuthDataBuilder.class).authorize(this.authorize).build(authFields, d.getAuth())); models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); return models; } } @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public static class ExternalSelectAuthDataBuilder extends BaseBuilder { private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); @Autowired public ExternalSelectAuthDataBuilder( ConventionService conventionService) { super(conventionService, new LoggerService(LoggerFactory.getLogger(ExternalSelectAuthDataBuilder.class))); } public ExternalSelectAuthDataBuilder 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<>(); List models = new ArrayList<>(); for (ExternalSelectDataEntity.ExternalSelectAuthDataEntity d : data) { ExternalSelectData.ExternalSelectAuthData m = new ExternalSelectData.ExternalSelectAuthData(); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectAuthData._url))) m.setUrl(d.getUrl()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectAuthData._method))) m.setMethod(d.getMethod()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectAuthData._body))) m.setBody(d.getBody()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectAuthData._path))) m.setPath(d.getPath()); if (fields.hasField(this.asIndexer(ExternalSelectData.ExternalSelectAuthData._type))) m.setType(d.getType()); models.add(m); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); return models; } } }