ch.rasc.extclassgenerator.validation.AbstractValidation.java Source code

Java tutorial

Introduction

Here is the source code for ch.rasc.extclassgenerator.validation.AbstractValidation.java

Source

/**
 * Copyright 2013-2014 Ralph Schaer <ralphschaer@gmail.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ch.rasc.extclassgenerator.validation;

import java.lang.annotation.Annotation;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.StringUtils;

import ch.rasc.extclassgenerator.IncludeValidation;
import ch.rasc.extclassgenerator.JsonViews;
import ch.rasc.extclassgenerator.ModelBean;
import ch.rasc.extclassgenerator.ModelFieldBean;
import ch.rasc.extclassgenerator.ModelValidation;
import ch.rasc.extclassgenerator.ModelValidationParameter;
import ch.rasc.extclassgenerator.ModelValidationType;

import com.fasterxml.jackson.annotation.JsonView;

/**
 * Base class for the validation objects
 */
public abstract class AbstractValidation {
    private final String type;

    @JsonView({ JsonViews.ExtJS4.class, JsonViews.Touch2.class })
    private final String field;

    public AbstractValidation(String type, String field) {
        super();
        this.type = type;
        this.field = field;
    }

    public String getType() {
        return this.type;
    }

    public String getField() {
        return this.field;
    }

    public static void addValidationToModel(ModelBean model, ModelFieldBean modelFieldBean,
            Annotation fieldAnnotation, IncludeValidation includeValidation) {
        String annotationClassName = fieldAnnotation.annotationType().getName();

        if (includeValidation == IncludeValidation.BUILTIN || includeValidation == IncludeValidation.ALL) {

            if (annotationClassName.equals("javax.validation.constraints.NotNull")
                    || annotationClassName.equals("org.hibernate.validator.constraints.NotEmpty")) {
                model.addValidation(new PresenceValidation(modelFieldBean.getName()));
            } else if (annotationClassName.equals("javax.validation.constraints.Size")
                    || annotationClassName.equals("org.hibernate.validator.constraints.Length")) {

                Integer min = (Integer) AnnotationUtils.getValue(fieldAnnotation, "min");
                Integer max = (Integer) AnnotationUtils.getValue(fieldAnnotation, "max");
                model.addValidation(new LengthValidation(modelFieldBean.getName(), min, max));

            } else if (annotationClassName.equals("javax.validation.constraints.Pattern")) {
                String regexp = (String) AnnotationUtils.getValue(fieldAnnotation, "regexp");
                model.addValidation(new FormatValidation(modelFieldBean.getName(), regexp));
            } else if (annotationClassName.equals("org.hibernate.validator.constraints.Email")) {
                model.addValidation(new EmailValidation(modelFieldBean.getName()));
            }
        }

        if (includeValidation == IncludeValidation.ALL) {

            if (annotationClassName.equals("javax.validation.constraints.DecimalMax")) {
                String value = (String) AnnotationUtils.getValue(fieldAnnotation);
                model.addValidation(new RangeValidation(modelFieldBean.getName(), null, new BigDecimal(value)));
            } else if (annotationClassName.equals("javax.validation.constraints.DecimalMin")) {
                String value = (String) AnnotationUtils.getValue(fieldAnnotation);
                model.addValidation(new RangeValidation(modelFieldBean.getName(), new BigDecimal(value), null));
            } else if (annotationClassName.equals("javax.validation.constraints.Digits")) {
                Integer integer = (Integer) AnnotationUtils.getValue(fieldAnnotation, "integer");
                Integer fraction = (Integer) AnnotationUtils.getValue(fieldAnnotation, "fraction");
                model.addValidation(new DigitsValidation(modelFieldBean.getName(), integer, fraction));
            } else if (annotationClassName.equals("javax.validation.constraints.Future")) {
                model.addValidation(new FutureValidation(modelFieldBean.getName()));
            } else if (annotationClassName.equals("javax.validation.constraints.Max")) {
                Long value = (Long) AnnotationUtils.getValue(fieldAnnotation);
                model.addValidation(new RangeValidation(modelFieldBean.getName(), null, value));
            } else if (annotationClassName.equals("javax.validation.constraints.Min")) {
                Long value = (Long) AnnotationUtils.getValue(fieldAnnotation);
                model.addValidation(new RangeValidation(modelFieldBean.getName(), value, null));
            } else if (annotationClassName.equals("javax.validation.constraints.Past")) {
                model.addValidation(new PastValidation(modelFieldBean.getName()));
            } else if (annotationClassName.equals("org.hibernate.validator.constraints.CreditCardNumber")) {
                model.addValidation(new CreditCardNumberValidation(modelFieldBean.getName()));
            } else if (annotationClassName.equals("org.hibernate.validator.constraints.NotBlank")) {
                model.addValidation(new NotBlankValidation(modelFieldBean.getName()));
            } else if (annotationClassName.equals("org.hibernate.validator.constraints.Range")) {
                Long min = (Long) AnnotationUtils.getValue(fieldAnnotation, "min");
                Long max = (Long) AnnotationUtils.getValue(fieldAnnotation, "max");
                model.addValidation(new RangeValidation(modelFieldBean.getName(), min, max));
            }
        }
    }

