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