3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.session
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Arrays
;
14 import java
.util
.Collection
;
15 import java
.util
.List
;
17 import java
.util
.UUID
;
19 import net
.sf
.ehcache
.statistics
.LiveCacheStatistics
;
21 import org
.apache
.log4j
.Logger
;
23 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
24 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
25 import eu
.etaxonomy
.cdm
.model
.common
.ICdmBase
;
26 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeEvent
;
27 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeEvent
.EventType
;
28 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmPostDataChangeObservableListener
;
29 import eu
.etaxonomy
.taxeditor
.remoting
.cache
.CdmTransientEntityCacher
;
30 import eu
.etaxonomy
.taxeditor
.remoting
.cache
.EntityCacherDebugResult
;
35 * NOTE : It would be nice to have this class performing merge / delete operations
36 * using services, but this is only possible if we can 'intelligently'
37 * get from a model class to the correspoding service class
43 public class CdmEntitySession
implements ICdmEntitySession
{
45 private static final Logger logger
= Logger
.getLogger(CdmEntitySession
.class);
47 private final CdmEntitySessionManager cdmEntitySessionManager
;
49 private final ICdmEntitySessionEnabled sessionOwner
;
51 private final CdmTransientEntityCacher cdmTransientEntityCacher
;
53 private final List
<ICdmEntitySessionEnabled
> changeObservers
;
57 public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner
, CdmEntitySessionManager cdmEntitySessionManager
) {
58 this.sessionOwner
= sessionOwner
;
59 this.cdmTransientEntityCacher
= new CdmTransientEntityCacher(sessionOwner
, cdmEntitySessionManager
);
60 this.cdmEntitySessionManager
= cdmEntitySessionManager
;
61 this.changeObservers
= new ArrayList
<ICdmEntitySessionEnabled
>();
62 cdmEntitySessionManager
.addToOwnerSessionMap(sessionOwner
, this);
67 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
70 public <O
extends Object
> O
load(O obj
) {
71 return cdmTransientEntityCacher
.load(obj
,true);
76 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
79 public <T
extends CdmBase
> T
load(T cdmBase
) {
80 return (T
)cdmTransientEntityCacher
.load(cdmBase
,true);
84 public <T
extends ICdmBase
> void update(T cdmBase
, Set
<CdmBase
> affectedObjects
) {
86 addEvent(cdmBase
, affectedObjects
, EventType
.UPDATE
);
90 public <T
extends ICdmBase
> void delete(T cdmBase
, Set
<CdmBase
> affectedObjects
) {
91 for(CdmBase cb
: affectedObjects
) {
94 addEvent(cdmBase
, affectedObjects
, EventType
.DELETE
);
98 public <T
extends ICdmBase
> void delete(Set
<T
> cdmBases
, Set
<CdmBase
> affectedObjects
) {
99 for(CdmBase cb
: affectedObjects
) {
102 addEvent(cdmBases
, affectedObjects
, EventType
.DELETE
);
108 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
111 public <T
extends CdmBase
> EntityCacherDebugResult
debug(T cdmBase
) {
112 return debug(Arrays
.asList(cdmBase
));
118 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
121 public <T
extends CdmBase
> EntityCacherDebugResult
debug(List
<T
> cdmBases
) {
122 EntityCacherDebugResult entityCacherDebugResult
=
123 new EntityCacherDebugResult(cdmTransientEntityCacher
, cdmBases
);
124 return entityCacherDebugResult
;
129 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
132 public <T
extends CdmBase
> EntityCacherDebugResult
debug() {
133 return debug(getRootEntities());
137 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
140 public <T
extends CdmBase
> Collection
<T
> load(Collection
<T
> cdmBaseList
) {
141 return cdmTransientEntityCacher
.load(cdmBaseList
,true);
145 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
148 public void setEntitiesAsLatest() {
149 //FIXME:Remoting need to think more about whether we really need this
150 // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
151 // for(CdmBase entity : entities) {
152 // cdmEntitySessionManager.setEntityAsLatest(entity);
157 * Register to get updated after any interaction with the datastore
160 public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer
) {
161 CdmPostDataChangeObservableListener
.getDefault().register(observer
);
165 * Register to get updated after any interaction with the datastore
168 public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer
) {
169 CdmPostDataChangeObservableListener
.getDefault().unregister(observer
);
176 logger
.info("Binding session with owner " + sessionOwner
.toString());
177 cdmEntitySessionManager
.bind(sessionOwner
);
178 cdmEntitySessionManager
.notifyObservers();
182 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
185 public void dispose() {
187 cdmTransientEntityCacher
.dispose();
188 for(ICdmEntitySessionEnabled observer
: changeObservers
) {
189 CdmPostDataChangeObservableListener
.getDefault().unregister(observer
);
191 changeObservers
.clear();
192 cdmEntitySessionManager
.dispose(sessionOwner
);
197 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
200 public void addEvent(ICdmBase cdmBase
, Set
<CdmBase
> affectedObjects
, EventType eventType
) {
201 CdmDataChangeEvent cdce
= CdmDataChangeEvent
.NewInstance((CdmBase
)cdmBase
, affectedObjects
, eventType
);
202 CdmPostDataChangeObservableListener
.getDefault().notifyObservers(cdce
);
207 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
210 public <T
extends ICdmBase
> void addEvent(Collection
<T
> cdmBases
, Set
<CdmBase
> affectedObjects
, EventType eventType
) {
211 for(ICdmBase cdmBase
: cdmBases
) {
212 CdmDataChangeEvent cdce
= CdmDataChangeEvent
.NewInstance((CdmBase
)cdmBase
, affectedObjects
, eventType
);
213 CdmPostDataChangeObservableListener
.getDefault().notifyObservers(cdce
);
219 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
222 public void fireNotifications() {
223 CdmPostDataChangeObservableListener
.getDefault().delayedNotify();
228 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
231 public <T
extends CdmBase
> T
remoteLoad(IService
<T
> service
, UUID uuid
) {
232 T cdmBase
= service
.load(uuid
);
233 return load(cdmBase
);
238 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
241 public <T
extends CdmBase
> T
remoteLoad(IService
<T
> service
, UUID uuid
, List
<String
> propertyPaths
) {
242 T cdmBase
= service
.load(uuid
, propertyPaths
);
243 return load(cdmBase
);
248 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
251 public <T
extends CdmBase
> UUID
remoteSave(IService
<T
> service
, T cdmBase
) {
252 UUID uuid
= service
.save(cdmBase
);
259 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
262 public <T
extends CdmBase
> T
remoteUpdate(IService
<T
> service
, T cdmBase
) {
264 T mergedCdmBase
= service
.merge(cdmBase
);
265 //cdmTransientEntityCacher.clear();
266 // FIXME:Remoting not really sure if we need to reload the new
267 // merged object or can we keep using the old one
268 //return load(mergedCdmBase);
270 return mergedCdmBase
;
275 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
278 public boolean isActive() {
279 return cdmEntitySessionManager
.getActiveSession() == this;
284 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
287 public ICdmEntitySessionEnabled
getOwner() {
293 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
296 public LiveCacheStatistics
getCacheStatistics() {
297 return cdmTransientEntityCacher
.getCacheStatistics();
302 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
305 public <T
extends CdmBase
> List
<T
> getRootEntities() {
306 return sessionOwner
.getRootEntities();