1+ package grails.gorm.tests
2+
3+ import grails.gorm.annotation.Entity
4+ import org.grails.datastore.gorm.GormEntity
5+ import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher
6+ import org.grails.datastore.mapping.core.Datastore
7+ import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent
8+ import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
9+ import org.grails.datastore.mapping.engine.event.PreInsertEvent
10+ import org.grails.datastore.mapping.engine.event.PreUpdateEvent
11+ import org.springframework.context.ApplicationEvent
12+ import org.springframework.context.ApplicationEventPublisher
13+ import org.springframework.context.ConfigurableApplicationContext
14+ import spock.util.concurrent.PollingConditions
15+
16+ class DirtyCheckingAfterListenerSpec extends GormDatastoreSpec {
17+
18+ TestSaveOrUpdateEventListener listener
19+ def datastore
20+
21+ @Override
22+ List getDomainClasses () {
23+ return [Player ]
24+ }
25+
26+ def setup () {
27+ datastore = session. datastore
28+ listener = new TestSaveOrUpdateEventListener (datastore)
29+ ApplicationEventPublisher publisher = datastore. applicationEventPublisher
30+ if (publisher instanceof ConfigurableApplicationEventPublisher ) {
31+ ((ConfigurableApplicationEventPublisher ) publisher). addApplicationListener(listener)
32+ } else if (publisher instanceof ConfigurableApplicationContext ) {
33+ ((ConfigurableApplicationContext ) publisher). addApplicationListener(listener)
34+ }
35+ }
36+
37+ void " test state change from listener update the object" () {
38+
39+ when :
40+ Player john = new Player (name : " John" ). save()
41+
42+ then :
43+ new PollingConditions (). eventually { listener. isExecuted && Player . count()}
44+
45+ when :
46+ session. flush()
47+ session. clear()
48+ john = Player . get(john. id)
49+
50+ then :
51+ john. attributes
52+ john. attributes. size() == 3
53+
54+ }
55+ }
56+
57+ @Entity
58+ class Player implements GormEntity<Player > {
59+ String name
60+ List<String > attributes
61+
62+ }
63+
64+ class TestSaveOrUpdateEventListener extends AbstractPersistenceEventListener {
65+
66+ boolean isExecuted = false
67+
68+ TestSaveOrUpdateEventListener (Datastore datastore ) {
69+ super (datastore)
70+ }
71+
72+ @Override
73+ protected void onPersistenceEvent (AbstractPersistenceEvent event ) {
74+ Player player = (Player ) event. entityObject
75+ player. attributes = [" test0" , " test1" , " test2" ]
76+ isExecuted = true
77+ }
78+
79+ @Override
80+ boolean supportsEventType (Class<? extends ApplicationEvent > eventType ) {
81+ return eventType == PreUpdateEvent || eventType == PreInsertEvent
82+ }
83+ }
0 commit comments