Project

General

Profile

Download (8.73 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.taxeditor.remoting.cache.CdmTransientEntityCacher;
27
import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
28

    
29

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

    
40
public class CdmEntitySession implements ICdmEntitySession  {
41

    
42
    private static final Logger logger = Logger.getLogger(CdmEntitySession.class);
43

    
44
    private final CdmEntitySessionManager cdmEntitySessionManager;
45

    
46
    private final ICdmEntitySessionEnabled sessionOwner;
47

    
48
    private final CdmTransientEntityCacher cdmTransientEntityCacher;
49

    
50
    private final List<ICdmEntitySessionEnabled> changeObservers;
51

    
52
    private final Set<CdmBase> newCdmEntities;
53

    
54

    
55

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

    
65

    
66

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

    
75

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

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

    
94
//    @Override
95
//    public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
96
//        addEvent(cdmBase, affectedObjects, EventType.UPDATE);
97
//    }
98
//
99
//    @Override
100
//    public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
101
//        Set<CdmBase> set = new HashSet<CdmBase>();
102
//        set.add(affectedObject);
103
//        addEvent(cdmBase, set, EventType.UPDATE);
104
//    }
105
//
106
//
107
//    @Override
108
//    public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
109
//        addEvent(cdmBase, affectedObjects, EventType.DELETE);
110
//    }
111
//
112
//    @Override
113
//    public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
114
//        addEvent(cdmBases, affectedObjects, EventType.DELETE);
115
//    }
116

    
117

    
118

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

    
127

    
128

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

    
139

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

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

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

    
168

    
169
    @Override
170
    public void bind() {
171
        logger.info("Binding session with owner " + sessionOwner.toString());
172
        cdmEntitySessionManager.bind(sessionOwner);
173

    
174
    }
175

    
176
    /* (non-Javadoc)
177
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
178
     */
179
    @Override
180
    public void dispose() {
181

    
182
        cdmTransientEntityCacher.dispose();
183
//        for(ICdmEntitySessionEnabled observer : changeObservers) {
184
//            CdmPostDataChangeObservableListener.getDefault().unregister(observer);
185
//        }
186
        changeObservers.clear();
187
        cdmEntitySessionManager.remove(sessionOwner);
188
    }
189

    
190

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

    
201

    
202
    /* (non-Javadoc)
203
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
204
     */
205
    @Override
206
    public  <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid) {
207
        T cdmBase = service.load(uuid);
208
        return load(cdmBase, false);
209
    }
210

    
211

    
212
    /* (non-Javadoc)
213
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
214
     */
215
    @Override
216
    public <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
217
        T cdmBase = service.load(uuid, propertyPaths);
218
        return load(cdmBase, false);
219
    }
220

    
221

    
222
    /* (non-Javadoc)
223
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
224
     */
225
    @Override
226
    public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
227
        UUID uuid = service.save(cdmBase);
228
        load(cdmBase,false);
229
        return uuid;
230
    }
231

    
232

    
233
    /* (non-Javadoc)
234
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
235
     */
236
    @Override
237
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
238
        T mergedCdmBase = service.merge(cdmBase);
239
        return mergedCdmBase;
240
    }
241

    
242

    
243
    /* (non-Javadoc)
244
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
245
     */
246
    @Override
247
    public boolean isActive() {
248
        return cdmEntitySessionManager.getActiveSession() == this;
249
    }
250

    
251

    
252
    /* (non-Javadoc)
253
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
254
     */
255
    @Override
256
    public ICdmEntitySessionEnabled getOwner() {
257
        return sessionOwner;
258
    }
259

    
260

    
261
    /* (non-Javadoc)
262
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
263
     */
264
    @Override
265
    public LiveCacheStatistics getCacheStatistics() {
266
        return cdmTransientEntityCacher.getCacheStatistics();
267
    }
268

    
269

    
270
    /* (non-Javadoc)
271
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
272
     */
273
    @Override
274
    public <T extends CdmBase> List<T> getRootEntities() {
275
        return sessionOwner.getRootEntities();
276
    }
277

    
278
    public CdmTransientEntityCacher getCacher() {
279
        return cdmTransientEntityCacher;
280
    }
281

    
282

    
283

    
284

    
285

    
286

    
287

    
288

    
289

    
290

    
291

    
292
}
(2-2/7)