80bc0caba5cd87406ef1ea017d416c63eaf8142a
[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 NullSession nullSession;
44
45 @Override
46 public ICdmEntitySession getNullSession() {
47 return nullSession;
48 }
49
50 @Override
51 public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) {
52 ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
53 if(session == null) {
54 session = new CdmEntitySession(sessionOwner, this);
55 addToOwnerSessionMap(sessionOwner, session);
56 }
57
58 if(setAsActive) {
59 setActiveSession(session);
60 }
61
62 return session;
63 }
64
65 @Override
66 public ICdmEntitySession bindNullSession() {
67
68 if(nullSession == null) {
69 nullSession = new NullSession(null, this);
70 }
71
72 setActiveSession(nullSession);
73
74 return nullSession;
75 }
76
77 @Override
78 public ICdmEntitySession getActiveSession() {
79 return activeSession;
80 }
81
82 private void setActiveSession(ICdmEntitySession activeSession) {
83 this.activeSession = activeSession;
84 notifyObservers();
85 }
86
87
88 /* (non-Javadoc)
89 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions()
90 */
91 @Override
92 public Collection<ICdmEntitySession> getSessions() {
93 return ownerSessionMap.values();
94 }
95
96
97 /* (non-Javadoc)
98 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener)
99 */
100 @Override
101 public void bind(ICdmEntitySessionEnabled sessionOwner) {
102 if(sessionOwner == null) {
103 setActiveSession(null);
104 return;
105 }
106 ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
107 if(session == null) {
108 throw new CdmClientSessionException("Trying to bind session which does not exist");
109 }
110
111 setActiveSession(session);
112
113 }
114
115 @Override
116 public boolean contains(ICdmEntitySessionEnabled sessionOwner) {
117 return ownerSessionMap.containsKey(sessionOwner);
118 }
119
120
121 /* (non-Javadoc)
122 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
123 */
124 @Override
125 public <T extends Object> T load(T obj, boolean update) {
126 if(activeSession == null) {
127 return obj;
128 } else {
129 return activeSession.load(obj, update);
130 }
131 }
132
133
134 @Override
135 public <T extends CdmBase> void update() {
136 if(activeSession != null) {
137 activeSession.update();
138 }
139 }
140
141 /* (non-Javadoc)
142 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
143 */
144 @Override
145 public <T extends CdmBase> T load(T cdmBase, boolean update) {
146 if(activeSession == null) {
147 return cdmBase;
148 }
149 return activeSession.load(cdmBase, update);
150 }
151
152
153 /* (non-Javadoc)
154 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
155 */
156 @Override
157 public UpdateResult load(UpdateResult updateResult, boolean update) {
158 if(activeSession == null) {
159 return updateResult;
160 }
161 return activeSession.load(updateResult, update);
162 }
163
164
165 /* (non-Javadoc)
166 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
167 */
168 @Override
169 public MergeResult load(MergeResult mergeResult, boolean update) {
170 if(activeSession == null) {
171 return mergeResult;
172 }
173 return activeSession.load(mergeResult, update);
174 }
175
176
177 /* (non-Javadoc)
178 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
179 */
180 @Override
181 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
182 if(activeSession == null) {
183 return cdmBaseList;
184 }
185 return activeSession.load(cdmBaseList, update);
186 }
187
188
189 /* (non-Javadoc)
190 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
191 */
192 void remove(ICdmEntitySessionEnabled owner) {
193 ICdmEntitySession session = ownerSessionMap.get(owner);
194 if(session == null) {
195 logger.info("No Session connected to owner, nothing to do");
196 return;
197 }
198 if(session == activeSession) {
199 setActiveSession(null);
200 }
201 ownerSessionMap.remove(owner);
202 notifyObservers();
203
204 }
205
206 @Override
207 public void dispose(ICdmEntitySessionEnabled owner) {
208 ICdmEntitySession session = ownerSessionMap.get(owner);
209 if(session != null) {
210 session.dispose();
211 }
212 if(nullSession != null && nullSession.getOwner() == owner) {
213 nullSession = null;
214 }
215
216 }
217
218
219 @Override
220 public void disposeAll() {
221 Set<ICdmEntitySessionEnabled> owners =
222 new HashSet<ICdmEntitySessionEnabled>(ownerSessionMap.keySet());
223 for(ICdmEntitySessionEnabled owner : owners) {
224 ICdmEntitySession session = ownerSessionMap.get(owner);
225 if(session != null) {
226 session.dispose();
227 }
228 }
229
230 }
231
232 void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
233 ownerSessionMap.put(owner, session);
234 notifyObservers();
235 }
236
237 /* (non-Javadoc)
238 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener()
239 */
240 @Override
241 public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) {
242 sessionObservers.add(sessionObserver);
243 }
244
245 public void notifyObservers() {
246 for(ICdmEntitySessionManagerObserver sessionObserver : sessionObservers) {
247 sessionObserver.changed();
248 }
249 }
250
251 /* (non-Javadoc)
252 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
253 */
254 @Override
255 public boolean isRemoting() {
256 // FIXME:Remoting stupid method to check whether we are in remoting
257 return true;
258 }
259
260 }
261