Project

General

Profile

Download (10.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2014 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9
package eu.etaxonomy.taxeditor.session;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.Collection;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.UUID;
17

    
18
import org.apache.log4j.Logger;
19

    
20
import eu.etaxonomy.cdm.api.service.IService;
21
import eu.etaxonomy.cdm.api.service.UpdateResult;
22
import eu.etaxonomy.cdm.cache.CdmTransientEntityCacher;
23
//import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
24
import eu.etaxonomy.cdm.cache.EntityCacherDebugResult;
25
import eu.etaxonomy.cdm.model.common.CdmBase;
26
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
27
import eu.etaxonomy.taxeditor.remoting.cache.ConversationalTransientEntityCacher;
28
import net.sf.ehcache.statistics.LiveCacheStatistics;
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 ConversationalTransientEntityCacher(sessionOwner);
62

    
63

    
64
        this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
65
        cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
66
    }
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 cdmTransientEntityCacher.load(cdmBase, update);
86
    }
87

    
88

    
89

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

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

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

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

    
139

    
140

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

    
149

    
150

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

    
161

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

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

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

    
190

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

    
199
    }
200

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

    
207
        cdmTransientEntityCacher.dispose();
208
        changeObservers.clear();
209
        cdmEntitySessionManager.remove(sessionOwner);
210

    
211
    }
212

    
213

    
214
//    /* (non-Javadoc)
215
//     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
216
//     */
217
//    @Override
218
//    public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
219
//        affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
220
//        CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
221
//        CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
222
//    }
223

    
224

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

    
234

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

    
244

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

    
255

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

    
265

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

    
274

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

    
283

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

    
292

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

    
301
    public CdmTransientEntityCacher getCacher() {
302
        return cdmTransientEntityCacher;
303
    }
304

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

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

    
322
}
(2-2/9)