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