package org.alien4cloud.tosca.model.definitions.constraints; import alien4cloud.tosca.normative.IPropertyType; import alien4cloud.tosca.properties.constraints.ConstraintUtil; import alien4cloud.tosca.properties.constraints.exception.ConstraintValueDoNotMatchPropertyTypeException; import alien4cloud.tosca.properties.constraints.exception.ConstraintViolationException; import alien4cloud.ui.form.annotation.FormProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.Lists; import java.util.List; import javax.validation.constraints.NotNull; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @SuppressWarnings({ "unchecked", "rawtypes" }) @EqualsAndHashCode(callSuper = false, of = { "inRange" }) @FormProperties({ "rangeMinValue", "rangeMaxValue" }) public class InRangeConstraint extends AbstractPropertyConstraint { @Getter @Setter private List<String> inRange; private Comparable min; private Comparable max; @Override public void initialize(IPropertyType<?> propertyType) throws ConstraintValueDoNotMatchPropertyTypeException { // Perform verification that the property type is supported for comparison ConstraintUtil.checkComparableType(propertyType); if (inRange == null || inRange.size() != 2) { throw new ConstraintValueDoNotMatchPropertyTypeException("In range constraint must have two elements."); } String minRawText = inRange.get(0); String maxRawText = inRange.get(1); min = ConstraintUtil.convertToComparable(propertyType, minRawText); max = ConstraintUtil.convertToComparable(propertyType, maxRawText); } @Override public void validate(Object propertyValue) throws ConstraintViolationException { if (propertyValue == null) { throw new ConstraintViolationException("Value to check is null"); } if (!(min.getClass().isAssignableFrom(propertyValue.getClass()))) { throw new ConstraintViolationException( "Value to check is not comparable to range type, value type [" + propertyValue.getClass() + "], range type [" + min.getClass() + "]"); } if (min.compareTo(propertyValue) > 0 || max.compareTo(propertyValue) < 0) { throw new ConstraintViolationException("The value [" + propertyValue + "] is out of range " + inRange); } } @JsonProperty @NotNull public String getRangeMinValue() { if (inRange != null) { return inRange.get(0); } else { return null; } } @JsonProperty public void setRangeMinValue(String minValue) { if (inRange == null) { inRange = Lists.newArrayList(minValue, ""); } else { inRange.set(0, minValue); } } @JsonProperty @NotNull public String getRangeMaxValue() { if (inRange != null) { return inRange.get(1); } else { return null; } } @JsonProperty public void setRangeMaxValue(String maxValue) { if (inRange == null) { inRange = Lists.newArrayList("", maxValue); } else { inRange.set(1, maxValue); } } }