package org.mongodb.morphia.callbacks;
import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Test;
import org.mongodb.morphia.TestBase;
import org.mongodb.morphia.annotations.Embedded;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.PostLoad;
import org.mongodb.morphia.annotations.PostPersist;
import org.mongodb.morphia.annotations.PreLoad;
import org.mongodb.morphia.annotations.PrePersist;
import org.mongodb.morphia.annotations.PreSave;
import org.mongodb.morphia.annotations.Transient;
import java.util.LinkedList;
import java.util.List;
public class TestCallbackEscalation extends TestBase {
@Test
public void testPostLoadEscalation() throws Exception {
A a = new A();
a.b = new B();
a.bs.add(new B());
Assert.assertFalse(a.isPostLoad());
Assert.assertFalse(a.b.isPostLoad());
Assert.assertFalse(a.bs.get(0).isPostLoad());
getDs().save(a);
Assert.assertFalse(a.isPreLoad());
Assert.assertFalse(a.b.isPreLoad());
Assert.assertFalse(a.bs.get(0).isPreLoad());
a = getDs().find(A.class).filter("_id", a.id).get();
Assert.assertTrue(a.isPostLoad());
Assert.assertTrue(a.b.isPostLoad());
Assert.assertTrue(a.bs.get(0).isPostLoad());
}
@Test
public void testPostPersistEscalation() throws Exception {
final A a = new A();
a.b = new B();
a.bs.add(new B());
Assert.assertFalse(a.isPostPersist());
Assert.assertFalse(a.b.isPostPersist());
Assert.assertFalse(a.bs.get(0).isPostPersist());
getDs().save(a);
Assert.assertTrue(a.isPreSave());
Assert.assertTrue(a.isPostPersist());
Assert.assertTrue(a.b.isPreSave());
Assert.assertTrue(a.b.isPostPersist()); //PostPersist in not only called on entities
Assert.assertTrue(a.bs.get(0).isPreSave());
Assert.assertTrue(a.bs.get(0).isPostPersist()); //PostPersist is not only called on entities
}
@Test
public void testPreLoadEscalation() throws Exception {
A a = new A();
a.b = new B();
a.bs.add(new B());
Assert.assertFalse(a.isPreLoad());
Assert.assertFalse(a.b.isPreLoad());
Assert.assertFalse(a.bs.get(0).isPreLoad());
getDs().save(a);
Assert.assertFalse(a.isPreLoad());
Assert.assertFalse(a.b.isPreLoad());
Assert.assertFalse(a.bs.get(0).isPreLoad());
a = getDs().find(A.class).filter("_id", a.id).get();
Assert.assertTrue(a.isPreLoad());
Assert.assertTrue(a.b.isPreLoad());
Assert.assertTrue(a.bs.get(0).isPreLoad());
}
@Test
public void testPrePersistEscalation() throws Exception {
final A a = new A();
a.b = new B();
a.bs.add(new B());
Assert.assertFalse(a.isPrePersist());
Assert.assertFalse(a.b.isPrePersist());
Assert.assertFalse(a.bs.get(0).isPrePersist());
getDs().save(a);
Assert.assertTrue(a.isPrePersist());
Assert.assertTrue(a.b.isPrePersist());
Assert.assertTrue(a.bs.get(0).isPrePersist());
}
@Entity
static class A extends Callbacks {
@Embedded
private final List<B> bs = new LinkedList<B>();
@Id
private ObjectId id;
@Embedded
private B b;
}
@Embedded
static class B extends Callbacks {
// minor issue: i realized, that if B does not bring anything to map,
// morphia behaves significantly different, is this wanted ?
// see TestEmptyEntityMapping
private String someProperty = "someThing";
}
static class Callbacks {
@Transient
private boolean prePersist;
@Transient
private boolean postPersist;
@Transient
private boolean preLoad;
@Transient
private boolean postLoad;
@Transient
private boolean preSave;
@PrePersist
void prePersist() {
prePersist = true;
}
@PostPersist
void postPersist() {
postPersist = true;
}
@PreLoad
void preLoad() {
preLoad = true;
}
@PostLoad
void postLoad() {
postLoad = true;
}
@PreSave
void preSave() {
preSave = true;
}
boolean isPostLoad() {
return postLoad;
}
boolean isPostPersist() {
return postPersist;
}
boolean isPreLoad() {
return preLoad;
}
boolean isPrePersist() {
return prePersist;
}
boolean isPreSave() {
return preSave;
}
}
}