- corrected recursive autowiring
[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.model.common.CdmBase;
24 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
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 session = newSession(sessionOwner,true);
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 @Override
113 public <T extends CdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
114 if(activeSession != null) {
115 activeSession.addEvent(cdmBase, affectedObjects, EventType.UPDATE);
116 }
117 }
118
119 @Override
120 public <T extends CdmBase> void update() {
121 if(activeSession != null) {
122 activeSession.update();
123 }
124 }
125
126 /* (non-Javadoc)
127 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
128 */
129 @Override
130 public <T extends CdmBase> T load(T cdmBase, boolean update) {
131 if(activeSession == null) {
132 return cdmBase;
133 }
134 return activeSession.load(cdmBase, update);
135 }
136
137
138
139 /* (non-Javadoc)
140 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
141 */
142 @Override
143 public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
144 if(activeSession == null) {
145 return cdmBaseList;
146 }
147 return activeSession.load(cdmBaseList, update);
148 }
149
150
151 /* (non-Javadoc)
152 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
153 */
154 void remove(ICdmEntitySessionEnabled owner) {
155 ICdmEntitySession session = ownerSessionMap.get(owner);
156 if(session == null) {
157 logger.info("No Session connected to owner, nothing to do");
158 return;
159 }
160 if(session == activeSession) {
161 setActiveSession(null);
162 }
163 ownerSessionMap.remove(owner);
164
165 }
166
167 @Override
168 public void dispose(ICdmEntitySessionEnabled owner) {
169 ICdmEntitySession session = ownerSessionMap.get(owner);
170 if(session != null) {
171 session.dispose();
172 }
173 notifyObservers();
174 }
175
176 @Override
177 public void disposeAll() {
178 Set<ICdmEntitySessionEnabled> owners =
179 new HashSet<ICdmEntitySessionEnabled>(ownerSessionMap.keySet());
180 for(ICdmEntitySessionEnabled owner : owners) {
181 ICdmEntitySession session = ownerSessionMap.get(owner);
182 if(session != null) {
183 session.dispose();
184 }
185 }
186 notifyObservers();
187 }
188
189 void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
190 ownerSessionMap.put(owner, session);
191 }
192
193 /* (non-Javadoc)
194 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener()
195 */
196 @Override
197 public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) {
198 sessionObservers.add(sessionObserver);
199 }
200
201 public void notifyObservers() {
202 for(ICdmEntitySessionManagerObserver sessionObserver : sessionObservers) {
203 sessionObserver.changed();
204 }
205 }
206
207 /* (non-Javadoc)
208 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
209 */
210 @Override
211 public boolean isRemoting() {
212 // FIXME:Remoting stupid method to check whether we are in remoting
213 return true;
214 }
215
216
217 }
218