1 |
58afb673
|
Cherian Mathew
|
// $Id$
|
2 |
|
|
/**
|
3 |
ba0d4c2f
|
Cherian Mathew
|
* 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 |
58afb673
|
Cherian Mathew
|
package eu.etaxonomy.taxeditor.session;
|
11 |
|
|
|
12 |
703e8efc
|
Cherian Mathew
|
import java.util.ArrayList;
|
13 |
58afb673
|
Cherian Mathew
|
import java.util.Collection;
|
14 |
|
|
import java.util.HashMap;
|
15 |
ba0d4c2f
|
Cherian Mathew
|
import java.util.HashSet;
|
16 |
703e8efc
|
Cherian Mathew
|
import java.util.List;
|
17 |
58afb673
|
Cherian Mathew
|
import java.util.Map;
|
18 |
ba0d4c2f
|
Cherian Mathew
|
import java.util.Set;
|
19 |
58afb673
|
Cherian Mathew
|
|
20 |
|
|
import org.apache.log4j.Logger;
|
21 |
|
|
import org.springframework.stereotype.Component;
|
22 |
|
|
|
23 |
|
|
import eu.etaxonomy.cdm.model.common.CdmBase;
|
24 |
ba0d4c2f
|
Cherian Mathew
|
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
|
25 |
58afb673
|
Cherian Mathew
|
|
26 |
|
|
/**
|
27 |
|
|
* @author cmathew
|
28 |
|
|
* @date 16 Oct 2014
|
29 |
|
|
*
|
30 |
|
|
*/
|
31 |
e78140b5
|
Cherian Mathew
|
@Component
|
32 |
58afb673
|
Cherian Mathew
|
public class CdmEntitySessionManager implements ICdmEntitySessionManager {
|
33 |
ba0d4c2f
|
Cherian Mathew
|
private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class);
|
34 |
58afb673
|
Cherian Mathew
|
|
35 |
703e8efc
|
Cherian Mathew
|
private final Map<ICdmEntitySessionEnabled, ICdmEntitySession> ownerSessionMap =
|
36 |
ba0d4c2f
|
Cherian Mathew
|
new HashMap<ICdmEntitySessionEnabled, ICdmEntitySession>();
|
37 |
703e8efc
|
Cherian Mathew
|
|
38 |
|
|
private final List<ICdmEntitySessionManagerObserver> sessionObservers = new ArrayList<ICdmEntitySessionManagerObserver>();
|
39 |
e78140b5
|
Cherian Mathew
|
|
40 |
80de230c
|
Cherian Mathew
|
private ICdmEntitySession activeSession;
|
41 |
|
|
|
42 |
6548ea8a
|
Cherian Mathew
|
|
43 |
ba0d4c2f
|
Cherian Mathew
|
|
44 |
5c6184af
|
Cherian Mathew
|
@Override
|
45 |
ba0d4c2f
|
Cherian Mathew
|
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 |
703e8efc
|
Cherian Mathew
|
|
51 |
ba0d4c2f
|
Cherian Mathew
|
}
|
52 |
e78140b5
|
Cherian Mathew
|
|
53 |
ba0d4c2f
|
Cherian Mathew
|
if(setAsActive) {
|
54 |
|
|
setActiveSession(session);
|
55 |
703e8efc
|
Cherian Mathew
|
|
56 |
ba0d4c2f
|
Cherian Mathew
|
}
|
57 |
703e8efc
|
Cherian Mathew
|
|
58 |
ba0d4c2f
|
Cherian Mathew
|
return session;
|
59 |
|
|
}
|
60 |
e78140b5
|
Cherian Mathew
|
|
61 |
5c9343bd
|
Cherian Mathew
|
@Override
|
62 |
|
|
public ICdmEntitySession getActiveSession() {
|
63 |
|
|
return activeSession;
|
64 |
|
|
}
|
65 |
|
|
|
66 |
ba0d4c2f
|
Cherian Mathew
|
private void setActiveSession(ICdmEntitySession activeSession) {
|
67 |
|
|
this.activeSession = activeSession;
|
68 |
6548ea8a
|
Cherian Mathew
|
notifyObservers();
|
69 |
ba0d4c2f
|
Cherian Mathew
|
}
|
70 |
|
|
|
71 |
703e8efc
|
Cherian Mathew
|
|
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 |
ba0d4c2f
|
Cherian Mathew
|
/* (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 |
58afb673
|
Cherian Mathew
|
|
193 |
703e8efc
|
Cherian Mathew
|
/* (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 |
58afb673
|
Cherian Mathew
|
}
|