Project

General

Profile

Download (10.7 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.dao.initializer.IBeanInitializer;
27
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
28
import eu.etaxonomy.taxeditor.remoting.cache.ConversationalTransientEntityCacher;
29
import net.sf.ehcache.statistics.LiveCacheStatistics;
30

    
31

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

    
42
public class CdmEntitySession implements ICdmEntitySession  {
43

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

    
46
    private final CdmEntitySessionManager cdmEntitySessionManager;
47

    
48
    private final ICdmEntitySessionEnabled sessionOwner;
49

    
50
    private ConversationalTransientEntityCacher cdmTransientEntityCacher;
51

    
52
    private List<ICdmEntitySessionEnabled> changeObservers;
53

    
54

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

    
61
    private void init(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
62
        this.cdmTransientEntityCacher = new ConversationalTransientEntityCacher(sessionOwner);
63

    
64

    
65
        this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
66
        cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
67
    }
68

    
69

    
70

    
71

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

    
80

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

    
89

    
90

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

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

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

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

    
140

    
141

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

    
150

    
151

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

    
162

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

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

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

    
191

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

    
200
    }
201

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

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

    
212
    }
213

    
214

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

    
225

    
226
    /**
227
     *  Returns a persisted entity specified by the <code>uuid</code>
228
     *  or null if the entity does not exist,
229
     *  loads it to the entityCacher
230
     *
231
     * @param service
232
     * @param uuid
233
     *
234
     * @return
235
     */
236
    @Override
237
    public  <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid) {
238
        T cdmBase = service.load(uuid);
239
        return load(cdmBase, false);
240
    }
241

    
242

    
243
    /**
244
     * Returns the cdm entity specified by the <code>uuid</code>,
245
     * recursively initializes all bean properties given in the
246
     * <code>propertyPaths</code> parameter,
247
     * the loaded entity is also loaded to the entityCache
248
     * <p>
249
     * For detailed description and examples <b>please refer to:</b>
250
     * {@link IBeanInitializer#initialize(Object, List)}
251
     *
252
     * @param service
253
     * @param uuid
254
     * @param propertyPath
255
     *
256
     * @return
257
     */
258
    @Override
259
    public <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
260
        T cdmBase = service.load(uuid, propertyPaths);
261
        return load(cdmBase, false);
262
    }
263

    
264

    
265
    /* (non-Javadoc)
266
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
267
     */
268
    @Override
269
    public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
270
        UUID uuid = service.save(cdmBase).getUuid();
271
        load(cdmBase,false);
272
        return uuid;
273
    }
274

    
275

    
276
    /* (non-Javadoc)
277
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
278
     */
279
    @Override
280
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
281
        T mergedCdmBase = service.merge(cdmBase, true).getMergedEntity();
282
        return mergedCdmBase;
283
    }
284

    
285

    
286
    /* (non-Javadoc)
287
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
288
     */
289
    @Override
290
    public boolean isActive() {
291
        return cdmEntitySessionManager.getActiveSession() == this;
292
    }
293

    
294

    
295
    /* (non-Javadoc)
296
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
297
     */
298
    @Override
299
    public ICdmEntitySessionEnabled getOwner() {
300
        return sessionOwner;
301
    }
302

    
303

    
304
    /* (non-Javadoc)
305
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
306
     */
307
    @Override
308
    public LiveCacheStatistics getCacheStatistics() {
309
        return cdmTransientEntityCacher.getCacheStatistics();
310
    }
311

    
312

    
313
    /* (non-Javadoc)
314
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getRootEntities()
315
     */
316
    @Override
317
    public <T extends CdmBase> Collection<T> getRootEntities() {
318
        return sessionOwner.getRootEntities();
319
    }
320

    
321
    public CdmTransientEntityCacher getCacher() {
322
        return cdmTransientEntityCacher;
323
    }
324

    
325
    @Override
326
    public List<String> getPropertyPaths(Object obj) {
327
        Map<Object, List<String>> propertyPathsMap = sessionOwner.getPropertyPathsMap();
328
        if(propertyPathsMap == null || propertyPathsMap.isEmpty()) {
329
            return null;
330
        }
331
        return propertyPathsMap.get(obj);
332
    }
333

    
334
    /* (non-Javadoc)
335
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#addNewCdmEntity(eu.etaxonomy.cdm.model.common.CdmBase)
336
     */
337
    @Override
338
    public void addNewCdmEntity(CdmBase newEntity) {
339
        cdmTransientEntityCacher.addNewEntity(newEntity);
340
    }
341

    
342
}
(2-2/9)