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
.Collection
;
13 import java
.util
.HashMap
;
14 import java
.util
.HashSet
;
15 import java
.util
.List
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.springframework
.stereotype
.Component
;
22 import eu
.etaxonomy
.cdm
.api
.service
.UpdateResult
;
23 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
24 import eu
.etaxonomy
.cdm
.model
.common
.ICdmBase
;
25 import eu
.etaxonomy
.cdm
.persistence
.dto
.MergeResult
;
28 * Implementation for {@link ICdmEntitySessionManager}
34 public class CdmEntitySessionManager
implements ICdmEntitySessionManager
{
36 private static final Logger logger
= Logger
.getLogger(CdmEntitySessionManager
.class);
38 private final Map
<ICdmEntitySessionEnabled
, ICdmEntitySession
> ownerSessionMap
= new HashMap
<>();
40 private final List
<ICdmEntitySessionManagerObserver
> sessionObservers
= new ArrayList
<>();
42 //private ICdmEntitySession activeSession;
44 private final InheritableThreadLocal
<ICdmEntitySession
> tlActiveSession
= new InheritableThreadLocal
<>();
46 private NullSession nullSession
;
49 public ICdmEntitySession
getNullSession() {
54 public ICdmEntitySession
newSession(ICdmEntitySessionEnabled sessionOwner
, boolean setAsActive
) {
55 ICdmEntitySession session
= ownerSessionMap
.get(sessionOwner
);
57 session
= new CdmEntitySession(sessionOwner
, this);
58 addToOwnerSessionMap(sessionOwner
, session
);
62 setActiveSession(session
);
69 public ICdmEntitySession
bindNullSession() {
71 if(nullSession
== null) {
72 nullSession
= new NullSession(null, this);
75 setActiveSession(nullSession
);
81 public ICdmEntitySession
getActiveSession() {
82 return tlActiveSession
.get();
85 private void setActiveSession(ICdmEntitySession activeSession
) {
86 this. tlActiveSession
.set(activeSession
);
91 public Collection
<ICdmEntitySession
> getSessions() {
92 return ownerSessionMap
.values();
96 public void bind(ICdmEntitySessionEnabled sessionOwner
) {
97 if(sessionOwner
== null) {
98 setActiveSession(null);
101 ICdmEntitySession session
= ownerSessionMap
.get(sessionOwner
);
102 if(session
== null) {
103 throw new CdmClientSessionException("Trying to bind session which does not exist");
106 setActiveSession(session
);
110 public boolean contains(ICdmEntitySessionEnabled sessionOwner
) {
111 return ownerSessionMap
.containsKey(sessionOwner
);
115 public <T
extends Object
> T
load(T obj
, boolean update
) {
116 if(tlActiveSession
.get() == null) {
119 return tlActiveSession
.get().load(obj
, update
);
124 public <T
extends CdmBase
> void update() {
125 if(tlActiveSession
.get() != null) {
126 tlActiveSession
.get().update();
131 public <T
extends CdmBase
> T
load(T cdmBase
, boolean update
) {
132 if(tlActiveSession
.get() == null) {
135 return tlActiveSession
.get().load(cdmBase
, update
);
139 public UpdateResult
load(UpdateResult updateResult
, boolean update
) {
140 if(tlActiveSession
.get() == null) {
143 return tlActiveSession
.get().load(updateResult
, update
);
147 public <T
extends ICdmBase
> MergeResult
<T
> load(MergeResult
<T
> mergeResult
, boolean update
) {
148 if(tlActiveSession
.get() == null) {
151 return tlActiveSession
.get().load(mergeResult
, update
);
155 public <T
extends CdmBase
> Collection
<T
> load(Collection
<T
> cdmBaseList
, boolean update
) {
156 if(tlActiveSession
.get() == null) {
159 return tlActiveSession
.get().load(cdmBaseList
, update
);
162 void remove(ICdmEntitySessionEnabled owner
) {
163 ICdmEntitySession session
= ownerSessionMap
.get(owner
);
164 if(session
== null) {
165 logger
.info("No Session connected to owner, nothing to do");
168 if(session
== tlActiveSession
.get()) {
169 setActiveSession(null);
171 ownerSessionMap
.remove(owner
);
177 public void dispose(ICdmEntitySessionEnabled owner
) {
178 ICdmEntitySession session
= ownerSessionMap
.get(owner
);
179 if(session
!= null) {
182 if(nullSession
!= null && nullSession
.getOwner() == owner
) {
188 public void disposeAll() {
189 Set
<ICdmEntitySessionEnabled
> owners
=
190 new HashSet
<ICdmEntitySessionEnabled
>(ownerSessionMap
.keySet());
191 for(ICdmEntitySessionEnabled owner
: owners
) {
192 ICdmEntitySession session
= ownerSessionMap
.get(owner
);
193 if(session
!= null) {
199 public void addToOwnerSessionMap(ICdmEntitySessionEnabled owner
, ICdmEntitySession session
) {
200 ownerSessionMap
.put(owner
, session
);
205 public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver
) {
206 sessionObservers
.add(sessionObserver
);
209 public void notifyObservers() {
210 for(ICdmEntitySessionManagerObserver sessionObserver
: sessionObservers
) {
211 sessionObserver
.changed();
216 public boolean isRemoting() {
217 // FIXME:Remoting stupid method to check whether we are in remoting