2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.taxeditor
.session
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Arrays
;
13 import java
.util
.Collection
;
14 import java
.util
.List
;
16 import java
.util
.UUID
;
18 import net
.sf
.ehcache
.statistics
.LiveCacheStatistics
;
20 import org
.apache
.log4j
.Logger
;
22 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
23 import eu
.etaxonomy
.cdm
.api
.service
.UpdateResult
;
24 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
25 import eu
.etaxonomy
.cdm
.persistence
.dto
.MergeResult
;
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
{
42 private static final Logger logger
= Logger
.getLogger(CdmEntitySession
.class);
44 private final CdmEntitySessionManager cdmEntitySessionManager
;
46 private final ICdmEntitySessionEnabled sessionOwner
;
48 private CdmTransientEntityCacher cdmTransientEntityCacher
;
50 private List
<ICdmEntitySessionEnabled
> changeObservers
;
53 public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner
, CdmEntitySessionManager cdmEntitySessionManager
) {
54 this.sessionOwner
= sessionOwner
;
55 this.cdmEntitySessionManager
= cdmEntitySessionManager
;
56 init(sessionOwner
, cdmEntitySessionManager
);
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);
69 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.lang.Object, boolean)
72 public <O
extends Object
> O
load(O obj
, boolean update
) {
73 return cdmTransientEntityCacher
.load(obj
, update
);
78 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.model.common.CdmBase, boolean)
81 public <T
extends CdmBase
> T
load(T cdmBase
, boolean update
) {
82 return (T
)cdmTransientEntityCacher
.load(cdmBase
, update
);
88 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
91 public UpdateResult
load(UpdateResult updateResult
, boolean update
) {
92 return cdmTransientEntityCacher
.load(updateResult
, update
);
96 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
99 public <T
extends CdmBase
> MergeResult
<T
> load(MergeResult
<T
> mergeResult
, boolean update
) {
100 return cdmTransientEntityCacher
.load(mergeResult
, update
);
104 public <T
extends CdmBase
> void update() {
105 Collection
<T
> rootEntities
= getRootEntities();
106 if(rootEntities
!= null) {
107 for(T rootEntity
: rootEntities
) {
108 load(rootEntity
, true);
114 // public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
115 // addEvent(cdmBase, affectedObjects, EventType.UPDATE);
119 // public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
120 // Set<CdmBase> set = new HashSet<CdmBase>();
121 // set.add(affectedObject);
122 // addEvent(cdmBase, set, EventType.UPDATE);
127 // public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
128 // addEvent(cdmBase, affectedObjects, EventType.DELETE);
132 // public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
133 // addEvent(cdmBases, affectedObjects, EventType.DELETE);
139 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
142 public <T
extends CdmBase
> EntityCacherDebugResult
debug(T cdmBase
) {
143 return debug(Arrays
.asList(cdmBase
));
149 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
152 public <T
extends CdmBase
> EntityCacherDebugResult
debug(Collection
<T
> cdmBases
) {
153 EntityCacherDebugResult entityCacherDebugResult
=
154 new EntityCacherDebugResult(cdmTransientEntityCacher
, cdmBases
);
155 return entityCacherDebugResult
;
160 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
163 public <T
extends CdmBase
> EntityCacherDebugResult
debug() {
164 return debug(getRootEntities());
168 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
171 public <T
extends CdmBase
> Collection
<T
> load(Collection
<T
> cdmBaseList
, boolean update
) {
172 return cdmTransientEntityCacher
.load(cdmBaseList
, update
);
176 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
179 public void setEntitiesAsLatest() {
180 //FIXME:Remoting need to think more about whether we really need this
181 // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
182 // for(CdmBase entity : entities) {
183 // cdmEntitySessionManager.setEntityAsLatest(entity);
190 logger
.info("Binding session with owner " + sessionOwner
.toString());
191 if(!cdmEntitySessionManager
.contains(sessionOwner
)) {
192 init(sessionOwner
, cdmEntitySessionManager
);
194 cdmEntitySessionManager
.bind(sessionOwner
);
199 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
202 public void dispose() {
204 cdmTransientEntityCacher
.dispose();
205 changeObservers
.clear();
206 cdmEntitySessionManager
.remove(sessionOwner
);
212 // * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
215 // public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
216 // affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
217 // CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
218 // CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
223 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
226 public <T
extends CdmBase
> T
remoteLoad(IService
<T
> service
, UUID uuid
) {
227 T cdmBase
= service
.load(uuid
);
228 return load(cdmBase
, false);
233 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
236 public <T
extends CdmBase
> T
remoteLoad(IService
<T
> service
, UUID uuid
, List
<String
> propertyPaths
) {
237 T cdmBase
= service
.load(uuid
, propertyPaths
);
238 return load(cdmBase
, false);
243 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
246 public <T
extends CdmBase
> UUID
remoteSave(IService
<T
> service
, T cdmBase
) {
247 UUID uuid
= service
.save(cdmBase
).getUuid();
254 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
257 public <T
extends CdmBase
> T
remoteUpdate(IService
<T
> service
, T cdmBase
) {
258 T mergedCdmBase
= service
.merge(cdmBase
, true).getMergedEntity();
259 return mergedCdmBase
;
264 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
267 public boolean isActive() {
268 return cdmEntitySessionManager
.getActiveSession() == this;
273 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
276 public ICdmEntitySessionEnabled
getOwner() {
282 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
285 public LiveCacheStatistics
getCacheStatistics() {
286 return cdmTransientEntityCacher
.getCacheStatistics();
291 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
294 public <T
extends CdmBase
> Collection
<T
> getRootEntities() {
295 return sessionOwner
.getRootEntities();
298 public CdmTransientEntityCacher
getCacher() {
299 return cdmTransientEntityCacher
;
303 public List
<String
> getPropertyPaths(Object obj
) {
304 Map
<Object
, List
<String
>> propertyPathsMap
= sessionOwner
.getPropertyPathsMap();
305 if(propertyPathsMap
== null || propertyPathsMap
.isEmpty()) {
308 return propertyPathsMap
.get(obj
);
312 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase)
315 public void addNewCdmEntity(CdmBase newEntity
) {
316 cdmTransientEntityCacher
.addNewEntity(newEntity
);