Merge branch 'develop' into LibrAlign
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / taxeditor / session / CdmEntitySession.java
1 /**
2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.session;
10
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.UUID;
17
18 import net.sf.ehcache.statistics.LiveCacheStatistics;
19
20 import org.apache.log4j.Logger;
21
22 import eu.etaxonomy.cdm.api.service.IService;
23 import eu.etaxonomy.cdm.api.service.UpdateResult;
24 import eu.etaxonomy.cdm.model.common.CdmBase;
25 import eu.etaxonomy.cdm.persistence.dto.MergeResult;
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 private static final Logger logger = Logger.getLogger(CdmEntitySession.class);
43
44 private final CdmEntitySessionManager cdmEntitySessionManager;
45
46 private final ICdmEntitySessionEnabled sessionOwner;
47
48 private CdmTransientEntityCacher cdmTransientEntityCacher;
49
50 private List<ICdmEntitySessionEnabled> changeObservers;
51
52
53 public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
54 this.sessionOwner = sessionOwner;
55 this.cdmEntitySessionManager = cdmEntitySessionManager;
56 init(sessionOwner, cdmEntitySessionManager);
57 }
58
59 private void init(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
60 this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
61 this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
62 cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
63 }
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 /* (non-Javadoc)
96 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
97 */
98 @Override
99 public <T extends CdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
100 return cdmTransientEntityCacher.load(mergeResult, update);
101 }
102
103 @Override
104 public <T extends CdmBase> void update() {
105 Collection<T> rootEntities = getRootEntities();
106 if(rootEntities != null) {
107 for(T rootEntity : rootEntities) {
108 load(rootEntity, true);
109 }
110 }
111 }
112
113 // @Override
114 // public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
115 // addEvent(cdmBase, affectedObjects, EventType.UPDATE);
116 // }
117 //
118 // @Override
119 // public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
120 // Set<CdmBase> set = new HashSet<CdmBase>();
121 // set.add(affectedObject);
122 // addEvent(cdmBase, set, EventType.UPDATE);
123 // }
124 //
125 //
126 // @Override
127 // public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
128 // addEvent(cdmBase, affectedObjects, EventType.DELETE);
129 // }
130 //
131 // @Override
132 // public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
133 // addEvent(cdmBases, affectedObjects, EventType.DELETE);
134 // }
135
136
137
138 /* (non-Javadoc)
139 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
140 */
141 @Override
142 public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
143 return debug(Arrays.asList(cdmBase));
144 }
145
146
147
148 /* (non-Javadoc)
149 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
150 */
151 @Override
152 public <T extends CdmBase> EntityCacherDebugResult debug(Collection<T> cdmBases) {
153 EntityCacherDebugResult entityCacherDebugResult =
154 new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
155 return entityCacherDebugResult;
156 }
157
158
159 /* (non-Javadoc)
160 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
161 */
162 @Override
163 public <T extends CdmBase> EntityCacherDebugResult debug() {
164 return debug(getRootEntities());
165 }
166
167 /* (non-Javadoc)
168 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
169 */
170 @Override
171 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
172 return cdmTransientEntityCacher.load(cdmBaseList, update);
173 }
174
175 /* (non-Javadoc)
176 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
177 */
178 @Override
179 public void setEntitiesAsLatest() {
180 //FIXME:Remoting need to think more about whether we really need this
181 // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
182 // for(CdmBase entity : entities) {
183 // cdmEntitySessionManager.setEntityAsLatest(entity);
184 // }
185 }
186
187
188 @Override
189 public void bind() {
190 logger.info("Binding session with owner " + sessionOwner.toString());
191 if(!cdmEntitySessionManager.contains(sessionOwner)) {
192 init(sessionOwner, cdmEntitySessionManager);
193 }
194 cdmEntitySessionManager.bind(sessionOwner);
195
196 }
197
198 /* (non-Javadoc)
199 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
200 */
201 @Override
202 public void dispose() {
203
204 cdmTransientEntityCacher.dispose();
205 changeObservers.clear();
206 cdmEntitySessionManager.remove(sessionOwner);
207
208 }
209
210
211 // /* (non-Javadoc)
212 // * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
213 // */
214 // @Override
215 // public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
216 // affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
217 // CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
218 // CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
219 // }
220
221
222 /* (non-Javadoc)
223 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
224 */
225 @Override
226 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid) {
227 T cdmBase = service.load(uuid);
228 return load(cdmBase, false);
229 }
230
231
232 /* (non-Javadoc)
233 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
234 */
235 @Override
236 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
237 T cdmBase = service.load(uuid, propertyPaths);
238 return load(cdmBase, false);
239 }
240
241
242 /* (non-Javadoc)
243 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
244 */
245 @Override
246 public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
247 UUID uuid = service.save(cdmBase).getUuid();
248 load(cdmBase,false);
249 return uuid;
250 }
251
252
253 /* (non-Javadoc)
254 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
255 */
256 @Override
257 public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
258 T mergedCdmBase = service.merge(cdmBase, true).getMergedEntity();
259 return mergedCdmBase;
260 }
261
262
263 /* (non-Javadoc)
264 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
265 */
266 @Override
267 public boolean isActive() {
268 return cdmEntitySessionManager.getActiveSession() == this;
269 }
270
271
272 /* (non-Javadoc)
273 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
274 */
275 @Override
276 public ICdmEntitySessionEnabled getOwner() {
277 return sessionOwner;
278 }
279
280
281 /* (non-Javadoc)
282 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
283 */
284 @Override
285 public LiveCacheStatistics getCacheStatistics() {
286 return cdmTransientEntityCacher.getCacheStatistics();
287 }
288
289
290 /* (non-Javadoc)
291 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
292 */
293 @Override
294 public <T extends CdmBase> Collection<T> getRootEntities() {
295 return sessionOwner.getRootEntities();
296 }
297
298 public CdmTransientEntityCacher getCacher() {
299 return cdmTransientEntityCacher;
300 }
301
302 @Override
303 public List<String> getPropertyPaths(Object obj) {
304 Map<Object, List<String>> propertyPathsMap = sessionOwner.getPropertyPathsMap();
305 if(propertyPathsMap == null || propertyPathsMap.isEmpty()) {
306 return null;
307 }
308 return propertyPathsMap.get(obj);
309 }
310
311 /* (non-Javadoc)
312 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase)
313 */
314 @Override
315 public void addNewCdmEntity(CdmBase newEntity) {
316 cdmTransientEntityCacher.addNewEntity(newEntity);
317 }
318
319 }