Project

General

Profile

Download (8.09 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.Collection;
14
import java.util.List;
15
import java.util.Set;
16
import java.util.UUID;
17

    
18
import org.apache.poi.ss.formula.functions.T;
19

    
20
import eu.etaxonomy.cdm.api.service.IService;
21
import eu.etaxonomy.cdm.model.common.CdmBase;
22
import eu.etaxonomy.cdm.model.common.ICdmBase;
23
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
24
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
25
import eu.etaxonomy.cdm.persistence.hibernate.CdmPostDataChangeObservableListener;
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

    
43
    private final CdmEntitySessionManager cdmEntitySessionManager;
44

    
45
    private final ICdmEntitySessionEnabled sessionOwner;
46

    
47
    private final CdmTransientEntityCacher cdmTransientEntityCacher;
48

    
49
    private final List<ICdmEntitySessionEnabled> changeObservers;
50

    
51
    private final List<T> rootEntities;
52

    
53
    public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
54
        this.sessionOwner = sessionOwner;
55
        this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
56
        this.rootEntities = new ArrayList<T>();
57
        this.cdmEntitySessionManager = cdmEntitySessionManager;
58
        this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
59
        cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
60
    }
61

    
62

    
63
    /* (non-Javadoc)
64
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
65
     */
66
    @Override
67
    public  <O extends Object> O load(O obj) {
68
        return cdmTransientEntityCacher.load(obj,true);
69
    }
70

    
71

    
72
    /* (non-Javadoc)
73
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
74
     */
75
    @Override
76
    public  <T extends CdmBase> T load(T cdmBase) {
77
        return (T)cdmTransientEntityCacher.load(cdmBase,true);
78
    }
79

    
80
    @Override
81
    public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
82
        load(cdmBase);
83
        addEvent(cdmBase, affectedObjects, EventType.UPDATE);
84
    }
85

    
86
    @Override
87
    public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
88
        for(CdmBase cb : affectedObjects) {
89
            load(cb);
90
        }
91
        addEvent(cdmBase, affectedObjects, EventType.DELETE);
92
    }
93

    
94
    @Override
95
    public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
96
        for(CdmBase cb : affectedObjects) {
97
            load(cb);
98
        }
99
        addEvent(cdmBases, affectedObjects, EventType.DELETE);
100
    }
101

    
102

    
103

    
104
    /* (non-Javadoc)
105
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
106
     */
107
    @Override
108
    public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
109
        EntityCacherDebugResult entityCacherDebugResult = cdmTransientEntityCacher.debug(cdmBase, true);
110
        entityCacherDebugResult.print();
111
        return entityCacherDebugResult;
112
    }
113

    
114
    /* (non-Javadoc)
115
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
116
     */
117
    @Override
118
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
119
        return cdmTransientEntityCacher.load(cdmBaseList,true);
120
    }
121

    
122
    /* (non-Javadoc)
123
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
124
     */
125
    @Override
126
    public void setEntitiesAsLatest() {
127
        //FIXME:Remoting need to think more about whether we really need this
128
        //		List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
129
        //		for(CdmBase entity : entities) {
130
        //			cdmEntitySessionManager.setEntityAsLatest(entity);
131
        //		}
132
    }
133

    
134
    /**
135
     * Register to get updated after any interaction with the datastore
136
     */
137
    @Override
138
    public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
139
        CdmPostDataChangeObservableListener.getDefault().register(observer);
140
    }
141

    
142
    /**
143
     * Register to get updated after any interaction with the datastore
144
     */
145
    @Override
146
    public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
147
        CdmPostDataChangeObservableListener.getDefault().unregister(observer);
148
    }
149

    
150

    
151

    
152
    @Override
153
    public void bind() {
154
        cdmEntitySessionManager.bind(sessionOwner);
155
    }
156
    /* (non-Javadoc)
157
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
158
     */
159
    @Override
160
    public void dispose() {
161
        rootEntities.clear();
162
        cdmTransientEntityCacher.dispose();
163
        for(ICdmEntitySessionEnabled observer : changeObservers) {
164
            CdmPostDataChangeObservableListener.getDefault().unregister(observer);
165
        }
166
        changeObservers.clear();
167
    }
168

    
169

    
170
    /* (non-Javadoc)
171
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
172
     */
173
    @Override
174
    public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
175
        CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
176
        CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
177
    }
178

    
179

    
180
    /* (non-Javadoc)
181
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
182
     */
183
    @Override
184
    public  <T extends ICdmBase>  void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
185
        for(ICdmBase cdmBase : cdmBases) {
186
            CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
187
            CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
188
        }
189

    
190
    }
191

    
192
    /* (non-Javadoc)
193
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
194
     */
195
    @Override
196
    public void fireNotifications() {
197
        CdmPostDataChangeObservableListener.getDefault().delayedNotify();
198
    }
199

    
200

    
201
    /* (non-Javadoc)
202
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
203
     */
204
    @Override
205
    public  <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid) {
206
        T cdmBase = service.load(uuid);
207
        return load(cdmBase);
208
    }
209

    
210

    
211
    /* (non-Javadoc)
212
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
213
     */
214
    @Override
215
    public <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
216
        T cdmBase = service.load(uuid, propertyPaths);
217
        return load(cdmBase);
218
    }
219

    
220

    
221
    /* (non-Javadoc)
222
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
223
     */
224
    @Override
225
    public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
226
        UUID uuid = service.save(cdmBase);
227
        load(cdmBase);
228
        return uuid;
229
    }
230

    
231

    
232
    /* (non-Javadoc)
233
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
234
     */
235
    @Override
236
    public <T extends CdmBase> void remoteUpdate(IService<T> service, T cdmBase) {
237
        service.merge(cdmBase);
238
        // FIXME:Remoting not really sure if we need to reload the new
239
        // merged object or can we keep using the old one
240
        //return load(mergedCdmBase);
241
    }
242

    
243

    
244

    
245

    
246

    
247

    
248
}
(2-2/6)