package org.zstack.core.validation; import org.zstack.header.core.validation.Validation; import org.zstack.header.core.validation.Validator; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.utils.FieldUtils; import org.zstack.utils.TypeUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; /** */ public class DefaultValidator implements Validator { @Override public List<Class> supportedClasses() { List<Class> classes = new ArrayList<Class>(); classes.add(Object.class); return classes; } private String error(Object obj, Field f, String msg) { return String.format("[validation error on class[%s], field[%s]]: %s", obj.getClass(), f.getName(), msg); } private String validate(Object obj, Field f) { try { f.setAccessible(true); Object value = f.get(obj); Validation at = f.getAnnotation(Validation.class); if (at.notNull() && value == null) { return error(obj, f, "field can not be null"); } if (at.notZero() && TypeUtils.isTypeOf(value, Integer.TYPE, Integer.class, Long.TYPE, Long.class)) { if (value != null) { long intValue = Long.valueOf(value.toString()); if (intValue == 0) { return error(obj, f, "field can not be zero"); } } } return null; } catch (Exception e) { throw new CloudRuntimeException(e); } } @Override public String validate(Object obj) { List<Field> fs = FieldUtils.getAnnotatedFields(Validation.class, obj.getClass()); for (Field f : fs) { String err = validate(obj, f); if (err != null) { return err; } } return null; } }