package org.alien4cloud.tosca.model.definitions.constraints;
import java.util.List;
import java.util.Set;
import javax.validation.constraints.NotNull;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
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.JsonIgnore;
import com.google.common.collect.Sets;
@Getter
@Setter
@FormProperties("validValues")
@EqualsAndHashCode(callSuper = false, of = { "validValues" })
public class ValidValuesConstraint extends AbstractPropertyConstraint {
@NotNull
private List<String> validValues;
@JsonIgnore
private Set<Object> validValuesTyped;
@Override
public void initialize(IPropertyType<?> propertyType) throws ConstraintValueDoNotMatchPropertyTypeException {
validValuesTyped = Sets.newHashSet();
if (validValues == null) {
throw new ConstraintValueDoNotMatchPropertyTypeException("validValues constraint has invalid value <> property type is <" + propertyType.toString()
+ ">");
}
for (String value : validValues) {
validValuesTyped.add(ConstraintUtil.convert(propertyType, value));
}
}
@Override
public void validate(Object propertyValue) throws ConstraintViolationException {
if (propertyValue == null) {
throw new ConstraintViolationException("Value to validate is null");
}
if (!validValuesTyped.contains(propertyValue)) {
throw new ConstraintViolationException("The value <" + propertyValue + "> is not in the list of valid values");
}
}
}