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