Project

General

Profile

Download (9.67 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.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 CdmTransientEntityCacher cdmTransientEntityCacher;
49

    
50
    private List<ICdmEntitySessionEnabled> changeObservers;
51

    
52

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

    
59
    private void init(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
60
        this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
61
        this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
62
        cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
63
    }
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

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

    
95
    @Override
96
    public <T extends CdmBase> void  update() {
97
        Collection<T> rootEntities = getRootEntities();
98
        if(rootEntities != null) {
99
            for(T rootEntity : rootEntities) {
100
                load(rootEntity, true);
101
            }
102
        }
103
    }
104

    
105
//    @Override
106
//    public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
107
//        addEvent(cdmBase, affectedObjects, EventType.UPDATE);
108
//    }
109
//
110
//    @Override
111
//    public <T extends ICdmBase> void update(T cdmBase, CdmBase affectedObject) {
112
//        Set<CdmBase> set = new HashSet<CdmBase>();
113
//        set.add(affectedObject);
114
//        addEvent(cdmBase, set, EventType.UPDATE);
115
//    }
116
//
117
//
118
//    @Override
119
//    public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
120
//        addEvent(cdmBase, affectedObjects, EventType.DELETE);
121
//    }
122
//
123
//    @Override
124
//    public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
125
//        addEvent(cdmBases, affectedObjects, EventType.DELETE);
126
//    }
127

    
128

    
129

    
130
    /* (non-Javadoc)
131
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
132
     */
133
    @Override
134
    public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
135
        return debug(Arrays.asList(cdmBase));
136
    }
137

    
138

    
139

    
140
    /* (non-Javadoc)
141
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(java.util.List)
142
     */
143
    @Override
144
    public <T extends CdmBase> EntityCacherDebugResult debug(Collection<T> cdmBases) {
145
        EntityCacherDebugResult entityCacherDebugResult =
146
                new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
147
        return entityCacherDebugResult;
148
    }
149

    
150

    
151
    /* (non-Javadoc)
152
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug()
153
     */
154
    @Override
155
    public <T extends CdmBase> EntityCacherDebugResult debug() {
156
        return debug(getRootEntities());
157
    }
158

    
159
    /* (non-Javadoc)
160
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
161
     */
162
    @Override
163
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
164
        return cdmTransientEntityCacher.load(cdmBaseList, update);
165
    }
166

    
167
    /* (non-Javadoc)
168
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
169
     */
170
    @Override
171
    public void setEntitiesAsLatest() {
172
        //FIXME:Remoting need to think more about whether we really need this
173
        //		List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
174
        //		for(CdmBase entity : entities) {
175
        //			cdmEntitySessionManager.setEntityAsLatest(entity);
176
        //		}
177
    }
178

    
179

    
180
    @Override
181
    public void bind() {
182
        logger.info("Binding session with owner " + sessionOwner.toString());
183
        if(!cdmEntitySessionManager.contains(sessionOwner)) {
184
            init(sessionOwner, cdmEntitySessionManager);
185
        }
186
        cdmEntitySessionManager.bind(sessionOwner);
187

    
188
    }
189

    
190
    /* (non-Javadoc)
191
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
192
     */
193
    @Override
194
    public void dispose() {
195

    
196
        cdmTransientEntityCacher.dispose();
197
        changeObservers.clear();
198
        cdmEntitySessionManager.remove(sessionOwner);
199

    
200
    }
201

    
202

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

    
213

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

    
223

    
224
    /* (non-Javadoc)
225
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
226
     */
227
    @Override
228
    public <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
229
        T cdmBase = service.load(uuid, propertyPaths);
230
        return load(cdmBase, false);
231
    }
232

    
233

    
234
    /* (non-Javadoc)
235
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
236
     */
237
    @Override
238
    public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
239
        UUID uuid = service.save(cdmBase).getUuid();
240
        load(cdmBase,false);
241
        return uuid;
242
    }
243

    
244

    
245
    /* (non-Javadoc)
246
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
247
     */
248
    @Override
249
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
250
        T mergedCdmBase = service.merge(cdmBase, true);
251
        return mergedCdmBase;
252
    }
253

    
254

    
255
    /* (non-Javadoc)
256
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
257
     */
258
    @Override
259
    public boolean isActive() {
260
        return cdmEntitySessionManager.getActiveSession() == this;
261
    }
262

    
263

    
264
    /* (non-Javadoc)
265
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
266
     */
267
    @Override
268
    public ICdmEntitySessionEnabled getOwner() {
269
        return sessionOwner;
270
    }
271

    
272

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

    
281

    
282
    /* (non-Javadoc)
283
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
284
     */
285
    @Override
286
    public <T extends CdmBase> Collection<T> getRootEntities() {
287
        return sessionOwner.getRootEntities();
288
    }
289

    
290
    public CdmTransientEntityCacher getCacher() {
291
        return cdmTransientEntityCacher;
292
    }
293

    
294
    @Override
295
    public List<String> getPropertyPaths(Object obj) {
296
        Map<Object, List<String>> propertyPathsMap = sessionOwner.getPropertyPathsMap();
297
        if(propertyPathsMap == null || propertyPathsMap.isEmpty()) {
298
            return null;
299
        }
300
        return propertyPathsMap.get(obj);
301
    }
302

    
303
    /* (non-Javadoc)
304
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase)
305
     */
306
    @Override
307
    public void addNewCdmEntity(CdmBase newEntity) {
308
        cdmTransientEntityCacher.addNewEntity(newEntity);
309
    }
310

    
311
}
(2-2/9)