Project

General

Profile

Download (10.4 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
    private final Set<CdmBase> newCdmEntities;
57

    
58

    
59

    
60
    public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
61
        this.sessionOwner = sessionOwner;
62
        this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
63
        this.cdmEntitySessionManager = cdmEntitySessionManager;
64
        this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
65
        this.newCdmEntities = new HashSet<CdmBase>();
66
        cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
67
    }
68

    
69

    
70

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

    
79

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

    
88
    @Override
89
    public <T extends CdmBase> void  update() {
90
        List<T> rootEntities = getRootEntities();
91
        if(rootEntities != null) {
92
            for(T rootEntity : rootEntities) {
93
                load(rootEntity, true);
94
            }
95
        }
96
    }
97

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

    
103
    @Override
104
    public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
105
        Set<CdmBase> set = new HashSet<CdmBase>();
106
        set.add(affectedObject);
107
        addEvent(cdmBase, set, EventType.UPDATE);
108
    }
109

    
110

    
111
    @Override
112
    public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
113
        addEvent(cdmBase, affectedObjects, EventType.DELETE);
114
    }
115

    
116
    @Override
117
    public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
118
        addEvent(cdmBases, affectedObjects, EventType.DELETE);
119
    }
120

    
121

    
122

    
123
    /* (non-Javadoc)
124
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
125
     */
126
    @Override
127
    public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
128
        return debug(Arrays.asList(cdmBase));
129
    }
130

    
131

    
132

    
133
    /* (non-Javadoc)
134
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
135
     */
136
    @Override
137
    public <T extends CdmBase> EntityCacherDebugResult debug(List<T> cdmBases) {
138
        EntityCacherDebugResult entityCacherDebugResult =
139
                new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
140
        return entityCacherDebugResult;
141
    }
142

    
143

    
144
    /* (non-Javadoc)
145
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
146
     */
147
    @Override
148
    public <T extends CdmBase> EntityCacherDebugResult debug() {
149
        return debug(getRootEntities());
150
    }
151

    
152
    /* (non-Javadoc)
153
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
154
     */
155
    @Override
156
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
157
        return cdmTransientEntityCacher.load(cdmBaseList, update);
158
    }
159

    
160
    /* (non-Javadoc)
161
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
162
     */
163
    @Override
164
    public void setEntitiesAsLatest() {
165
        //FIXME:Remoting need to think more about whether we really need this
166
        //		List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
167
        //		for(CdmBase entity : entities) {
168
        //			cdmEntitySessionManager.setEntityAsLatest(entity);
169
        //		}
170
    }
171

    
172
//    /**
173
//     * Register to get updated after any interaction with the datastore
174
//     */
175
//    @Override
176
//    public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
177
//        CdmPostDataChangeObservableListener.getDefault().register(observer);
178
//    }
179
//
180
//    /**
181
//     * Register to get updated after any interaction with the datastore
182
//     */
183
//    @Override
184
//    public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
185
//        CdmPostDataChangeObservableListener.getDefault().unregister(observer);
186
//    }
187

    
188

    
189

    
190
    @Override
191
    public void bind() {
192
        logger.info("Binding session with owner " + sessionOwner.toString());
193
        cdmEntitySessionManager.bind(sessionOwner);
194

    
195
    }
196

    
197
    /* (non-Javadoc)
198
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
199
     */
200
    @Override
201
    public void dispose() {
202

    
203
        cdmTransientEntityCacher.dispose();
204
//        for(ICdmEntitySessionEnabled observer : changeObservers) {
205
//            CdmPostDataChangeObservableListener.getDefault().unregister(observer);
206
//        }
207
        changeObservers.clear();
208
        cdmEntitySessionManager.remove(sessionOwner);
209
    }
210

    
211

    
212
    /* (non-Javadoc)
213
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
214
     */
215
    @Override
216
    public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
217
        affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
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#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
225
     */
226
    @Override
227
    public  <T extends ICdmBase>  void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
228
        affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
229
        for(ICdmBase cdmBase : cdmBases) {
230
            CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
231
            CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
232
        }
233
    }
234

    
235
    /* (non-Javadoc)
236
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
237
     */
238
    @Override
239
    public void fireNotifications() {
240
        CdmPostDataChangeObservableListener.getDefault().delayedNotify();
241
    }
242

    
243

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

    
253

    
254
    /* (non-Javadoc)
255
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
256
     */
257
    @Override
258
    public <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
259
        T cdmBase = service.load(uuid, propertyPaths);
260
        return load(cdmBase, false);
261
    }
262

    
263

    
264
    /* (non-Javadoc)
265
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
266
     */
267
    @Override
268
    public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
269
        UUID uuid = service.save(cdmBase);
270
        load(cdmBase,false);
271
        return uuid;
272
    }
273

    
274

    
275
    /* (non-Javadoc)
276
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
277
     */
278
    @Override
279
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
280
        T mergedCdmBase = service.merge(cdmBase);
281
        return mergedCdmBase;
282
    }
283

    
284

    
285
    /* (non-Javadoc)
286
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
287
     */
288
    @Override
289
    public boolean isActive() {
290
        return cdmEntitySessionManager.getActiveSession() == this;
291
    }
292

    
293

    
294
    /* (non-Javadoc)
295
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
296
     */
297
    @Override
298
    public ICdmEntitySessionEnabled getOwner() {
299
        return sessionOwner;
300
    }
301

    
302

    
303
    /* (non-Javadoc)
304
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
305
     */
306
    @Override
307
    public LiveCacheStatistics getCacheStatistics() {
308
        return cdmTransientEntityCacher.getCacheStatistics();
309
    }
310

    
311

    
312
    /* (non-Javadoc)
313
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
314
     */
315
    @Override
316
    public <T extends CdmBase> List<T> getRootEntities() {
317
        return sessionOwner.getRootEntities();
318
    }
319

    
320
    public CdmTransientEntityCacher getCacher() {
321
        return cdmTransientEntityCacher;
322
    }
323

    
324

    
325

    
326

    
327

    
328

    
329

    
330

    
331

    
332

    
333

    
334
}
(2-2/7)