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