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
.HashMap
;
15 import java
.util
.HashSet
;
16 import java
.util
.List
;
20 import org
.apache
.log4j
.Logger
;
21 import org
.springframework
.stereotype
.Component
;
23 import eu
.etaxonomy
.cdm
.api
.service
.UpdateResult
;
24 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
25 import eu
.etaxonomy
.cdm
.persistence
.dto
.MergeResult
;
33 public class CdmEntitySessionManager
implements ICdmEntitySessionManager
{
34 private static final Logger logger
= Logger
.getLogger(CdmEntitySessionManager
.class);
36 private final Map
<ICdmEntitySessionEnabled
, ICdmEntitySession
> ownerSessionMap
=
37 new HashMap
<ICdmEntitySessionEnabled
, ICdmEntitySession
>();
39 private final List
<ICdmEntitySessionManagerObserver
> sessionObservers
= new ArrayList
<ICdmEntitySessionManagerObserver
>();
41 //private ICdmEntitySession activeSession;
43 private final InheritableThreadLocal
<ICdmEntitySession
> tlActiveSession
= new InheritableThreadLocal
<ICdmEntitySession
>();
45 private NullSession nullSession
;
48 public ICdmEntitySession
getNullSession() {
53 public ICdmEntitySession
newSession(ICdmEntitySessionEnabled sessionOwner
, boolean setAsActive
) {
54 ICdmEntitySession session
= ownerSessionMap
.get(sessionOwner
);
56 session
= new CdmEntitySession(sessionOwner
, this);
57 addToOwnerSessionMap(sessionOwner
, session
);
61 setActiveSession(session
);
68 public ICdmEntitySession
bindNullSession() {
70 if(nullSession
== null) {
71 nullSession
= new NullSession(null, this);
74 setActiveSession(nullSession
);
80 public ICdmEntitySession
getActiveSession() {
81 return tlActiveSession
.get();
85 private void setActiveSession(ICdmEntitySession activeSession
) {
86 this. tlActiveSession
.set(activeSession
);
92 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions()
95 public Collection
<ICdmEntitySession
> getSessions() {
96 return ownerSessionMap
.values();
101 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener)
104 public void bind(ICdmEntitySessionEnabled sessionOwner
) {
105 if(sessionOwner
== null) {
106 setActiveSession(null);
109 ICdmEntitySession session
= ownerSessionMap
.get(sessionOwner
);
110 if(session
== null) {
111 throw new CdmClientSessionException("Trying to bind session which does not exist");
114 setActiveSession(session
);
119 public boolean contains(ICdmEntitySessionEnabled sessionOwner
) {
120 return ownerSessionMap
.containsKey(sessionOwner
);
125 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
128 public <T
extends Object
> T
load(T obj
, boolean update
) {
129 if(tlActiveSession
.get() == null) {
132 return tlActiveSession
.get().load(obj
, update
);
138 public <T
extends CdmBase
> void update() {
139 if(tlActiveSession
.get() != null) {
140 tlActiveSession
.get().update();
145 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
148 public <T
extends CdmBase
> T
load(T cdmBase
, boolean update
) {
149 if(tlActiveSession
.get() == null) {
152 return tlActiveSession
.get().load(cdmBase
, update
);
157 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
160 public UpdateResult
load(UpdateResult updateResult
, boolean update
) {
161 if(tlActiveSession
.get() == null) {
164 return tlActiveSession
.get().load(updateResult
, update
);
169 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
172 public MergeResult
load(MergeResult mergeResult
, boolean update
) {
173 if(tlActiveSession
.get() == null) {
176 return tlActiveSession
.get().load(mergeResult
, update
);
181 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
184 public <T
extends CdmBase
> Collection
<T
> load(Collection
<T
> cdmBaseList
, boolean update
) {
185 if(tlActiveSession
.get() == null) {
188 return tlActiveSession
.get().load(cdmBaseList
, update
);
193 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
195 void remove(ICdmEntitySessionEnabled owner
) {
196 ICdmEntitySession session
= ownerSessionMap
.get(owner
);
197 if(session
== null) {
198 logger
.info("No Session connected to owner, nothing to do");
201 if(session
== tlActiveSession
.get()) {
202 setActiveSession(null);
204 ownerSessionMap
.remove(owner
);
210 public void dispose(ICdmEntitySessionEnabled owner
) {
211 ICdmEntitySession session
= ownerSessionMap
.get(owner
);
212 if(session
!= null) {
215 if(nullSession
!= null && nullSession
.getOwner() == owner
) {
223 public void disposeAll() {
224 Set
<ICdmEntitySessionEnabled
> owners
=
225 new HashSet
<ICdmEntitySessionEnabled
>(ownerSessionMap
.keySet());
226 for(ICdmEntitySessionEnabled owner
: owners
) {
227 ICdmEntitySession session
= ownerSessionMap
.get(owner
);
228 if(session
!= null) {
235 void addToOwnerSessionMap(ICdmEntitySessionEnabled owner
, ICdmEntitySession session
) {
236 ownerSessionMap
.put(owner
, session
);
241 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener()
244 public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver
) {
245 sessionObservers
.add(sessionObserver
);
248 public void notifyObservers() {
249 for(ICdmEntitySessionManagerObserver sessionObserver
: sessionObservers
) {
250 sessionObserver
.changed();
255 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
258 public boolean isRemoting() {
259 // FIXME:Remoting stupid method to check whether we are in remoting