CdmTransientEntityCacher : overriding cache field only in the case of initialised...
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / taxeditor / session / CdmEntitySession.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10 package eu.etaxonomy.taxeditor.session;
11
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.Set;
16 import java.util.UUID;
17
18 import org.apache.poi.ss.formula.functions.T;
19
20 import eu.etaxonomy.cdm.api.service.IService;
21 import eu.etaxonomy.cdm.model.common.CdmBase;
22 import eu.etaxonomy.cdm.model.common.ICdmBase;
23 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
24 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
25 import eu.etaxonomy.cdm.persistence.hibernate.CdmPostDataChangeObservableListener;
26 import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
27 import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
28
29
30 /**
31 *
32 * NOTE : It would be nice to have this class performing merge / delete operations
33 * using services, but this is only possible if we can 'intelligently'
34 * get from a model class to the correspoding service class
35 * @author cmathew
36 * @date 20 Oct 2014
37 *
38 */
39
40 public class CdmEntitySession implements ICdmEntitySession {
41
42
43 private final CdmEntitySessionManager cdmEntitySessionManager;
44
45 private final ICdmEntitySessionEnabled sessionOwner;
46
47 private final CdmTransientEntityCacher cdmTransientEntityCacher;
48
49 private final List<ICdmEntitySessionEnabled> changeObservers;
50
51 private final List<T> rootEntities;
52
53 public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
54 this.sessionOwner = sessionOwner;
55 this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
56 this.rootEntities = new ArrayList<T>();
57 this.cdmEntitySessionManager = cdmEntitySessionManager;
58 this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
59 cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
60 }
61
62
63 /* (non-Javadoc)
64 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
65 */
66 @Override
67 public <O extends Object> O load(O obj) {
68 return cdmTransientEntityCacher.load(obj,true);
69 }
70
71
72 /* (non-Javadoc)
73 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
74 */
75 @Override
76 public <T extends CdmBase> T load(T cdmBase) {
77 return (T)cdmTransientEntityCacher.load(cdmBase,true);
78 }
79
80 @Override
81 public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
82 load(cdmBase);
83 addEvent(cdmBase, affectedObjects, EventType.UPDATE);
84 }
85
86 @Override
87 public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
88 for(CdmBase cb : affectedObjects) {
89 load(cb);
90 }
91 addEvent(cdmBase, affectedObjects, EventType.DELETE);
92 }
93
94 @Override
95 public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
96 for(CdmBase cb : affectedObjects) {
97 load(cb);
98 }
99 addEvent(cdmBases, affectedObjects, EventType.DELETE);
100 }
101
102
103
104 /* (non-Javadoc)
105 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
106 */
107 @Override
108 public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
109 EntityCacherDebugResult entityCacherDebugResult = cdmTransientEntityCacher.debug(cdmBase, true);
110 entityCacherDebugResult.print();
111 return entityCacherDebugResult;
112 }
113
114 /* (non-Javadoc)
115 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
116 */
117 @Override
118 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
119 return cdmTransientEntityCacher.load(cdmBaseList,true);
120 }
121
122 /* (non-Javadoc)
123 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
124 */
125 @Override
126 public void setEntitiesAsLatest() {
127 //FIXME:Remoting need to think more about whether we really need this
128 // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
129 // for(CdmBase entity : entities) {
130 // cdmEntitySessionManager.setEntityAsLatest(entity);
131 // }
132 }
133
134 /**
135 * Register to get updated after any interaction with the datastore
136 */
137 @Override
138 public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
139 CdmPostDataChangeObservableListener.getDefault().register(observer);
140 }
141
142 /**
143 * Register to get updated after any interaction with the datastore
144 */
145 @Override
146 public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
147 CdmPostDataChangeObservableListener.getDefault().unregister(observer);
148 }
149
150
151
152 @Override
153 public void bind() {
154 cdmEntitySessionManager.bind(sessionOwner);
155 }
156 /* (non-Javadoc)
157 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
158 */
159 @Override
160 public void dispose() {
161 rootEntities.clear();
162 cdmTransientEntityCacher.dispose();
163 for(ICdmEntitySessionEnabled observer : changeObservers) {
164 CdmPostDataChangeObservableListener.getDefault().unregister(observer);
165 }
166 changeObservers.clear();
167 }
168
169
170 /* (non-Javadoc)
171 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
172 */
173 @Override
174 public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
175 CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
176 CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
177 }
178
179
180 /* (non-Javadoc)
181 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
182 */
183 @Override
184 public <T extends ICdmBase> void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
185 for(ICdmBase cdmBase : cdmBases) {
186 CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
187 CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
188 }
189
190 }
191
192 /* (non-Javadoc)
193 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
194 */
195 @Override
196 public void fireNotifications() {
197 CdmPostDataChangeObservableListener.getDefault().delayedNotify();
198 }
199
200
201 /* (non-Javadoc)
202 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
203 */
204 @Override
205 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid) {
206 T cdmBase = service.load(uuid);
207 return load(cdmBase);
208 }
209
210
211 /* (non-Javadoc)
212 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
213 */
214 @Override
215 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
216 T cdmBase = service.load(uuid, propertyPaths);
217 return load(cdmBase);
218 }
219
220
221 /* (non-Javadoc)
222 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
223 */
224 @Override
225 public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
226 UUID uuid = service.save(cdmBase);
227 load(cdmBase);
228 return uuid;
229 }
230
231
232 /* (non-Javadoc)
233 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
234 */
235 @Override
236 public <T extends CdmBase> void remoteUpdate(IService<T> service, T cdmBase) {
237 service.merge(cdmBase);
238 // FIXME:Remoting not really sure if we need to reload the new
239 // merged object or can we keep using the old one
240 //return load(mergedCdmBase);
241 }
242
243
244
245
246
247
248 }