package yalp.data.validation;
import java.util.Collection;
import java.util.List;
import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
import net.sf.oval.configuration.annotation.AbstractAnnotationCheck;
import net.sf.oval.context.FieldContext;
import net.sf.oval.context.MethodParameterContext;
import net.sf.oval.context.OValContext;
import yalp.exceptions.UnexpectedException;
import yalp.utils.Java;
@SuppressWarnings("serial")
public class ValidCheck extends AbstractAnnotationCheck<Required> {
final static String mes = "validation.object";
String key;
public boolean isSatisfied(Object validatedObject, Object value, OValContext context, Validator validator) {
String superKey = ValidationPlugin.keys.get().get(validatedObject);
if (value == null) {
return true;
}
try {
if (context != null) {
if (context instanceof MethodParameterContext) {
MethodParameterContext ctx = (MethodParameterContext) context;
String[] paramNames = Java.parameterNames(ctx.getMethod());
key = paramNames[ctx.getParameterIndex()];
}
if (context instanceof FieldContext) {
FieldContext ctx = (FieldContext) context;
key = ctx.getField().getName();
}
}
} catch (Exception e) {
throw new UnexpectedException(e);
}
if (superKey != null) {
key = superKey + "." + key;
}
if (value instanceof Collection) {
Collection valueCollection = (Collection) value;
boolean everythingIsValid = true;
int index = 0;
for (Object item : valueCollection) {
if (!validateObject(key + "[" + (index) + "]", item)) {
Validation.current().errors.add(new Error(key + "[" + (index) + "]", mes, new String[0]));
everythingIsValid = false;
}
index++;
}
if (!everythingIsValid) {
return false;
} else {
return true;
}
} else {
return validateObject(key, value);
}
}
boolean validateObject(String key, Object value) {
ValidationPlugin.keys.get().put(value, key);
List<ConstraintViolation> violations = new Validator().validate(value);
//
if (violations.isEmpty()) {
return true;
} else {
for (ConstraintViolation violation : violations) {
if (violation.getContext() instanceof FieldContext) {
final FieldContext ctx = (FieldContext) violation.getContext();
final String fkey = (key == null ? "" : key + ".") + ctx.getField().getName();
final Error error = new Error(fkey, violation.getMessage(), violation.getMessageVariables() == null ? new String[0] : violation.getMessageVariables().values().toArray(new String[0]));
Validation.current().errors.add(error);
}
}
return false;
}
}
}