Project

General

Profile

Download (9.78 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.List;
16
import java.util.Set;
17
import java.util.UUID;
18

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

    
21
import org.apache.log4j.Logger;
22

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

    
32

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

    
43
public class CdmEntitySession implements ICdmEntitySession  {
44

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

    
47
    private final CdmEntitySessionManager cdmEntitySessionManager;
48

    
49
    private final ICdmEntitySessionEnabled sessionOwner;
50

    
51
    private final CdmTransientEntityCacher cdmTransientEntityCacher;
52

    
53
    private final List<ICdmEntitySessionEnabled> changeObservers;
54

    
55

    
56

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

    
65

    
66
    /* (non-Javadoc)
67
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
68
     */
69
    @Override
70
    public  <O extends Object> O load(O obj) {
71
        return cdmTransientEntityCacher.load(obj,true);
72
    }
73

    
74

    
75
    /* (non-Javadoc)
76
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
77
     */
78
    @Override
79
    public  <T extends CdmBase> T load(T cdmBase) {
80
        return (T)cdmTransientEntityCacher.load(cdmBase,true);
81
    }
82

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

    
89
    @Override
90
    public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
91
        for(CdmBase cb : affectedObjects) {
92
            load(cb);
93
        }
94
        addEvent(cdmBase, affectedObjects, EventType.DELETE);
95
    }
96

    
97
    @Override
98
    public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
99
        for(CdmBase cb : affectedObjects) {
100
            load(cb);
101
        }
102
        addEvent(cdmBases, affectedObjects, EventType.DELETE);
103
    }
104

    
105

    
106

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

    
115

    
116

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

    
127

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

    
136
    /* (non-Javadoc)
137
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
138
     */
139
    @Override
140
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
141
        return cdmTransientEntityCacher.load(cdmBaseList,true);
142
    }
143

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

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

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

    
172

    
173

    
174
    @Override
175
    public void bind() {
176
        logger.info("Binding session with owner " + sessionOwner.toString());
177
        cdmEntitySessionManager.bind(sessionOwner);
178
        cdmEntitySessionManager.notifyObservers();
179
    }
180

    
181
    /* (non-Javadoc)
182
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
183
     */
184
    @Override
185
    public void dispose() {
186

    
187
        cdmTransientEntityCacher.dispose();
188
        for(ICdmEntitySessionEnabled observer : changeObservers) {
189
            CdmPostDataChangeObservableListener.getDefault().unregister(observer);
190
        }
191
        changeObservers.clear();
192
        cdmEntitySessionManager.dispose(sessionOwner);
193
    }
194

    
195

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

    
205

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

    
216
    }
217

    
218
    /* (non-Javadoc)
219
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
220
     */
221
    @Override
222
    public void fireNotifications() {
223
        CdmPostDataChangeObservableListener.getDefault().delayedNotify();
224
    }
225

    
226

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

    
236

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

    
246

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

    
257

    
258
    /* (non-Javadoc)
259
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
260
     */
261
    @Override
262
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
263
        debug(cdmBase);
264
        T mergedCdmBase = service.merge(cdmBase);
265
        //cdmTransientEntityCacher.clear();
266
        // FIXME:Remoting not really sure if we need to reload the new
267
        // merged object or can we keep using the old one
268
        //return load(mergedCdmBase);
269

    
270
        return mergedCdmBase;
271
    }
272

    
273

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

    
282

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

    
291

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

    
300

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

    
309

    
310

    
311

    
312

    
313

    
314

    
315

    
316

    
317
}
(2-2/7)