Project

General

Profile

Download (7.74 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 void update(CdmBase cdmBase, Set<CdmBase> affectedObjects) {
82
        load(cdmBase);
83
        addEvent(cdmBase, affectedObjects, EventType.UPDATE);
84
    }
85

    
86
    @Override
87
    public void delete(ICdmBase cdmBase, Set<CdmBase> affectedObjects) {
88
        addEvent(cdmBase, affectedObjects, EventType.DELETE);
89
    }
90

    
91

    
92

    
93
    /* (non-Javadoc)
94
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
95
     */
96
    @Override
97
    public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
98
        EntityCacherDebugResult entityCacherDebugResult = cdmTransientEntityCacher.debug(cdmBase, true);
99
        entityCacherDebugResult.print();
100
        return entityCacherDebugResult;
101
    }
102

    
103
    /* (non-Javadoc)
104
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
105
     */
106
    @Override
107
    public  <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
108
        return cdmTransientEntityCacher.load(cdmBaseList,true);
109
    }
110

    
111
    /* (non-Javadoc)
112
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
113
     */
114
    @Override
115
    public void setEntitiesAsLatest() {
116
        //FIXME:Remoting need to think more about whether we really need this
117
        //		List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
118
        //		for(CdmBase entity : entities) {
119
        //			cdmEntitySessionManager.setEntityAsLatest(entity);
120
        //		}
121
    }
122

    
123
    /**
124
     * Register to get updated after any interaction with the datastore
125
     */
126
    @Override
127
    public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
128
        CdmPostDataChangeObservableListener.getDefault().register(observer);
129
    }
130

    
131
    /**
132
     * Register to get updated after any interaction with the datastore
133
     */
134
    @Override
135
    public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
136
        CdmPostDataChangeObservableListener.getDefault().unregister(observer);
137
    }
138

    
139

    
140

    
141
    @Override
142
    public void bind() {
143
        cdmEntitySessionManager.bind(sessionOwner);
144
    }
145
    /* (non-Javadoc)
146
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
147
     */
148
    @Override
149
    public void dispose() {
150
        rootEntities.clear();
151
        cdmTransientEntityCacher.dispose();
152
        for(ICdmEntitySessionEnabled observer : changeObservers) {
153
            CdmPostDataChangeObservableListener.getDefault().unregister(observer);
154
        }
155
        changeObservers.clear();
156
    }
157

    
158

    
159
    /* (non-Javadoc)
160
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
161
     */
162
    @Override
163
    public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
164
        CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
165
        CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
166
    }
167

    
168

    
169
    /* (non-Javadoc)
170
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
171
     */
172
    @Override
173
    public  <T extends ICdmBase>  void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
174
        for(ICdmBase cdmBase : cdmBases) {
175
            CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
176
            CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
177
        }
178

    
179
    }
180

    
181
    /* (non-Javadoc)
182
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
183
     */
184
    @Override
185
    public void fireNotifications() {
186
        CdmPostDataChangeObservableListener.getDefault().delayedNotify();
187
    }
188

    
189

    
190
    /* (non-Javadoc)
191
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
192
     */
193
    @Override
194
    public  <T extends CdmBase>  T remoteLoad(IService<T> service, UUID uuid) {
195
        T cdmBase = service.load(uuid);
196
        return load(cdmBase);
197
    }
198

    
199

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

    
209

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

    
220

    
221
    /* (non-Javadoc)
222
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
223
     */
224
    @Override
225
    public <T extends CdmBase> void remoteUpdate(IService<T> service, T cdmBase) {
226
        service.merge(cdmBase);
227
        // FIXME:Remoting not really sure if we need to reload the new
228
        // merged object or can we keep using the old one
229
        //return load(mergedCdmBase);
230
    }
231

    
232

    
233

    
234

    
235

    
236

    
237
}
(2-2/6)