package eu.eudat.model.persist.descriptiontemplatedefinition; import eu.eudat.commons.enums.FieldValidationType; import eu.eudat.commons.validation.BaseValidator; import gr.cite.tools.validation.ValidatorFactory; import gr.cite.tools.validation.specification.Specification; import eu.eudat.convention.ConventionService; import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.model.persist.descriptiontemplatedefinition.fielddata.*; import eu.eudat.service.fielddatahelper.FieldDataHelperServiceProvider; 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 FieldPersist { private String id = null; public static final String _id = "id"; private Integer ordinal = null; public static final String _ordinal = "ordinal"; private List schematics; private String defaultValue; private List visibilityRules; public static final String _visibilityRules = "visibilityRules"; private List validations; private Boolean includeInExport = null; public static final String _includeInExport = "includeInExport"; private BaseFieldDataPersist data = null; public static final String _data = "data"; public String getId() { return id; } public void setId(String id) { this.id = id; } public Integer getOrdinal() { return ordinal; } public void setOrdinal(Integer ordinal) { this.ordinal = ordinal; } public List getSchematics() { return schematics; } public void setSchematics(List schematics) { this.schematics = schematics; } public String getDefaultValue() { return defaultValue; } public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } public List getVisibilityRules() { return visibilityRules; } public void setVisibilityRules(List visibilityRules) { this.visibilityRules = visibilityRules; } public List getValidations() { return validations; } public void setValidations(List validations) { this.validations = validations; } public Boolean getIncludeInExport() { return includeInExport; } public void setIncludeInExport(Boolean includeInExport) { this.includeInExport = includeInExport; } public BaseFieldDataPersist getData() { return data; } public void setData(BaseFieldDataPersist data) { this.data = data; } @Component(FieldPersistValidator.ValidatorName) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public static class FieldPersistValidator extends BaseValidator { public static final String ValidatorName = "DescriptionTemplate.FieldPersistValidator"; private final MessageSource messageSource; private final ValidatorFactory validatorFactory; private final FieldDataHelperServiceProvider fieldDataHelperServiceProvider; protected FieldPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, ValidatorFactory validatorFactory, FieldDataHelperServiceProvider fieldDataHelperServiceProvider) { super(conventionService, errors); this.messageSource = messageSource; this.validatorFactory = validatorFactory; this.fieldDataHelperServiceProvider = fieldDataHelperServiceProvider; } @Override protected Class modelClass() { return FieldPersist.class; } @Override protected List specifications(FieldPersist item) { return Arrays.asList( this.spec() .must(() -> !this.isEmpty(item.getId())) .failOn(FieldPersist._id).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._id}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getOrdinal())) .failOn(FieldPersist._ordinal).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._ordinal}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getIncludeInExport())) .failOn(FieldPersist._includeInExport).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._includeInExport}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> !this.isListNullOrEmpty(item.getVisibilityRules())) .on(FieldPersist._visibilityRules) .over(item.getVisibilityRules()) .using((itm) -> this.validatorFactory.validator(RulePersist.RulePersistValidator.class).withFieldPersist(item)), this.refSpec() .iff(() -> !this.isNull(item.getData()) && item.getData().getFieldType() != null) .on(FieldPersist._data) .over(item.getData()) .using(() -> this.fieldDataHelperServiceProvider.get(item.getData().getFieldType()).getPersistModelValidator()), this.spec() .iff(() -> !this.isNull(item.getData())) .must(() -> !this.isNull(item.getData().getFieldType())) .failOn(FieldPersist._data + '.' + BaseFieldDataPersist._fieldType).failWith(messageSource.getMessage("Validation_Required", new Object[]{BaseFieldDataPersist._fieldType}, LocaleContextHolder.getLocale())) ); } } }