5e43249ff621356484ed7ac3d361c5c6c1806a56
[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.beans.factory.annotation.Autowired;
22 import org.springframework.stereotype.Component;
23
24 import eu.etaxonomy.cdm.api.cache.CdmServiceCacher;
25 import eu.etaxonomy.cdm.model.common.CdmBase;
26 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
27
28 /**
29 * @author cmathew
30 * @date 16 Oct 2014
31 *
32 */
33 @Component
34 public class CdmEntitySessionManager implements ICdmEntitySessionManager {
35 private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class);
36
37 private final Map<ICdmEntitySessionEnabled, ICdmEntitySession> ownerSessionMap =
38 new HashMap<ICdmEntitySessionEnabled, ICdmEntitySession>();
39
40 private final List<ICdmEntitySessionManagerObserver> sessionObservers = new ArrayList<ICdmEntitySessionManagerObserver>();
41
42 private ICdmEntitySession activeSession;
43
44 @Autowired
45 private CdmServiceCacher cdmServiceCacher;
46
47 @Override
48 public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) {
49 ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
50 if(session == null) {
51 session = new CdmEntitySession(sessionOwner, this);
52 addToOwnerSessionMap(sessionOwner, session);
53
54 }
55
56 if(setAsActive) {
57 setActiveSession(session);
58
59 }
60
61 return session;
62 }
63
64 @Override
65 public ICdmEntitySession getActiveSession() {
66 return activeSession;
67 }
68
69 private void setActiveSession(ICdmEntitySession activeSession) {
70 this.activeSession = activeSession;
71 cdmServiceCacher.setActiveSession(activeSession);
72 }
73
74
75 /* (non-Javadoc)
76 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions()
77 */
78 @Override
79 public Collection<ICdmEntitySession> getSessions() {
80 return ownerSessionMap.values();
81 }
82
83
84 /* (non-Javadoc)
85 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener)
86 */
87 @Override
88 public void bind(ICdmEntitySessionEnabled sessionOwner) {
89 if(sessionOwner == null) {
90 setActiveSession(null);
91 return;
92 }
93 ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
94 if(session == null) {
95 session = newSession(sessionOwner,true);
96 }
97
98 setActiveSession(session);
99
100 }
101
102
103 /* (non-Javadoc)
104 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
105 */
106 @Override
107 public <T extends Object> T load(T obj, boolean update) {
108 if(activeSession == null) {
109 return obj;
110 } else {
111 return activeSession.load(obj, update);
112 }
113 }
114
115 @Override
116 public <T extends CdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
117 if(activeSession != null) {
118 activeSession.addEvent(cdmBase, affectedObjects, EventType.UPDATE);
119 }
120 }
121
122 @Override
123 public <T extends CdmBase> void update() {
124 if(activeSession != null) {
125 activeSession.update();
126 }
127 }
128
129 /* (non-Javadoc)
130 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
131 */
132 @Override
133 public <T extends CdmBase> T load(T cdmBase, boolean update) {
134 if(activeSession == null) {
135 return cdmBase;
136 }
137 return activeSession.load(cdmBase, update);
138 }
139
140
141
142 /* (non-Javadoc)
143 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
144 */
145 @Override
146 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
147 if(activeSession == null) {
148 return cdmBaseList;
149 }
150 return activeSession.load(cdmBaseList, update);
151 }
152
153
154 /* (non-Javadoc)
155 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
156 */
157 void remove(ICdmEntitySessionEnabled owner) {
158 ICdmEntitySession session = ownerSessionMap.get(owner);
159 if(session == null) {
160 logger.info("No Session connected to owner, nothing to do");
161 return;
162 }
163 if(session == activeSession) {
164 setActiveSession(null);
165 }
166 ownerSessionMap.remove(owner);
167
168 }
169
170 @Override
171 public void dispose(ICdmEntitySessionEnabled owner) {
172 ICdmEntitySession session = ownerSessionMap.get(owner);
173 if(session != null) {
174 session.dispose();
175 }
176 notifyObservers();
177 }
178
179 @Override
180 public void disposeAll() {
181 Set<ICdmEntitySessionEnabled> owners =
182 new HashSet<ICdmEntitySessionEnabled>(ownerSessionMap.keySet());
183 for(ICdmEntitySessionEnabled owner : owners) {
184 ICdmEntitySession session = ownerSessionMap.get(owner);
185 if(session != null) {
186 session.dispose();
187 }
188 }
189 notifyObservers();
190 }
191
192 void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
193 ownerSessionMap.put(owner, session);
194 }
195
196 /* (non-Javadoc)
197 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener()
198 */
199 @Override
200 public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) {
201 sessionObservers.add(sessionObserver);
202 }
203
204 public void notifyObservers() {
205 for(ICdmEntitySessionManagerObserver sessionObserver : sessionObservers) {
206 sessionObserver.changed();
207 }
208 }
209
210 /* (non-Javadoc)
211 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
212 */
213 @Override
214 public boolean isRemoting() {
215 // FIXME:Remoting stupid method to check whether we are in remoting
216 return true;
217 }
218
219
220 }
221