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