Project

General

Profile

Download (8.47 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
 * 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 corresponding service class
36
 * 
37
 * @author cmathew
38
 * @date 20 Oct 2014
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 ConversationalTransientEntityCacher 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 ConversationalTransientEntityCacher(sessionOwner);
61

    
62

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

    
67

    
68
    @Override
69
    public  <O extends Object> O load(O obj, boolean update) {
70
        return cdmTransientEntityCacher.load(obj, update);
71
    }
72

    
73

    
74
    @Override
75
    public  <T extends CdmBase> T load(T cdmBase, boolean update) {
76
        return cdmTransientEntityCacher.load(cdmBase, update);
77
    }
78

    
79
    @Override
80
    public UpdateResult load(UpdateResult updateResult, boolean update) {
81
        return cdmTransientEntityCacher.load(updateResult, update);
82
    }
83

    
84
    @Override
85
    public  <T extends CdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
86
        return  cdmTransientEntityCacher.load(mergeResult, update);
87
    }
88

    
89
    @Override
90
    public <T extends CdmBase> void  update() {
91
        Collection<T> rootEntities = getRootEntities();
92
        if(rootEntities != null) {
93
            for(T rootEntity : rootEntities) {
94
                load(rootEntity, true);
95
            }
96
        }
97
    }
98

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

    
122

    
123
    @Override
124
    public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
125
        return debug(Arrays.asList(cdmBase));
126
    }
127

    
128
    @Override
129
    public <T extends CdmBase> eu.etaxonomy.cdm.cache.EntityCacherDebugResult debug(Collection<T> cdmBases) {
130
        EntityCacherDebugResult entityCacherDebugResult =
131
                new EntityCacherDebugResult(cdmTransientEntityCacher, cdmBases);
132
        return entityCacherDebugResult;
133
    }
134

    
135
    @Override
136
    public <T extends CdmBase> EntityCacherDebugResult debug() {
137
        return debug(getRootEntities());
138
    }
139

    
140
    @Override
141
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
142
        return cdmTransientEntityCacher.load(cdmBaseList, update);
143
    }
144

    
145
    @Override
146
    public void setEntitiesAsLatest() {
147
        //FIXME:Remoting need to think more about whether we really need this
148
        //		List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
149
        //		for(CdmBase entity : entities) {
150
        //			cdmEntitySessionManager.setEntityAsLatest(entity);
151
        //		}
152
    }
153

    
154

    
155
    @Override
156
    public void bind() {
157
        logger.info("Binding session with owner " + sessionOwner.toString());
158
        if(!cdmEntitySessionManager.contains(sessionOwner)) {
159
            init(sessionOwner, cdmEntitySessionManager);
160
        }
161
        cdmEntitySessionManager.bind(sessionOwner);
162

    
163
    }
164

    
165
    @Override
166
    public void dispose() {
167

    
168
        cdmTransientEntityCacher.dispose();
169
        changeObservers.clear();
170
        cdmEntitySessionManager.remove(sessionOwner);
171

    
172
    }
173

    
174
//    @Override
175
//    public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
176
//        affectedObjects = (Set<CdmBase>) load(affectedObjects, true);
177
//        CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
178
//        CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
179
//    }
180

    
181
    /**
182
     *  Returns a persisted entity specified by the <code>uuid</code>
183
     *  or null if the entity does not exist,
184
     *  loads it to the entityCacher
185
     *
186
     * @param service
187
     * @param uuid
188
     *
189
     * @return
190
     */
191
    @Override
192
    public  <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid) {
193
        T cdmBase = service.load(uuid);
194
        return load(cdmBase, false);
195
    }
196

    
197

    
198
    /**
199
     * Returns the cdm entity specified by the <code>uuid</code>,
200
     * recursively initializes all bean properties given in the
201
     * <code>propertyPaths</code> parameter,
202
     * the loaded entity is also loaded to the entityCache
203
     * <p>
204
     * For detailed description and examples <b>please refer to:</b>
205
     * {@link IBeanInitializer#initialize(Object, List)}
206
     *
207
     * @param service
208
     * @param uuid
209
     * @param propertyPath
210
     *
211
     * @return
212
     */
213
    @Override
214
    public <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
215
        T cdmBase = service.load(uuid, propertyPaths);
216
        return load(cdmBase, false);
217
    }
218

    
219
    @Override
220
    public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
221
        UUID uuid = service.save(cdmBase).getUuid();
222
        load(cdmBase,false);
223
        return uuid;
224
    }
225

    
226
    @Override
227
    public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
228
        T mergedCdmBase = service.merge(cdmBase, true).getMergedEntity();
229
        return mergedCdmBase;
230
    }
231

    
232
    @Override
233
    public boolean isActive() {
234
        return cdmEntitySessionManager.getActiveSession() == this;
235
    }
236

    
237
    @Override
238
    public ICdmEntitySessionEnabled getOwner() {
239
        return sessionOwner;
240
    }
241

    
242
    @Override
243
    public LiveCacheStatistics getCacheStatistics() {
244
        return cdmTransientEntityCacher.getCacheStatistics();
245
    }
246

    
247
    @Override
248
    public <T extends CdmBase> Collection<T> getRootEntities() {
249
        return sessionOwner.getRootEntities();
250
    }
251

    
252
    public CdmTransientEntityCacher getCacher() {
253
        return cdmTransientEntityCacher;
254
    }
255

    
256
    @Override
257
    public List<String> getPropertyPaths(Object obj) {
258
        Map<Object, List<String>> propertyPathsMap = sessionOwner.getPropertyPathsMap();
259
        if(propertyPathsMap == null || propertyPathsMap.isEmpty()) {
260
            return null;
261
        }
262
        return propertyPathsMap.get(obj);
263
    }
264

    
265
    @Override
266
    public void addNewCdmEntity(CdmBase newEntity) {
267
        cdmTransientEntityCacher.addNewEntity(newEntity);
268
    }
269

    
270
}
(2-2/9)