2cb27c83c881db7512c887bae47b47079ce1bccb
[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.Collection;
14 import java.util.List;
15 import java.util.Set;
16 import java.util.UUID;
17
18 import org.apache.poi.ss.formula.functions.T;
19
20 import eu.etaxonomy.cdm.api.service.IService;
21 import eu.etaxonomy.cdm.model.common.CdmBase;
22 import eu.etaxonomy.cdm.model.common.ICdmBase;
23 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
24 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
25 import eu.etaxonomy.cdm.persistence.hibernate.CdmPostDataChangeObservableListener;
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
43 private final CdmEntitySessionManager cdmEntitySessionManager;
44
45 private final ICdmEntitySessionEnabled sessionOwner;
46
47 private final CdmTransientEntityCacher cdmTransientEntityCacher;
48
49 private final List<ICdmEntitySessionEnabled> changeObservers;
50
51 private final List<T> rootEntities;
52
53 public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
54 this.sessionOwner = sessionOwner;
55 this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
56 this.rootEntities = new ArrayList<T>();
57 this.cdmEntitySessionManager = cdmEntitySessionManager;
58 this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
59 cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
60 }
61
62
63 /* (non-Javadoc)
64 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
65 */
66 @Override
67 public <O extends Object> O load(O obj) {
68 return cdmTransientEntityCacher.load(obj,true);
69 }
70
71
72 /* (non-Javadoc)
73 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
74 */
75 @Override
76 public <T extends CdmBase> T load(T cdmBase) {
77 return (T)cdmTransientEntityCacher.load(cdmBase,true);
78 }
79
80 @Override
81 public void update(CdmBase cdmBase, Set<CdmBase> affectedObjects) {
82 load(cdmBase);
83 addEvent(cdmBase, affectedObjects, EventType.UPDATE);
84 }
85
86 @Override
87 public void delete(ICdmBase cdmBase, Set<CdmBase> affectedObjects) {
88 addEvent(cdmBase, affectedObjects, EventType.DELETE);
89 }
90
91
92
93 /* (non-Javadoc)
94 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
95 */
96 @Override
97 public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
98 EntityCacherDebugResult entityCacherDebugResult = cdmTransientEntityCacher.debug(cdmBase, true);
99 entityCacherDebugResult.print();
100 return entityCacherDebugResult;
101 }
102
103 /* (non-Javadoc)
104 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
105 */
106 @Override
107 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
108 return cdmTransientEntityCacher.load(cdmBaseList,true);
109 }
110
111 /* (non-Javadoc)
112 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
113 */
114 @Override
115 public void setEntitiesAsLatest() {
116 //FIXME:Remoting need to think more about whether we really need this
117 // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
118 // for(CdmBase entity : entities) {
119 // cdmEntitySessionManager.setEntityAsLatest(entity);
120 // }
121 }
122
123 /**
124 * Register to get updated after any interaction with the datastore
125 */
126 @Override
127 public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
128 CdmPostDataChangeObservableListener.getDefault().register(observer);
129 }
130
131 /**
132 * Register to get updated after any interaction with the datastore
133 */
134 @Override
135 public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
136 CdmPostDataChangeObservableListener.getDefault().unregister(observer);
137 }
138
139
140
141 @Override
142 public void bind() {
143 cdmEntitySessionManager.bind(sessionOwner);
144 }
145 /* (non-Javadoc)
146 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
147 */
148 @Override
149 public void dispose() {
150 rootEntities.clear();
151 cdmTransientEntityCacher.dispose();
152 for(ICdmEntitySessionEnabled observer : changeObservers) {
153 CdmPostDataChangeObservableListener.getDefault().unregister(observer);
154 }
155 changeObservers.clear();
156 }
157
158
159 /* (non-Javadoc)
160 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
161 */
162 @Override
163 public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
164 CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
165 CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
166 }
167
168
169 /* (non-Javadoc)
170 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
171 */
172 @Override
173 public <T extends ICdmBase> void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
174 for(ICdmBase cdmBase : cdmBases) {
175 CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
176 CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
177 }
178
179 }
180
181 /* (non-Javadoc)
182 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
183 */
184 @Override
185 public void fireNotifications() {
186 CdmPostDataChangeObservableListener.getDefault().delayedNotify();
187 }
188
189
190 /* (non-Javadoc)
191 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
192 */
193 @Override
194 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid) {
195 T cdmBase = service.load(uuid);
196 return load(cdmBase);
197 }
198
199
200 /* (non-Javadoc)
201 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
202 */
203 @Override
204 public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
205 T cdmBase = service.load(uuid, propertyPaths);
206 return load(cdmBase);
207 }
208
209
210 /* (non-Javadoc)
211 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
212 */
213 @Override
214 public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
215 UUID uuid = service.save(cdmBase);
216 load(cdmBase);
217 return uuid;
218 }
219
220
221 /* (non-Javadoc)
222 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
223 */
224 @Override
225 public <T extends CdmBase> void remoteUpdate(IService<T> service, T cdmBase) {
226 service.merge(cdmBase);
227 // FIXME:Remoting not really sure if we need to reload the new
228 // merged object or can we keep using the old one
229 //return load(mergedCdmBase);
230 }
231
232
233
234
235
236
237 }