OpenInspectSessionsHandler : handler for opening the inspect session dialog
[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.Arrays;
14 import java.util.Collection;
15 import java.util.List;
16 import java.util.Set;
17 import java.util.UUID;
18
19 import net.sf.ehcache.statistics.LiveCacheStatistics;
20
21 import org.apache.log4j.Logger;
22
23 import eu.etaxonomy.cdm.api.service.IService;
24 import eu.etaxonomy.cdm.model.common.CdmBase;
25 import eu.etaxonomy.cdm.model.common.ICdmBase;
26 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
27 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
28 import eu.etaxonomy.cdm.persistence.hibernate.CdmPostDataChangeObservableListener;
29 import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
30 import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
31
32
33 /**
34 *
35 * NOTE : It would be nice to have this class performing merge / delete operations
36 * using services, but this is only possible if we can 'intelligently'
37 * get from a model class to the correspoding service class
38 * @author cmathew
39 * @date 20 Oct 2014
40 *
41 */
42
43 public class CdmEntitySession implements ICdmEntitySession {
44
45 private static final Logger logger = Logger.getLogger(CdmEntitySession.class);
46
47 private final CdmEntitySessionManager cdmEntitySessionManager;
48
49 private final ICdmEntitySessionEnabled sessionOwner;
50
51 private final CdmTransientEntityCacher cdmTransientEntityCacher;
52
53 private final List<ICdmEntitySessionEnabled> changeObservers;
54
55
56
57 public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
58 this.sessionOwner = sessionOwner;
59 this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
60 this.cdmEntitySessionManager = cdmEntitySessionManager;
61 this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
62 cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
63 }
64
65
66 /* (non-Javadoc)
67 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
68 */
69 @Override
70 public <O extends Object> O load(O obj) {
71 return cdmTransientEntityCacher.load(obj,true);
72 }
73
74
75 /* (non-Javadoc)
76 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
77 */
78 @Override
79 public <T extends CdmBase> T load(T cdmBase) {
80 return (T)cdmTransientEntityCacher.load(cdmBase,true);
81 }
82
83 @Override
84 public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
85 load(cdmBase);
86 addEvent(cdmBase, affectedObjects, EventType.UPDATE);
87 }
88
89 @Override
90 public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
91 for(CdmBase cb : affectedObjects) {
92 load(cb);
93 }
94 addEvent(cdmBase, affectedObjects, EventType.DELETE);
95 }
96
97 @Override
98 public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
99 for(CdmBase cb : affectedObjects) {
100 load(cb);
101 }
102 addEvent(cdmBases, affectedObjects, EventType.DELETE);
103 }
104
105
106
107 /* (non-Javadoc)
108 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
109 */
110 @Override
111 public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
112 return debug(Arrays.asList(cdmBase));
113 }
114
115
116
117 /* (non-Javadoc)
118 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
119 */
120 @Override
121 public <T extends CdmBase> EntityCacherDebugResult debug(List<T> cdmBases) {
122 EntityCacherDebugResult entityCacherDebugResult =
123 new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
124 return entityCacherDebugResult;
125 }
126
127
128 /* (non-Javadoc)
129 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
130 */
131 @Override
132 public <T extends CdmBase> EntityCacherDebugResult debug() {
133 return debug(getRootEntities());
134 }
135
136 /* (non-Javadoc)
137 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
138 */
139 @Override
140 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
141 return cdmTransientEntityCacher.load(cdmBaseList,true);
142 }
143
144 /* (non-Javadoc)
145 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
146 */
147 @Override
148 public void setEntitiesAsLatest() {
149 //FIXME:Remoting need to think more about whether we really need this
150 // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
151 // for(CdmBase entity : entities) {
152 // cdmEntitySessionManager.setEntityAsLatest(entity);
153 // }
154 }
155
156 /**
157 * Register to get updated after any interaction with the datastore
158 */
159 @Override
160 public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
161 CdmPostDataChangeObservableListener.getDefault().register(observer);
162 }
163
164 /**
165 * Register to get updated after any interaction with the datastore
166 */
167 @Override
168 public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
169 CdmPostDataChangeObservableListener.getDefault().unregister(observer);
170 }
171
172
173
174 @Override
175 public void bind() {
176 logger.info("Binding session with owner " + sessionOwner.toString());
177 cdmEntitySessionManager.bind(sessionOwner);
178 cdmEntitySessionManager.notifyObservers();
179 }
180
181 /* (non-Javadoc)
182 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
183 */
184 @Override
185 public void dispose() {
186
187 cdmTransientEntityCacher.dispose();
188 for(ICdmEntitySessionEnabled observer : changeObservers) {
189 CdmPostDataChangeObservableListener.getDefault().unregister(observer);
190 }
191 changeObservers.clear();
192 cdmEntitySessionManager.dispose(sessionOwner);
193 }
194
195
196 /* (non-Javadoc)
197 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
198 */
199 @Override
200 public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
201 CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
202 CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
203 }
204
205
206 /* (non-Javadoc)
207 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
208 */
209 @Override
210 public <T extends ICdmBase> void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
211 for(ICdmBase cdmBase : cdmBases) {
212 CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
213 CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
214 }
215
216 }
217
218 /* (non-Javadoc)
219 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
220 */
221 @Override
222 public void fireNotifications() {
223 CdmPostDataChangeObservableListener.getDefault().delayedNotify();
224 }
225
226
227 /* (non-Javadoc)
228 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
229 */
230 @Override
231 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid) {
232 T cdmBase = service.load(uuid);
233 return load(cdmBase);
234 }
235
236
237 /* (non-Javadoc)
238 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
239 */
240 @Override
241 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
242 T cdmBase = service.load(uuid, propertyPaths);
243 return load(cdmBase);
244 }
245
246
247 /* (non-Javadoc)
248 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
249 */
250 @Override
251 public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
252 UUID uuid = service.save(cdmBase);
253 load(cdmBase);
254 return uuid;
255 }
256
257
258 /* (non-Javadoc)
259 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
260 */
261 @Override
262 public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
263 //debug(cdmBase);
264 T mergedCdmBase = service.merge(cdmBase);
265 //cdmTransientEntityCacher.clear();
266 // FIXME:Remoting not really sure if we need to reload the new
267 // merged object or can we keep using the old one
268 //return load(mergedCdmBase);
269
270 return mergedCdmBase;
271 }
272
273
274 /* (non-Javadoc)
275 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
276 */
277 @Override
278 public boolean isActive() {
279 return cdmEntitySessionManager.getActiveSession() == this;
280 }
281
282
283 /* (non-Javadoc)
284 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
285 */
286 @Override
287 public ICdmEntitySessionEnabled getOwner() {
288 return sessionOwner;
289 }
290
291
292 /* (non-Javadoc)
293 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
294 */
295 @Override
296 public LiveCacheStatistics getCacheStatistics() {
297 return cdmTransientEntityCacher.getCacheStatistics();
298 }
299
300
301 /* (non-Javadoc)
302 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
303 */
304 @Override
305 public <T extends CdmBase> List<T> getRootEntities() {
306 return sessionOwner.getRootEntities();
307 }
308
309
310
311
312
313
314
315
316
317 }