package org.mongodb.morphia.mapping.validation.fieldrules;
import org.mongodb.morphia.ObjectFactory;
import org.mongodb.morphia.annotations.Version;
import org.mongodb.morphia.mapping.MappedClass;
import org.mongodb.morphia.mapping.MappedField;
import org.mongodb.morphia.mapping.Mapper;
import org.mongodb.morphia.mapping.validation.ConstraintViolation;
import org.mongodb.morphia.mapping.validation.ConstraintViolation.Level;
import java.util.Set;
import static java.lang.String.format;
public class VersionMisuse extends FieldConstraint {
private ObjectFactory creator;
public VersionMisuse(final ObjectFactory creator) {
this.creator = creator;
}
@Override
protected void check(final Mapper mapper, final MappedClass mc, final MappedField mf, final Set<ConstraintViolation> ve) {
if (mf.hasAnnotation(Version.class)) {
final Class<?> type = mf.getType();
if (Long.class.equals(type) || long.class.equals(type)) {
final Object testInstance = creator.createInstance(mc.getClazz());
if (Long.class.equals(type)) {
if (mf.getFieldValue(testInstance) != null) {
ve.add(new ConstraintViolation(Level.FATAL, mc, mf, getClass(),
format("When using @%s on a Long field, it must be initialized to null.",
Version.class.getSimpleName())));
}
} else if (long.class.equals(type)) {
if ((Long) mf.getFieldValue(testInstance) != 0L) {
ve.add(new ConstraintViolation(Level.FATAL, mc, mf, getClass(),
format("When using @%s on a long field, it must be initialized to 0.",
Version.class.getSimpleName())));
}
}
} else {
ve.add(new ConstraintViolation(Level.FATAL, mc, mf, getClass(),
format("@%s can only be used on a Long/long field.", Version.class.getSimpleName())));
}
}
}
}