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
.Collection
;
14 import java
.util
.List
;
16 import java
.util
.UUID
;
18 import org
.apache
.poi
.ss
.formula
.functions
.T
;
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
;
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
40 public class CdmEntitySession
implements ICdmEntitySession
{
43 private final CdmEntitySessionManager cdmEntitySessionManager
;
45 private final ICdmEntitySessionEnabled sessionOwner
;
47 private final CdmTransientEntityCacher cdmTransientEntityCacher
;
49 private final List
<ICdmEntitySessionEnabled
> changeObservers
;
51 private final List
<T
> rootEntities
;
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);
64 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
67 public <O
extends Object
> O
load(O obj
) {
68 return cdmTransientEntityCacher
.load(obj
,true);
73 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
76 public <T
extends CdmBase
> T
load(T cdmBase
) {
77 return (T
)cdmTransientEntityCacher
.load(cdmBase
,true);
81 public void update(CdmBase cdmBase
, Set
<CdmBase
> affectedObjects
) {
83 addEvent(cdmBase
, affectedObjects
, EventType
.UPDATE
);
87 public void delete(ICdmBase cdmBase
, Set
<CdmBase
> affectedObjects
) {
88 addEvent(cdmBase
, affectedObjects
, EventType
.DELETE
);
94 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
97 public <T
extends CdmBase
> EntityCacherDebugResult
debug(T cdmBase
) {
98 EntityCacherDebugResult entityCacherDebugResult
= cdmTransientEntityCacher
.debug(cdmBase
, true);
99 entityCacherDebugResult
.print();
100 return entityCacherDebugResult
;
104 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
107 public <T
extends CdmBase
> Collection
<T
> load(Collection
<T
> cdmBaseList
) {
108 return cdmTransientEntityCacher
.load(cdmBaseList
,true);
112 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
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);
124 * Register to get updated after any interaction with the datastore
127 public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer
) {
128 CdmPostDataChangeObservableListener
.getDefault().register(observer
);
132 * Register to get updated after any interaction with the datastore
135 public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer
) {
136 CdmPostDataChangeObservableListener
.getDefault().unregister(observer
);
143 cdmEntitySessionManager
.bind(sessionOwner
);
146 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
149 public void dispose() {
150 rootEntities
.clear();
151 cdmTransientEntityCacher
.dispose();
152 for(ICdmEntitySessionEnabled observer
: changeObservers
) {
153 CdmPostDataChangeObservableListener
.getDefault().unregister(observer
);
155 changeObservers
.clear();
160 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
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
);
170 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
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
);
182 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
185 public void fireNotifications() {
186 CdmPostDataChangeObservableListener
.getDefault().delayedNotify();
191 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
194 public <T
extends CdmBase
> T
remoteLoad(IService
<T
> service
, UUID uuid
) {
195 T cdmBase
= service
.load(uuid
);
196 return load(cdmBase
);
201 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
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
);
211 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
214 public <T
extends CdmBase
> UUID
remoteSave(IService
<T
> service
, T cdmBase
) {
215 UUID uuid
= service
.save(cdmBase
);
222 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
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);