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.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 /* (non-Javadoc)
68 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.lang.Object, boolean)
69 */
70 @Override
71 public <O extends Object> O load(O obj, boolean update) {
72 return cdmTransientEntityCacher.load(obj, update);
73 }
74
75
76 /* (non-Javadoc)
77 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.model.common.CdmBase, boolean)
78 */
79 @Override
80 public <T extends CdmBase> T load(T cdmBase, boolean update) {
81 return (T)cdmTransientEntityCacher.load(cdmBase, update);
82 }
83
84
85
86 /* (non-Javadoc)
87 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
88 */
89 @Override
90 public UpdateResult load(UpdateResult updateResult, boolean update) {
91 return cdmTransientEntityCacher.load(updateResult, update);
92 }
93
94 @Override
95 public <T extends CdmBase> void update() {
96 Collection<T> rootEntities = getRootEntities();
97 if(rootEntities != null) {
98 for(T rootEntity : rootEntities) {
99 load(rootEntity, true);
100 }
101 }
102 }
103
104 // @Override
105 // public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
106 // addEvent(cdmBase, affectedObjects, EventType.UPDATE);
107 // }
108 //
109 // @Override
110 // public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
111 // Set<CdmBase> set = new HashSet<CdmBase>();
112 // set.add(affectedObject);
113 // addEvent(cdmBase, set, EventType.UPDATE);
114 // }
115 //
116 //
117 // @Override
118 // public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
119 // addEvent(cdmBase, affectedObjects, EventType.DELETE);
120 // }
121 //
122 // @Override
123 // public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
124 // addEvent(cdmBases, affectedObjects, EventType.DELETE);
125 // }
126
127
128
129 /* (non-Javadoc)
130 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
131 */
132 @Override
133 public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
134 return debug(Arrays.asList(cdmBase));
135 }
136
137
138
139 /* (non-Javadoc)
140 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
141 */
142 @Override
143 public <T extends CdmBase> EntityCacherDebugResult debug(Collection<T> cdmBases) {
144 EntityCacherDebugResult entityCacherDebugResult =
145 new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
146 return entityCacherDebugResult;
147 }
148
149
150 /* (non-Javadoc)
151 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
152 */
153 @Override
154 public <T extends CdmBase> EntityCacherDebugResult debug() {
155 return debug(getRootEntities());
156 }
157
158 /* (non-Javadoc)
159 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
160 */
161 @Override
162 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
163 return cdmTransientEntityCacher.load(cdmBaseList, update);
164 }
165
166 /* (non-Javadoc)
167 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
168 */
169 @Override
170 public void setEntitiesAsLatest() {
171 //FIXME:Remoting need to think more about whether we really need this
172 // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
173 // for(CdmBase entity : entities) {
174 // cdmEntitySessionManager.setEntityAsLatest(entity);
175 // }
176 }
177
178
179 @Override
180 public void bind() {
181 logger.info("Binding session with owner " + sessionOwner.toString());
182 if(!cdmEntitySessionManager.contains(sessionOwner)) {
183 init(sessionOwner, cdmEntitySessionManager);
184 }
185 cdmEntitySessionManager.bind(sessionOwner);
186
187 }
188
189 /* (non-Javadoc)
190 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
191 */
192 @Override
193 public void dispose() {
194
195 cdmTransientEntityCacher.dispose();
196 changeObservers.clear();
197 cdmEntitySessionManager.remove(sessionOwner);
198
199 }
200
201
202 // /* (non-Javadoc)
203 // * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
204 // */
205 // @Override
206 // public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
207 // affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
208 // CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
209 // CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
210 // }
211
212
213 /* (non-Javadoc)
214 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
215 */
216 @Override
217 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid) {
218 T cdmBase = service.load(uuid);
219 return load(cdmBase, false);
220 }
221
222
223 /* (non-Javadoc)
224 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
225 */
226 @Override
227 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
228 T cdmBase = service.load(uuid, propertyPaths);
229 return load(cdmBase, false);
230 }
231
232
233 /* (non-Javadoc)
234 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
235 */
236 @Override
237 public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
238 UUID uuid = service.save(cdmBase).getUuid();
239 load(cdmBase,false);
240 return uuid;
241 }
242
243
244 /* (non-Javadoc)
245 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
246 */
247 @Override
248 public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
249 T mergedCdmBase = service.merge(cdmBase);
250 return mergedCdmBase;
251 }
252
253
254 /* (non-Javadoc)
255 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
256 */
257 @Override
258 public boolean isActive() {
259 return cdmEntitySessionManager.getActiveSession() == this;
260 }
261
262
263 /* (non-Javadoc)
264 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
265 */
266 @Override
267 public ICdmEntitySessionEnabled getOwner() {
268 return sessionOwner;
269 }
270
271
272 /* (non-Javadoc)
273 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
274 */
275 @Override
276 public LiveCacheStatistics getCacheStatistics() {
277 return cdmTransientEntityCacher.getCacheStatistics();
278 }
279
280
281 /* (non-Javadoc)
282 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
283 */
284 @Override
285 public <T extends CdmBase> Collection<T> getRootEntities() {
286 return sessionOwner.getRootEntities();
287 }
288
289 public CdmTransientEntityCacher getCacher() {
290 return cdmTransientEntityCacher;
291 }
292
293 @Override
294 public List<String> getPropertyPaths(Object obj) {
295 Map<Object, List<String>> propertyPathsMap = sessionOwner.getPropertyPathsMap();
296 if(propertyPathsMap == null || propertyPathsMap.isEmpty()) {
297 return null;
298 }
299 return propertyPathsMap.get(obj);
300 }
301
302 }