Project

General

Profile

Download (7.51 KB) Statistics
| Branch: | Tag: | Revision:
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
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
26

    
27
/**
28
 * @author cmathew
29
 * @date 16 Oct 2014
30
 *
31
 */
32
@Component
33
public class CdmEntitySessionManager implements ICdmEntitySessionManager {
34
    private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class);
35

    
36
    private final Map<ICdmEntitySessionEnabled, ICdmEntitySession> ownerSessionMap =
37
            new HashMap<ICdmEntitySessionEnabled, ICdmEntitySession>();
38

    
39
    private final List<ICdmEntitySessionManagerObserver> sessionObservers = new ArrayList<ICdmEntitySessionManagerObserver>();
40

    
41
    //private ICdmEntitySession activeSession;
42

    
43
    private final InheritableThreadLocal<ICdmEntitySession> tlActiveSession = new InheritableThreadLocal<ICdmEntitySession>();
44

    
45
    private  NullSession nullSession;
46

    
47
    @Override
48
    public ICdmEntitySession getNullSession() {
49
        return nullSession;
50
    }
51

    
52
    @Override
53
    public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) {
54
        ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
55
        if(session == null) {
56
            session = new CdmEntitySession(sessionOwner, this);
57
            addToOwnerSessionMap(sessionOwner, session);
58
        }
59

    
60
        if(setAsActive) {
61
            setActiveSession(session);
62
        }
63

    
64
        return session;
65
    }
66

    
67
    @Override
68
    public ICdmEntitySession bindNullSession() {
69

    
70
        if(nullSession == null) {
71
            nullSession = new NullSession(null, this);
72
        }
73

    
74
        setActiveSession(nullSession);
75

    
76
        return nullSession;
77
    }
78

    
79
    @Override
80
    public ICdmEntitySession getActiveSession() {
81
        return tlActiveSession.get();
82
    }
83

    
84

    
85
    private void setActiveSession(ICdmEntitySession activeSession) {
86
       this. tlActiveSession.set(activeSession);
87
        notifyObservers();
88
    }
89

    
90

    
91
    /* (non-Javadoc)
92
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions()
93
     */
94
    @Override
95
    public Collection<ICdmEntitySession> getSessions() {
96
        return ownerSessionMap.values();
97
    }
98

    
99

    
100
    /* (non-Javadoc)
101
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener)
102
     */
103
    @Override
104
    public void bind(ICdmEntitySessionEnabled sessionOwner) {
105
        if(sessionOwner == null) {
106
            setActiveSession(null);
107
            return;
108
        }
109
        ICdmEntitySession session  = ownerSessionMap.get(sessionOwner);
110
        if(session == null) {
111
            throw new CdmClientSessionException("Trying to bind session which does not exist");
112
        }
113

    
114
        setActiveSession(session);
115

    
116
    }
117

    
118
    @Override
119
    public boolean contains(ICdmEntitySessionEnabled sessionOwner) {
120
        return ownerSessionMap.containsKey(sessionOwner);
121
    }
122

    
123

    
124
    /* (non-Javadoc)
125
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
126
     */
127
    @Override
128
    public <T extends Object> T load(T obj, boolean update) {
129
        if(tlActiveSession.get() == null) {
130
            return obj;
131
        } else {
132
            return tlActiveSession.get().load(obj, update);
133
        }
134
    }
135

    
136

    
137
    @Override
138
    public <T extends CdmBase> void update() {
139
        if(tlActiveSession.get() != null) {
140
            tlActiveSession.get().update();
141
        }
142
    }
143

    
144
    /* (non-Javadoc)
145
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
146
     */
147
    @Override
148
    public <T extends CdmBase> T load(T cdmBase, boolean update) {
149
        if(tlActiveSession.get() == null) {
150
            return cdmBase;
151
        }
152
        return tlActiveSession.get().load(cdmBase, update);
153
    }
154

    
155

    
156
    /* (non-Javadoc)
157
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
158
     */
159
    @Override
160
    public UpdateResult load(UpdateResult updateResult, boolean update) {
161
        if(tlActiveSession.get() == null) {
162
            return updateResult;
163
        }
164
        return tlActiveSession.get().load(updateResult, update);
165
    }
166

    
167

    
168
    /* (non-Javadoc)
169
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
170
     */
171
    @Override
172
    public MergeResult load(MergeResult mergeResult, boolean update) {
173
        if(tlActiveSession.get() == null) {
174
            return mergeResult;
175
        }
176
        return tlActiveSession.get().load(mergeResult, update);
177
    }
178

    
179

    
180
    /* (non-Javadoc)
181
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
182
     */
183
    @Override
184
    public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
185
        if(tlActiveSession.get() == null) {
186
            return cdmBaseList;
187
        }
188
        return tlActiveSession.get().load(cdmBaseList, update);
189
    }
190

    
191

    
192
    /* (non-Javadoc)
193
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
194
     */
195
    void remove(ICdmEntitySessionEnabled owner) {
196
        ICdmEntitySession session = ownerSessionMap.get(owner);
197
        if(session == null) {
198
            logger.info("No Session connected to owner, nothing to do");
199
            return;
200
        }
201
        if(session == tlActiveSession.get()) {
202
            setActiveSession(null);
203
        }
204
        ownerSessionMap.remove(owner);
205
        notifyObservers();
206

    
207
    }
208

    
209
    @Override
210
    public void dispose(ICdmEntitySessionEnabled owner) {
211
        ICdmEntitySession session = ownerSessionMap.get(owner);
212
        if(session != null) {
213
            session.dispose();
214
        }
215
        if(nullSession != null && nullSession.getOwner() == owner) {
216
            nullSession = null;
217
        }
218

    
219
    }
220

    
221

    
222
    @Override
223
    public void disposeAll() {
224
        Set<ICdmEntitySessionEnabled> owners =
225
                new HashSet<ICdmEntitySessionEnabled>(ownerSessionMap.keySet());
226
        for(ICdmEntitySessionEnabled owner : owners) {
227
            ICdmEntitySession session = ownerSessionMap.get(owner);
228
            if(session != null) {
229
                session.dispose();
230
            }
231
        }
232

    
233
    }
234

    
235
    void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
236
        ownerSessionMap.put(owner, session);
237
        notifyObservers();
238
    }
239

    
240
    /* (non-Javadoc)
241
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener()
242
     */
243
    @Override
244
    public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) {
245
        sessionObservers.add(sessionObserver);
246
    }
247

    
248
    public void notifyObservers() {
249
        for(ICdmEntitySessionManagerObserver sessionObserver : sessionObservers) {
250
            sessionObserver.changed();
251
        }
252
    }
253

    
254
    /* (non-Javadoc)
255
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
256
     */
257
    @Override
258
    public boolean isRemoting() {
259
        // FIXME:Remoting stupid method to check whether we are in remoting
260
        return true;
261
    }
262

    
263
}
264

    
(3-3/9)