All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.fhframework.validation.ValidationResults Maven / Gradle / Ivy

package pl.fhframework.validation;

import lombok.Getter;
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 org.springframework.util.CollectionUtils;
import pl.fhframework.core.forms.IValidatedComponent;
import pl.fhframework.core.i18n.MessageService;
import pl.fhframework.model.PresentationStyleEnum;

import java.util.*;
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ValidationResults implements IValidationResults {

    @Autowired
    private MessageService messageService;

    /**
     * key - is a model used by Form value - map of attributes, and validation results as list
     */
    @Getter
    private Map>> objectAttributeToFieldValidationResult = new HashMap<>();

    /**
     * Are messages currently reported from web layer (form and jsr-303)
     */
    private boolean formMode;

    @Override
    public FormFieldHints getPresentationStyleForField(Object parent, String attributeName) {
        Map> attributeToFieldValidationResult = objectAttributeToFieldValidationResult.get(parent);
        if (attributeToFieldValidationResult == null) {
            return null;
        }
        List validationResults = attributeToFieldValidationResult.get(attributeName);
        if (validationResults == null) {
            return null;
        }
        //TODO:Instead of this creation of new objects, form component (asking object) should pass our structure for refreshment.
        return new FormFieldHints(validationResults);
    }

    @Override
    public Map>> getValidationErrors() {
        return objectAttributeToFieldValidationResult;
    }

    @Override
    public void addCustomMessageForComponent(IValidatedComponent component, Object parent, String attributeName, String message, PresentationStyleEnum presentationStyleEnum) {
        this.addFieldValidationResult(Optional.of(component), parent, attributeName, message, presentationStyleEnum);
    }

    @Override
    public void addCustomMessage(Object parent, String attributeName, String message, PresentationStyleEnum presentationStyleEnum) {
        this.addFieldValidationResult(Optional.empty(), parent, attributeName, message, presentationStyleEnum);
    }

    @Override
    public void addCustomTemplateMessage(Object parent, String attributeName, String keyMessage, PresentationStyleEnum presentationStyleEnum) {
        MessageService.MessageBundle allBundles = messageService.getAllBundles();
        String message = allBundles.getMessage(keyMessage);
        this.addFieldValidationResult(Optional.empty(), parent, attributeName, message, presentationStyleEnum);
    }

    @Override
    public void addCustomTemplateMessage(Object parent, String attributeName, String keyMessage, Object[] arguments, PresentationStyleEnum presentationStyleEnum) {
        MessageService.MessageBundle allBundles = messageService.getAllBundles();
        String message = allBundles.getMessage(keyMessage, arguments);
        this.addFieldValidationResult(Optional.empty(), parent, attributeName, message, presentationStyleEnum);
    }

    @Override
    public boolean areAnyValidationMessages() {
        return !CollectionUtils.isEmpty(objectAttributeToFieldValidationResult);
    }

    @Override
    public boolean areAnyValidationMessages(PresentationStyleEnum minimalStyleEnum) {
        if (!CollectionUtils.isEmpty(objectAttributeToFieldValidationResult)) {
            for (Map> parentResults : objectAttributeToFieldValidationResult.values()) {
                if (!CollectionUtils.isEmpty(parentResults)) {
                    for (List results : parentResults.values()) {
                        if (!CollectionUtils.isEmpty(results)) {
                            for (FieldValidationResult result : results) {
                                if (result != null && result.getPresentationStyleEnum() != null && result.getPresentationStyleEnum().ordinal() >= minimalStyleEnum.ordinal()) {
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    @Override
    public boolean hasAtLeastErrors() {
        return hasAtLeastLevel(PresentationStyleEnum.ERROR);
    }

    @Override
    public boolean hasBlockers() {
        return hasAtLeastLevel(PresentationStyleEnum.BLOCKER);
    }

    @Override
    public boolean hasAtLeastLevel(PresentationStyleEnum level) {
        return objectAttributeToFieldValidationResult.values().stream().map(Map::values).flatMap(Collection::stream).flatMap(Collection::stream).anyMatch(field -> field.getPresentationStyleEnum().ordinal() >= level.ordinal());
    }

    @Override
    public void clearValidationErrors() {
        objectAttributeToFieldValidationResult.clear();
    }

    @Override
    public List getFieldValidationResultFor(Object parent, String attributeName) {
        Map> stringListMap = objectAttributeToFieldValidationResult.get(parent);
        if (CollectionUtils.isEmpty(stringListMap)) {
            return Collections.emptyList();
        }
        return new ArrayList<>(stringListMap.getOrDefault(attributeName, Collections.emptyList()));
    }

    void addFieldValidationResult(Object parent, String attributeName, FieldValidationResult fieldValidationResult) {
        fieldValidationResult.setFormSource(this.formMode);

        if (!objectAttributeToFieldValidationResult.containsKey(parent)) {
            objectAttributeToFieldValidationResult.put(parent, new HashMap<>());
        }
        Map> attributeToFieldValidationResult = objectAttributeToFieldValidationResult.get(parent);
        if (!attributeToFieldValidationResult.containsKey(attributeName)) {
            attributeToFieldValidationResult.put(attributeName, new ArrayList<>());
        }
        attributeToFieldValidationResult.get(attributeName).add(fieldValidationResult);
    }

    public void addValidationResults(IValidationResults validationResults) {
        validationResults.getValidationErrors().forEach((object, map) -> {
            map.forEach((attr, resultList) -> resultList.forEach(result -> addFieldValidationResult(object, attr, result)));
        });
    }

    void addFieldValidationResult(Optional component, Object parent, String attributeName, String message, PresentationStyleEnum presentationStyleEnum) {
        FieldValidationResult fieldValidationResult = createFieldValidationResult(component, message, presentationStyleEnum);
        addFieldValidationResult(parent, attributeName, fieldValidationResult);
    }

    FieldValidationResult createFieldValidationResult(Optional component, String message, PresentationStyleEnum presentationStyleEnum) {
        FieldValidationResult fieldValidationResult = new FieldValidationResult();
        fieldValidationResult.setMessage(message);
        fieldValidationResult.setPresentationStyleEnum(presentationStyleEnum);
        if (component.isPresent()) {
            fieldValidationResult.setKnownSourceComponentId(component.get().getId());
        }
        return fieldValidationResult;
    }

    void setFormMode() {
        this.formMode = true;
    }

    void setBusinessMode() {
        this.formMode = false;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy