Project

General

Profile

Download (9.92 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.Arrays;
14
import java.util.Collection;
15
import java.util.HashSet;
16
import java.util.List;
17
import java.util.Set;
18
import java.util.UUID;
19

    
20
import net.sf.ehcache.statistics.LiveCacheStatistics;
21

    
22
import org.apache.log4j.Logger;
23

    
24
import eu.etaxonomy.cdm.api.service.IService;
25
import eu.etaxonomy.cdm.model.common.CdmBase;
26
import eu.etaxonomy.cdm.model.common.ICdmBase;
27
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
28
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
29
import eu.etaxonomy.cdm.persistence.hibernate.CdmPostDataChangeObservableListener;
30
import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
31
import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
32

    
33

    
34
/**
35
 *
36
 * NOTE : It would be nice to have this class performing merge / delete operations
37
 * using services, but this is only possible if we can 'intelligently'
38
 * get from a model class to the correspoding service class
39
 * @author cmathew
40
 * @date 20 Oct 2014
41
 *
42
 */
43

    
44
public class CdmEntitySession implements ICdmEntitySession  {
45

    
46
    private static final Logger logger = Logger.getLogger(CdmEntitySession.class);
47

    
48
    private final CdmEntitySessionManager cdmEntitySessionManager;
49

    
50
    private final ICdmEntitySessionEnabled sessionOwner;
51

    
52
    private final CdmTransientEntityCacher cdmTransientEntityCacher;
53

    
54
    private final List<ICdmEntitySessionEnabled> changeObservers;
55

    
56

    
57

    
58
    public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
59
        this.sessionOwner = sessionOwner;
60
        this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
61
        this.cdmEntitySessionManager = cdmEntitySessionManager;
62
        this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
63
        cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
64
    }
65

    
66

    
67

    
68
    /* (non-Javadoc)
69
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.lang.Object, boolean)
70
     */
71
    @Override
72
    public  <O extends Object> O load(O obj, boolean update) {
73
        return cdmTransientEntityCacher.load(obj, update);
74
    }
75

    
76

    
77
    /* (non-Javadoc)
78
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.model.common.CdmBase, boolean)
79
     */
80
    @Override
81
    public  <T extends CdmBase> T load(T cdmBase, boolean update) {
82
        return (T)cdmTransientEntityCacher.load(cdmBase, update);
83
    }
84

    
85

    
86
    @Override
87
    public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
88
        addEvent(cdmBase, affectedObjects, EventType.UPDATE);
89
    }
90

    
91
    @Override
92
    public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
93
        Set<CdmBase> set = new HashSet<CdmBase>();
94
        set.add(affectedObject);
95
        addEvent(cdmBase, set, EventType.UPDATE);
96
    }
97

    
98

    
99
    @Override
100
    public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
101
        addEvent(cdmBase, affectedObjects, EventType.DELETE);
102
    }
103

    
104
    @Override
105
    public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
106
        addEvent(cdmBases, affectedObjects, EventType.DELETE);
107
    }
108

    
109

    
110

    
111
    /* (non-Javadoc)
112
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
113
     */
114
    @Override
115
    public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
116
        return debug(Arrays.asList(cdmBase));
117
    }
118

    
119

    
120

    
121
    /* (non-Javadoc)
122
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
123
     */
124
    @Override
125
    public <T extends CdmBase> EntityCacherDebugResult debug(List<T> cdmBases) {
126
        EntityCacherDebugResult entityCacherDebugResult =
127
                new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
128
        return entityCacherDebugResult;
129
    }
130

    
131

    
132
    /* (non-Javadoc)
133
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
134
     */
135
    @Override
136
    public <T extends CdmBase> EntityCacherDebugResult debug() {
137
        return debug(getRootEntities());
138
    }
139

    
140
    /* (non-Javadoc)
141
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
142
     */
143
    @Override
144
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
145
        return cdmTransientEntityCacher.load(cdmBaseList, update);
146
    }
147

    
148
    /* (non-Javadoc)
149
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
150
     */
151
    @Override
152
    public void setEntitiesAsLatest() {
153
        //FIXME:Remoting need to think more about whether we really need this
154
        //		List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
155
        //		for(CdmBase entity : entities) {
156
        //			cdmEntitySessionManager.setEntityAsLatest(entity);
157
        //		}
158
    }
159

    
160
    /**
161
     * Register to get updated after any interaction with the datastore
162
     */
163
    @Override
164
    public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
165
        CdmPostDataChangeObservableListener.getDefault().register(observer);
166
    }
167

    
168
    /**
169
     * Register to get updated after any interaction with the datastore
170
     */
171
    @Override
172
    public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
173
        CdmPostDataChangeObservableListener.getDefault().unregister(observer);
174
    }
175

    
176

    
177

    
178
    @Override
179
    public void bind() {
180
        logger.info("Binding session with owner " + sessionOwner.toString());
181
        cdmEntitySessionManager.bind(sessionOwner);
182
        cdmEntitySessionManager.notifyObservers();
183
    }
184

    
185
    /* (non-Javadoc)
186
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
187
     */
188
    @Override
189
    public void dispose() {
190

    
191
        cdmTransientEntityCacher.dispose();
192
        for(ICdmEntitySessionEnabled observer : changeObservers) {
193
            CdmPostDataChangeObservableListener.getDefault().unregister(observer);
194
        }
195
        changeObservers.clear();
196
        cdmEntitySessionManager.dispose(sessionOwner);
197
    }
198

    
199

    
200
    /* (non-Javadoc)
201
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
202
     */
203
    @Override
204
    public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
205
        affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
206
        CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
207
        CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
208
    }
209

    
210

    
211
    /* (non-Javadoc)
212
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
213
     */
214
    @Override
215
    public  <T extends ICdmBase>  void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
216
        affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
217
        for(ICdmBase cdmBase : cdmBases) {
218
            CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
219
            CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
220
        }
221
    }
222

    
223
    /* (non-Javadoc)
224
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
225
     */
226
    @Override
227
    public void fireNotifications() {
228
        CdmPostDataChangeObservableListener.getDefault().delayedNotify();
229
    }
230

    
231

    
232
    /* (non-Javadoc)
233
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
234
     */
235
    @Override
236
    public  <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid) {
237
        T cdmBase = service.load(uuid);
238
        return load(cdmBase, false);
239
    }
240

    
241

    
242
    /* (non-Javadoc)
243
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
244
     */
245
    @Override
246
    public <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
247
        T cdmBase = service.load(uuid, propertyPaths);
248
        return load(cdmBase, false);
249
    }
250

    
251

    
252
    /* (non-Javadoc)
253
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
254
     */
255
    @Override
256
    public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
257
        UUID uuid = service.save(cdmBase);
258
        load(cdmBase,false);
259
        return uuid;
260
    }
261

    
262

    
263
    /* (non-Javadoc)
264
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
265
     */
266
    @Override
267
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
268
        T mergedCdmBase = service.merge(cdmBase);
269
        return mergedCdmBase;
270
    }
271

    
272

    
273
    /* (non-Javadoc)
274
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
275
     */
276
    @Override
277
    public boolean isActive() {
278
        return cdmEntitySessionManager.getActiveSession() == this;
279
    }
280

    
281

    
282
    /* (non-Javadoc)
283
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
284
     */
285
    @Override
286
    public ICdmEntitySessionEnabled getOwner() {
287
        return sessionOwner;
288
    }
289

    
290

    
291
    /* (non-Javadoc)
292
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
293
     */
294
    @Override
295
    public LiveCacheStatistics getCacheStatistics() {
296
        return cdmTransientEntityCacher.getCacheStatistics();
297
    }
298

    
299

    
300
    /* (non-Javadoc)
301
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
302
     */
303
    @Override
304
    public <T extends CdmBase> List<T> getRootEntities() {
305
        return sessionOwner.getRootEntities();
306
    }
307

    
308

    
309

    
310

    
311

    
312

    
313

    
314

    
315

    
316

    
317
}
(2-2/7)