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