package org.mongodb.morphia.callbacks;
import com.mongodb.DBObject;
import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Test;
import org.mongodb.morphia.AbstractEntityInterceptor;
import org.mongodb.morphia.TestBase;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.PrePersist;
import org.mongodb.morphia.callbacks.TestSimpleValidationViaInterceptor.NonNullValidation.NonNullValidationException;
import org.mongodb.morphia.mapping.MappedClass;
import org.mongodb.morphia.mapping.MappedField;
import org.mongodb.morphia.mapping.Mapper;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Date;
import java.util.List;
/**
* @author Uwe Schaefer, (us@thomas-daily.de)
*/
public class TestSimpleValidationViaInterceptor extends TestBase {
static {
MappedField.addInterestingAnnotation(NonNull.class);
}
@Test
public void testGlobalEntityInterceptorWorksAfterEntityCallback() {
getMorphia().getMapper().addInterceptor(new NonNullValidation());
getMorphia().map(E.class);
getMorphia().map(E2.class);
getDs().save(new E());
try {
getDs().save(new E2());
Assert.fail();
} catch (NonNullValidationException e) {
// expected
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface NonNull {
}
static class E {
@Id
private final ObjectId id = new ObjectId();
@NonNull
private Date lastModified;
@PrePersist
void entityCallback() {
lastModified = new Date();
}
}
static class E2 {
@Id
private final ObjectId id = new ObjectId();
@NonNull
private String mustFailValidation;
}
public static class NonNullValidation extends AbstractEntityInterceptor {
@Override
public void prePersist(final Object ent, final DBObject dbObj, final Mapper mapper) {
final MappedClass mc = mapper.getMappedClass(ent);
final List<MappedField> fieldsToTest = mc.getFieldsAnnotatedWith(NonNull.class);
for (final MappedField mf : fieldsToTest) {
if (mf.getFieldValue(ent) == null) {
throw new NonNullValidationException(mf);
}
}
}
static class NonNullValidationException extends RuntimeException {
public NonNullValidationException(final MappedField mf) {
super("NonNull field is null " + mf.getFullName());
}
}
}
}