#5297 Add remoting progress monitoring
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / taxeditor / session / CdmEntitySessionManager.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10 package eu.etaxonomy.taxeditor.session;
11
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;
17 import java.util.Map;
18 import java.util.Set;
19
20 import org.apache.log4j.Logger;
21 import org.springframework.stereotype.Component;
22
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
27 /**
28 * @author cmathew
29 * @date 16 Oct 2014
30 *
31 */
32 @Component
33 public class CdmEntitySessionManager implements ICdmEntitySessionManager {
34 private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class);
35
36 private final Map<ICdmEntitySessionEnabled, ICdmEntitySession> ownerSessionMap =
37 new HashMap<ICdmEntitySessionEnabled, ICdmEntitySession>();
38
39 private final List<ICdmEntitySessionManagerObserver> sessionObservers = new ArrayList<ICdmEntitySessionManagerObserver>();
40
41 //private ICdmEntitySession activeSession;
42
43 private final InheritableThreadLocal<ICdmEntitySession> tlActiveSession = new InheritableThreadLocal<ICdmEntitySession>();
44
45 private NullSession nullSession;
46
47 @Override
48 public ICdmEntitySession getNullSession() {
49 return nullSession;
50 }
51
52 @Override
53 public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) {
54 ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
55 if(session == null) {
56 session = new CdmEntitySession(sessionOwner, this);
57 addToOwnerSessionMap(sessionOwner, session);
58 }
59
60 if(setAsActive) {
61 setActiveSession(session);
62 }
63
64 return session;
65 }
66
67 @Override
68 public ICdmEntitySession bindNullSession() {
69
70 if(nullSession == null) {
71 nullSession = new NullSession(null, this);
72 }
73
74 setActiveSession(nullSession);
75
76 return nullSession;
77 }
78
79 @Override
80 public ICdmEntitySession getActiveSession() {
81 return tlActiveSession.get();
82 }
83
84
85 private void setActiveSession(ICdmEntitySession activeSession) {
86 this. tlActiveSession.set(activeSession);
87 notifyObservers();
88 }
89
90
91 /* (non-Javadoc)
92 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions()
93 */
94 @Override
95 public Collection<ICdmEntitySession> getSessions() {
96 return ownerSessionMap.values();
97 }
98
99
100 /* (non-Javadoc)
101 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener)
102 */
103 @Override
104 public void bind(ICdmEntitySessionEnabled sessionOwner) {
105 if(sessionOwner == null) {
106 setActiveSession(null);
107 return;
108 }
109 ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
110 if(session == null) {
111 throw new CdmClientSessionException("Trying to bind session which does not exist");
112 }
113
114 setActiveSession(session);
115
116 }
117
118 @Override
119 public boolean contains(ICdmEntitySessionEnabled sessionOwner) {
120 return ownerSessionMap.containsKey(sessionOwner);
121 }
122
123
124 /* (non-Javadoc)
125 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
126 */
127 @Override
128 public <T extends Object> T load(T obj, boolean update) {
129 if(tlActiveSession.get() == null) {
130 return obj;
131 } else {
132 return tlActiveSession.get().load(obj, update);
133 }
134 }
135
136
137 @Override
138 public <T extends CdmBase> void update() {
139 if(tlActiveSession.get() != null) {
140 tlActiveSession.get().update();
141 }
142 }
143
144 /* (non-Javadoc)
145 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
146 */
147 @Override
148 public <T extends CdmBase> T load(T cdmBase, boolean update) {
149 if(tlActiveSession.get() == null) {
150 return cdmBase;
151 }
152 return tlActiveSession.get().load(cdmBase, update);
153 }
154
155
156 /* (non-Javadoc)
157 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
158 */
159 @Override
160 public UpdateResult load(UpdateResult updateResult, boolean update) {
161 if(tlActiveSession.get() == null) {
162 return updateResult;
163 }
164 return tlActiveSession.get().load(updateResult, update);
165 }
166
167
168 /* (non-Javadoc)
169 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
170 */
171 @Override
172 public MergeResult load(MergeResult mergeResult, boolean update) {
173 if(tlActiveSession.get() == null) {
174 return mergeResult;
175 }
176 return tlActiveSession.get().load(mergeResult, update);
177 }
178
179
180 /* (non-Javadoc)
181 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
182 */
183 @Override
184 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
185 if(tlActiveSession.get() == null) {
186 return cdmBaseList;
187 }
188 return tlActiveSession.get().load(cdmBaseList, update);
189 }
190
191
192 /* (non-Javadoc)
193 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
194 */
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");
199 return;
200 }
201 if(session == tlActiveSession.get()) {
202 setActiveSession(null);
203 }
204 ownerSessionMap.remove(owner);
205 notifyObservers();
206
207 }
208
209 @Override
210 public void dispose(ICdmEntitySessionEnabled owner) {
211 ICdmEntitySession session = ownerSessionMap.get(owner);
212 if(session != null) {
213 session.dispose();
214 }
215 if(nullSession != null && nullSession.getOwner() == owner) {
216 nullSession = null;
217 }
218
219 }
220
221
222 @Override
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) {
229 session.dispose();
230 }
231 }
232
233 }
234
235 void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
236 ownerSessionMap.put(owner, session);
237 notifyObservers();
238 }
239
240 /* (non-Javadoc)
241 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener()
242 */
243 @Override
244 public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) {
245 sessionObservers.add(sessionObserver);
246 }
247
248 public void notifyObservers() {
249 for(ICdmEntitySessionManagerObserver sessionObserver : sessionObservers) {
250 sessionObserver.changed();
251 }
252 }
253
254 /* (non-Javadoc)
255 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
256 */
257 @Override
258 public boolean isRemoting() {
259 // FIXME:Remoting stupid method to check whether we are in remoting
260 return true;
261 }
262
263 }
264