Project

General

Profile

Download (10.1 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.Map;
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.api.service.UpdateResult;
25
import eu.etaxonomy.cdm.model.common.CdmBase;
26
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
27
import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
28
import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
29

    
30

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

    
41
public class CdmEntitySession implements ICdmEntitySession  {
42

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

    
45
    private final CdmEntitySessionManager cdmEntitySessionManager;
46

    
47
    private final ICdmEntitySessionEnabled sessionOwner;
48

    
49
    private CdmTransientEntityCacher cdmTransientEntityCacher;
50

    
51
    private List<ICdmEntitySessionEnabled> changeObservers;
52

    
53

    
54
    public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
55
        this.sessionOwner = sessionOwner;
56
        this.cdmEntitySessionManager = cdmEntitySessionManager;
57
        init(sessionOwner, cdmEntitySessionManager);
58
    }
59

    
60
    private void init(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
61
        this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
62
        this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
63
        cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
64
    }
65

    
66

    
67

    
68

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

    
77

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

    
86

    
87

    
88
    /* (non-Javadoc)
89
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
90
     */
91
    @Override
92
    public UpdateResult load(UpdateResult updateResult, boolean update) {
93
        return cdmTransientEntityCacher.load(updateResult, update);
94
    }
95

    
96
    /* (non-Javadoc)
97
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
98
     */
99
    @Override
100
    public  <T extends CdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
101
        return  cdmTransientEntityCacher.load(mergeResult, update);
102
    }
103

    
104
    @Override
105
    public <T extends CdmBase> void  update() {
106
        Collection<T> rootEntities = getRootEntities();
107
        if(rootEntities != null) {
108
            for(T rootEntity : rootEntities) {
109
                load(rootEntity, true);
110
            }
111
        }
112
    }
113

    
114
//    @Override
115
//    public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
116
//        addEvent(cdmBase, affectedObjects, EventType.UPDATE);
117
//    }
118
//
119
//    @Override
120
//    public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
121
//        Set<CdmBase> set = new HashSet<CdmBase>();
122
//        set.add(affectedObject);
123
//        addEvent(cdmBase, set, EventType.UPDATE);
124
//    }
125
//
126
//
127
//    @Override
128
//    public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
129
//        addEvent(cdmBase, affectedObjects, EventType.DELETE);
130
//    }
131
//
132
//    @Override
133
//    public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
134
//        addEvent(cdmBases, affectedObjects, EventType.DELETE);
135
//    }
136

    
137

    
138

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

    
147

    
148

    
149
    /* (non-Javadoc)
150
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
151
     */
152
    @Override
153
    public <T extends CdmBase> EntityCacherDebugResult debug(Collection<T> cdmBases) {
154
        EntityCacherDebugResult entityCacherDebugResult =
155
                new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
156
        return entityCacherDebugResult;
157
    }
158

    
159

    
160
    /* (non-Javadoc)
161
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
162
     */
163
    @Override
164
    public <T extends CdmBase> EntityCacherDebugResult debug() {
165
        return debug(getRootEntities());
166
    }
167

    
168
    /* (non-Javadoc)
169
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
170
     */
171
    @Override
172
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
173
        return cdmTransientEntityCacher.load(cdmBaseList, update);
174
    }
175

    
176
    /* (non-Javadoc)
177
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
178
     */
179
    @Override
180
    public void setEntitiesAsLatest() {
181
        //FIXME:Remoting need to think more about whether we really need this
182
        //		List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
183
        //		for(CdmBase entity : entities) {
184
        //			cdmEntitySessionManager.setEntityAsLatest(entity);
185
        //		}
186
    }
187

    
188

    
189
    @Override
190
    public void bind() {
191
        logger.info("Binding session with owner " + sessionOwner.toString());
192
        if(!cdmEntitySessionManager.contains(sessionOwner)) {
193
            init(sessionOwner, cdmEntitySessionManager);
194
        }
195
        cdmEntitySessionManager.bind(sessionOwner);
196

    
197
    }
198

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

    
205
        cdmTransientEntityCacher.dispose();
206
        changeObservers.clear();
207
        cdmEntitySessionManager.remove(sessionOwner);
208

    
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#load(java.util.UUID, java.lang.Class)
225
     */
226
    @Override
227
    public  <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid) {
228
        T cdmBase = service.load(uuid);
229
        return load(cdmBase, false);
230
    }
231

    
232

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

    
242

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

    
253

    
254
    /* (non-Javadoc)
255
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
256
     */
257
    @Override
258
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
259
        T mergedCdmBase = service.merge(cdmBase, true).getMergedEntity();
260
        return mergedCdmBase;
261
    }
262

    
263

    
264
    /* (non-Javadoc)
265
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
266
     */
267
    @Override
268
    public boolean isActive() {
269
        return cdmEntitySessionManager.getActiveSession() == this;
270
    }
271

    
272

    
273
    /* (non-Javadoc)
274
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
275
     */
276
    @Override
277
    public ICdmEntitySessionEnabled getOwner() {
278
        return sessionOwner;
279
    }
280

    
281

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

    
290

    
291
    /* (non-Javadoc)
292
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
293
     */
294
    @Override
295
    public <T extends CdmBase> Collection<T> getRootEntities() {
296
        return sessionOwner.getRootEntities();
297
    }
298

    
299
    public CdmTransientEntityCacher getCacher() {
300
        return cdmTransientEntityCacher;
301
    }
302

    
303
    @Override
304
    public List<String> getPropertyPaths(Object obj) {
305
        Map<Object, List<String>> propertyPathsMap = sessionOwner.getPropertyPathsMap();
306
        if(propertyPathsMap == null || propertyPathsMap.isEmpty()) {
307
            return null;
308
        }
309
        return propertyPathsMap.get(obj);
310
    }
311

    
312
    /* (non-Javadoc)
313
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase)
314
     */
315
    @Override
316
    public void addNewCdmEntity(CdmBase newEntity) {
317
        cdmTransientEntityCacher.addNewEntity(newEntity);
318
    }
319

    
320
}
(2-2/9)