4bb1c3d58c500ddcd90073e74ba4111fef2be9a8
[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.Map;
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.api.service.UpdateResult;
25 import eu.etaxonomy.cdm.model.common.CdmBase;
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 @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 if(!cdmEntitySessionManager.contains(sessionOwner)) {
184 init(sessionOwner, cdmEntitySessionManager);
185 }
186 cdmEntitySessionManager.bind(sessionOwner);
187
188 }
189
190 /* (non-Javadoc)
191 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
192 */
193 @Override
194 public void dispose() {
195
196 cdmTransientEntityCacher.dispose();
197 changeObservers.clear();
198 cdmEntitySessionManager.remove(sessionOwner);
199
200 }
201
202
203 // /* (non-Javadoc)
204 // * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
205 // */
206 // @Override
207 // public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
208 // affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
209 // CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
210 // CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
211 // }
212
213
214 /* (non-Javadoc)
215 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
216 */
217 @Override
218 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid) {
219 T cdmBase = service.load(uuid);
220 return load(cdmBase, false);
221 }
222
223
224 /* (non-Javadoc)
225 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
226 */
227 @Override
228 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
229 T cdmBase = service.load(uuid, propertyPaths);
230 return load(cdmBase, false);
231 }
232
233
234 /* (non-Javadoc)
235 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
236 */
237 @Override
238 public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
239 UUID uuid = service.save(cdmBase).getUuid();
240 load(cdmBase,false);
241 return uuid;
242 }
243
244
245 /* (non-Javadoc)
246 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
247 */
248 @Override
249 public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
250 T mergedCdmBase = service.merge(cdmBase);
251 return mergedCdmBase;
252 }
253
254
255 /* (non-Javadoc)
256 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
257 */
258 @Override
259 public boolean isActive() {
260 return cdmEntitySessionManager.getActiveSession() == this;
261 }
262
263
264 /* (non-Javadoc)
265 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
266 */
267 @Override
268 public ICdmEntitySessionEnabled getOwner() {
269 return sessionOwner;
270 }
271
272
273 /* (non-Javadoc)
274 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
275 */
276 @Override
277 public LiveCacheStatistics getCacheStatistics() {
278 return cdmTransientEntityCacher.getCacheStatistics();
279 }
280
281
282 /* (non-Javadoc)
283 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
284 */
285 @Override
286 public <T extends CdmBase> Collection<T> getRootEntities() {
287 return sessionOwner.getRootEntities();
288 }
289
290 public CdmTransientEntityCacher getCacher() {
291 return cdmTransientEntityCacher;
292 }
293
294 @Override
295 public List<String> getPropertyPaths(Object obj) {
296 Map<Object, List<String>> propertyPathsMap = sessionOwner.getPropertyPathsMap();
297 if(propertyPathsMap == null || propertyPathsMap.isEmpty()) {
298 return null;
299 }
300 return propertyPathsMap.get(obj);
301 }
302
303 /* (non-Javadoc)
304 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase)
305 */
306 @Override
307 public void addNewCdmEntity(CdmBase newEntity) {
308 cdmTransientEntityCacher.addNewEntity(newEntity);
309 }
310
311 }