package com.sequenceiq.cloudbreak.controller.validation.stack;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.cloud.model.StackParamValidation;
import com.sequenceiq.cloudbreak.controller.BadRequestException;
@Component
public class ParametersTypeValidator implements ParameterValidator {
private static final String SEPARATOR = ", ";
@Override
public <O, E extends StackParamValidation> void validate(Map<String, O> parameters, List<E> paramsList) {
for (E entry : paramsList) {
Object param = parameters.get(entry.getName());
if (param != null) {
if (entry.getClazz().isEnum()) {
try {
entry.getClazz().getField(String.valueOf(parameters.get(entry.getName())));
} catch (NoSuchFieldException e) {
throw new BadRequestException(String.format("%s is not valid type. The valid fields are [%s]",
entry.getName(),
fieldList(entry.getClazz().getFields())));
}
} else {
try {
entry.getClazz().getConstructor(parameters.get(entry.getName()).getClass()).newInstance(parameters.get(entry.getName()));
} catch (Exception e) {
try {
entry.getClazz().getConstructor(String.class).newInstance(parameters.get(entry.getName()).toString());
} catch (Exception ex) {
throw new BadRequestException(ex.getMessage());
}
}
}
}
}
}
private String fieldList(Field[] fields) {
StringBuilder sb = new StringBuilder();
for (Field field : fields) {
sb.append(field.getName());
sb.append(SEPARATOR);
}
sb.replace(sb.toString().lastIndexOf(SEPARATOR), sb.toString().lastIndexOf(SEPARATOR) + 2, "");
return sb.toString();
}
@Override
public ValidatorType getValidatorType() {
return ValidatorType.CLASS;
}
}