    public static AbstractValidation createValidation(String propertyName,
            ModelValidation modelValidationAnnotation, IncludeValidation includeValidation) {

        if (!StringUtils.hasText(propertyName)) {
            return null;
        }

        ModelValidationType validationType = modelValidationAnnotation.value();

        if ((includeValidation == IncludeValidation.ALL
                || includeValidation == IncludeValidation.BUILTIN && validationType.isBuiltin())
                && validationType.isValid(modelValidationAnnotation)) {
            switch (validationType) {
            case GENERIC:
                String type = getParameterValue(modelValidationAnnotation.parameters(), "type");
                Map<String, Object> options = new LinkedHashMap<String, Object>();
                for (ModelValidationParameter parameter : modelValidationAnnotation.parameters()) {
                    if (!parameter.name().equals("type")) {
                        options.put(parameter.name(), parameter.value());
                    }
                }
                return new GenericValidation(type, propertyName, options);
            case CREDITCARDNUMBER:
                return new CreditCardNumberValidation(propertyName);
            case DIGITS:
                String integer = getParameterValue(modelValidationAnnotation.parameters(), "integer");
                String fraction = getParameterValue(modelValidationAnnotation.parameters(), "fraction");
                return new DigitsValidation(propertyName, Integer.parseInt(integer), Integer.parseInt(fraction));
            case EMAIL:
                return new EmailValidation(propertyName);
            case FORMAT:
                return new FormatValidation(propertyName, modelValidationAnnotation.parameters()[0].value());
            case FUTURE:
                return new FutureValidation(propertyName);
            case INCLUSION:
                if (modelValidationAnnotation.exclusionOrInclusionList().length > 0) {
                    List<String> list = Arrays.asList(modelValidationAnnotation.exclusionOrInclusionList());
                    return new InclusionValidationArray(propertyName, list);
                } else {// backward compatibility
                    String list = getParameterValue(modelValidationAnnotation.parameters(), "list");
                    return new InclusionValidation(propertyName, list);
                }
            case EXCLUSION:
                if (modelValidationAnnotation.exclusionOrInclusionList().length > 0) {
                    List<String> list = Arrays.asList(modelValidationAnnotation.exclusionOrInclusionList());
                    return new ExclusionValidationArray(propertyName, list);
                } else {// backward compatibility
                    String list = getParameterValue(modelValidationAnnotation.parameters(), "list");
                    return new ExclusionValidation(propertyName, list);
                }
            case LENGTH:
                String minValue = getParameterValue(modelValidationAnnotation.parameters(), "min");
                String maxValue = getParameterValue(modelValidationAnnotation.parameters(), "max");
                Long min = null;
                Long max = null;

                if (minValue != null) {
                    min = Long.valueOf(minValue);
                }
                if (maxValue != null) {
                    max = Long.valueOf(maxValue);
                }
                return new LengthValidation(propertyName, min, max);
            case NOTBLANK:
                return new NotBlankValidation(propertyName);
            case PAST:
                return new PastValidation(propertyName);
            case PRESENCE:
                return new PresenceValidation(propertyName);
            case RANGE:
                minValue = getParameterValue(modelValidationAnnotation.parameters(), "min");
                maxValue = getParameterValue(modelValidationAnnotation.parameters(), "max");

                if (minValue != null && minValue.indexOf(".") != -1
                        || maxValue != null && maxValue.indexOf(".") != -1) {
                    BigDecimal minBD = null;
                    BigDecimal maxBD = null;

                    if (minValue != null) {
                        minBD = new BigDecimal(minValue);
                    }
                    if (maxValue != null) {
                        maxBD = new BigDecimal(maxValue);
                    }
                    return new RangeValidation(propertyName, minBD, maxBD);
                }
                min = null;
                max = null;

                if (minValue != null) {
                    min = Long.valueOf(minValue);
                }
                if (maxValue != null) {
                    max = Long.valueOf(maxValue);
                }
                return new RangeValidation(propertyName, min, max);

            default:
                return null;
            }
        }

        return null;
    }

    private static String getParameterValue(ModelValidationParameter[] parameters, String param) {
        for (ModelValidationParameter modelValidationParameter : parameters) {
            if (param.equals(modelValidationParameter.name())) {
                return modelValidationParameter.value();
            }
        }
        return null;
    }

}