3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.cdm
.persistence
.hibernate
;
13 import java
.util
.HashSet
;
16 import org
.apache
.log4j
.Logger
;
17 import org
.hibernate
.event
.spi
.PostDeleteEvent
;
18 import org
.hibernate
.event
.spi
.PostDeleteEventListener
;
19 import org
.hibernate
.event
.spi
.PostInsertEvent
;
20 import org
.hibernate
.event
.spi
.PostInsertEventListener
;
21 import org
.hibernate
.event
.spi
.PostLoadEvent
;
22 import org
.hibernate
.event
.spi
.PostLoadEventListener
;
23 import org
.hibernate
.event
.spi
.PostUpdateEvent
;
24 import org
.hibernate
.event
.spi
.PostUpdateEventListener
;
26 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
29 * ICdmPostDataChangeObserver implementors may register for this listener and their update() will
30 * be called after any CRUD (Create, Retrieve, Update, Delete).
32 * Only events whose entities are of type CdmBase will be propagated
34 * TODO Manage this class via Spring
40 public class CdmPostDataChangeObservableListener
implements
41 PostDeleteEventListener
42 , PostInsertEventListener
43 , PostLoadEventListener
44 , PostUpdateEventListener
46 private static final long serialVersionUID
= -8764348096490526927L;
47 @SuppressWarnings("unused")
48 private static final Logger logger
= Logger
.getLogger(CdmPostDataChangeObservableListener
.class);
51 * if this is set to true, observers have to be notified manually by calling
52 * {@link #delayedNotify()}. All events until then will be stored in {@link #changeEvents}
54 private boolean delayed
;
57 * Define what events will be propagated
59 private boolean propagateLoads
= false,
60 propagateInserts
= true,
61 propagateUpdates
= true,
62 propagateDeletes
= true;
65 * DataChangeEvents get stored in this list for delayed propagation
67 private CdmDataChangeMap changeEvents
;
72 private final Set
<ICdmPostDataChangeObserver
> observers
= new HashSet
<ICdmPostDataChangeObserver
>();
78 private static CdmPostDataChangeObservableListener instance
;
81 * @return the singleton CdmPostDataChangeObservableListener
83 public static CdmPostDataChangeObservableListener
getDefault(){
85 instance
= new CdmPostDataChangeObservableListener();
86 // TODO set these properties via Spring
87 // get the delayed version by default
88 instance
.setDelayed(true);
89 // omit load events from propagation
90 instance
.setPropagateLoads(false);
96 * Register for updates
100 public void register(ICdmPostDataChangeObserver observer
){
101 getDefault().observers
.add(observer
);
105 * Remove observer from notify queue
108 public void unregister(ICdmPostDataChangeObserver observer
){
109 getDefault().observers
.remove(observer
);
112 public void delayedNotify(){
113 if(delayed
&& changeEvents
.size() > 0){
114 Set
<ICdmPostDataChangeObserver
> modificationSaveObservers
115 = new HashSet
<ICdmPostDataChangeObserver
>(observers
);
116 for( ICdmPostDataChangeObserver observer
: modificationSaveObservers
){
117 observer
.update(changeEvents
);
119 changeEvents
.clear();
124 * Propagates the event to all registered objects.
128 public void notifyObservers(CdmDataChangeEvent event
){
129 for( ICdmPostDataChangeObserver observer
: observers
){
131 // store event for delayed propagation
132 changeEvents
.add(event
.getEventType(), event
);
134 // propagate event directly
135 CdmDataChangeMap tmpMap
= new CdmDataChangeMap();
136 tmpMap
.add(event
.getEventType(), event
);
137 observer
.update(tmpMap
);
142 public void fireNotification(CdmDataChangeEvent event
) {
143 for( ICdmPostDataChangeObserver observer
: observers
){
144 // propagate event directly
145 CdmDataChangeMap tmpMap
= new CdmDataChangeMap();
146 tmpMap
.add(event
.getEventType(), event
);
147 observer
.update(tmpMap
);
153 public void onPostInsert(PostInsertEvent event
) {
154 if(propagateInserts
&& event
.getEntity() instanceof CdmBase
){
155 getDefault().notifyObservers(CdmDataChangeEvent
.NewInstance(event
));
160 public void onPostLoad(PostLoadEvent event
) {
161 if(propagateLoads
&& event
.getEntity() instanceof CdmBase
){
162 getDefault().notifyObservers(CdmDataChangeEvent
.NewInstance(event
));
167 public void onPostUpdate(PostUpdateEvent event
) {
168 if(propagateUpdates
&& event
.getEntity() instanceof CdmBase
){
169 getDefault().notifyObservers(CdmDataChangeEvent
.NewInstance(event
));
174 public void onPostDelete(PostDeleteEvent event
) {
175 if(propagateDeletes
&& event
.getEntity() instanceof CdmBase
){
176 getDefault().notifyObservers(CdmDataChangeEvent
.NewInstance(event
));
181 * @return the delayed
183 public boolean isDelayed() {
188 * @param delayed the delayed to set
190 public void setDelayed(boolean delayed
) {
191 if(delayed
&& changeEvents
== null){
192 changeEvents
= new CdmDataChangeMap();
194 this.delayed
= delayed
;
198 * @return the propagateLoads
200 public boolean isPropagateLoads() {
201 return propagateLoads
;
205 * @param propagateLoads the propagateLoads to set
207 public void setPropagateLoads(boolean propagateLoads
) {
208 this.propagateLoads
= propagateLoads
;
212 * @return the propagateInserts
214 public boolean isPropagateInserts() {
215 return propagateInserts
;
219 * @param propagateInserts the propagateInserts to set
221 public void setPropagateInserts(boolean propagateInserts
) {
222 this.propagateInserts
= propagateInserts
;
226 * @return the propagateUpdates
228 public boolean isPropagateUpdates() {
229 return propagateUpdates
;
233 * @param propagateUpdates the propagateUpdates to set
235 public void setPropagateUpdates(boolean propagateUpdates
) {
236 this.propagateUpdates
= propagateUpdates
;
240 * @return the propagateDeletes
242 public boolean isPropagateDeletes() {
243 return propagateDeletes
;
247 * @param propagateDeletes the propagateDeletes to set
249 public void setPropagateDeletes(boolean propagateDeletes
) {
250 this.propagateDeletes
= propagateDeletes
;