argos/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptionproperties/PropertyDefinitionFieldSetI...

128 lines
4.8 KiB
Java

package eu.eudat.model.persist.descriptionproperties;
import eu.eudat.commons.enums.DescriptionStatus;
import eu.eudat.commons.types.descriptiontemplate.FieldEntity;
import eu.eudat.commons.types.descriptiontemplate.FieldSetEntity;
import eu.eudat.commons.types.descriptiontemplate.RuleEntity;
import eu.eudat.commons.validation.BaseValidator;
import eu.eudat.convention.ConventionService;
import eu.eudat.errorcode.ErrorThesaurusProperties;
import eu.eudat.model.persist.DescriptionPersist;
import gr.cite.tools.validation.ValidatorFactory;
import gr.cite.tools.validation.specification.Specification;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class PropertyDefinitionFieldSetItemPersist {
public final static String _fields = "fields";
private Map<String, FieldPersist> fields;
public final static String _comment = "comment";
private String comment;
public final static String _ordinal = "ordinal";
private Integer ordinal = null;
public Map<String, FieldPersist> getFields() {
return fields;
}
public void setFields(Map<String, FieldPersist> fields) {
this.fields = fields;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Integer getOrdinal() {
return ordinal;
}
public void setOrdinal(Integer ordinal) {
this.ordinal = ordinal;
}
@Component(PersistValidator.ValidatorName)
public static class PersistValidator extends BaseValidator<PropertyDefinitionFieldSetItemPersist> {
public static final String ValidatorName = "Description.PropertyDefinitionFieldSetItemPersistValidator";
private final ValidatorFactory validatorFactory;
private final MessageSource messageSource;
private FieldSetEntity fieldSetEntity;
private List<List<RuleEntity>> rules;
private DescriptionStatus status;
protected PersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, ValidatorFactory validatorFactory, MessageSource messageSource) {
super(conventionService, errors);
this.validatorFactory = validatorFactory;
this.messageSource = messageSource;
}
@Override
protected Class<PropertyDefinitionFieldSetItemPersist> modelClass() {
return PropertyDefinitionFieldSetItemPersist.class;
}
@Override
protected List<Specification> specifications(PropertyDefinitionFieldSetItemPersist item) {
return Arrays.asList(
this.spec()
.must(() -> !this.isNull(item.getOrdinal()))
.failOn(PropertyDefinitionFieldSetItemPersist._ordinal).failWith(messageSource.getMessage("Validation_Required", new Object[]{PropertyDefinitionFieldSetItemPersist._ordinal}, LocaleContextHolder.getLocale())),
this.mapSpec()
.iff(() -> !this.isNull(item.getFields()))
.on(PropertyDefinitionFieldSetItemPersist._fields)
.over(item.getFields())
.mapKey((k) -> ((String)k))
.using((itm) ->
{
FieldEntity fieldEntity = fieldSetEntity != null ? fieldSetEntity.getFieldById((String)itm.getKey()).stream().findFirst().orElse(null) : null;
return this.validatorFactory.validator(FieldPersist.PersistValidator.class).withFieldEntity(fieldEntity).withRules(rules).ifFieldSetIsRuleTarget(this.checkIfFieldSetIsRuleTarget()).setStatus(this.status);
})
);
}
public PersistValidator withFieldSetEntity(FieldSetEntity fieldSetEntity) {
this.fieldSetEntity = fieldSetEntity;
return this;
}
public PersistValidator withRules(List<List<RuleEntity>> rules) {
this.rules = rules;
return this;
}
public PersistValidator setStatus(DescriptionStatus status) {
this.status = status;
return this;
}
private Boolean checkIfFieldSetIsRuleTarget(){
if (this.isListNullOrEmpty(rules)) return false;
for (List<RuleEntity> rulesBySection: rules) {
if (!this.isListNullOrEmpty(rulesBySection)){
for (RuleEntity rule :rulesBySection) {
if (rule.getTarget().equals(this.fieldSetEntity.getId())) return true;
}
}
}
return false;
}
}
}