Project

General

Profile

Download (9.44 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 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

    
10
package eu.etaxonomy.cdm.api.service;
11

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

    
19
import org.apache.log4j.Logger;
20
import org.hibernate.LockOptions;
21
import org.hibernate.Session;
22
import org.springframework.context.ApplicationContext;
23
import org.springframework.context.ApplicationContextAware;
24
import org.springframework.dao.DataAccessException;
25
import org.springframework.transaction.annotation.Transactional;
26

    
27
import eu.etaxonomy.cdm.api.service.pager.Pager;
28
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
29
import eu.etaxonomy.cdm.model.common.CdmBase;
30
import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;
31
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.DaoBase;
32
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
33
import eu.etaxonomy.cdm.persistence.query.Grouping;
34
import eu.etaxonomy.cdm.persistence.query.OrderHint;
35

    
36
public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T>>
37
            implements IService<T>, ApplicationContextAware {
38

    
39
    @SuppressWarnings("unused")
40
    private static final Logger logger = Logger.getLogger(ServiceBase.class);
41

    
42
    protected ApplicationContext appContext;
43

    
44
    public final static boolean NO_UNPUBLISHED = DaoBase.NO_UNPUBLISHED;  //constant for unpublished
45
    public final static boolean INCLUDE_UNPUBLISHED = DaoBase.INCLUDE_UNPUBLISHED;  //constant for unpublished
46

    
47
    protected DAO dao;
48

    
49
    @Override
50
    @Transactional(readOnly = true)
51
    public void lock(T t, LockOptions lockOptions) {
52
        dao.lock(t, lockOptions);
53
    }
54

    
55
    @Override
56
    @Transactional(readOnly = true)
57
    public void refresh(T t, LockOptions lockOptions, List<String> propertyPaths) {
58
        dao.refresh(t, lockOptions, propertyPaths);
59
    }
60

    
61
    @Override
62
    @Transactional(readOnly = false)
63
    public void clear() {
64
        dao.clear();
65
    }
66

    
67
    @Override
68
    @Transactional(readOnly = true)
69
    public int count(Class<? extends T> clazz) {
70
        return dao.count(clazz);
71
    }
72

    
73
    @Override
74
    @Transactional(readOnly = false)
75
    public DeleteResult delete(UUID persistentObjectUUID) {
76
        T persistentObject = dao.findByUuid(persistentObjectUUID);
77
        return delete(persistentObject);
78
    }
79

    
80
    @Override
81
    @Transactional(readOnly = false)
82
    public DeleteResult delete(Collection<UUID> persistentObjectUUIDs) {
83
        DeleteResult result = new DeleteResult();
84
        for(UUID persistentObjectUUID : persistentObjectUUIDs) {
85
            T persistentObject = dao.findByUuid(persistentObjectUUID);
86
            DeleteResult dr = delete(persistentObject);
87
            result.includeResult(dr);
88
        }
89
        return result;
90
    }
91

    
92
    @Override
93
    @Transactional(readOnly = false)
94
    public DeleteResult delete(T persistentObject) {
95
    	DeleteResult result = new DeleteResult();
96
    	try{
97
    		dao.delete(persistentObject);
98
    		result.addDeletedObject(persistentObject);
99
    	} catch(DataAccessException e){
100
    		result.setError();
101
    		result.addException(e);
102
    	}
103
        return result;
104
    }
105

    
106

    
107

    
108
    @Override
109
    @Transactional(readOnly = true)
110
    public boolean exists(UUID uuid) {
111
        return dao.exists(uuid);
112
    }
113

    
114
    @Override
115
    @Transactional(readOnly = true)
116
    public List<T> find(Set<UUID> uuidSet) {
117
        return dao.list(uuidSet, null, null, null, null);
118
    }
119

    
120
    @Override
121
    @Transactional(readOnly = true)
122
    public List<T> findById(Set<Integer> idSet) {  //can't be called find(Set<Integer>) as this conflicts with find(Set<UUID)
123
        return dao.loadList(idSet, null);
124
    }
125

    
126
    @Override
127
    @Transactional(readOnly = true)
128
    public List<T> loadByIds(List<Integer> idList, List<String> propertyPaths){
129
        return dao.loadList(idList, propertyPaths);
130
    }
131

    
132
    @Override
133
    @Transactional(readOnly = true)
134
    public T find(UUID uuid) {
135
        return uuid == null ? null : dao.findByUuid(uuid);
136
    }
137

    
138
    @Override
139
    @Transactional(readOnly = true)
140
    public T findWithoutFlush(UUID uuid) {
141
        return uuid == null ? null : dao.findByUuidWithoutFlush(uuid);
142
    }
143

    
144
    @Override
145
    @Transactional(readOnly = true)
146
    public T find(int id) {
147
        return dao.findById(id);
148
    }
149

    
150
    @Override
151
    @Transactional(readOnly = true)
152
    public Session getSession() {
153
        return dao.getSession();
154
    }
155

    
156
    @Override
157
    @Transactional(readOnly = true)
158
    public List<Object[]> group(Class<? extends T> clazz,Integer limit, Integer start, List<Grouping> groups, List<String> propertyPaths) {
159
        return dao.group(clazz, limit, start, groups, propertyPaths);
160
    }
161

    
162
    @Override
163
    @Transactional(readOnly = true)
164
    public <S extends T> List<S> list(Class<S> type, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths){
165
        return dao.list(type,limit, start, orderHints, propertyPaths);
166
    }
167

    
168
    @Override
169
    @Transactional(readOnly = true)
170
    public T load(UUID uuid) {
171
        return uuid == null ? null : dao.load(uuid);
172
    }
173

    
174
    @Override
175
    @Transactional(readOnly = true)
176
    public T loadWithUpdate(UUID uuid) {
177
        return load(uuid);
178
    }
179

    
180
    @Override
181
    @Transactional(readOnly = true)
182
    public T load(int id, List<String> propertyPaths) {
183
        return dao.load(id, propertyPaths);
184
    }
185

    
186
    @Override
187
    @Transactional(readOnly = true)
188
    public T load(UUID uuid, List<String> propertyPaths){
189
        return uuid == null ? null : dao.load(uuid, propertyPaths);
190
    }
191

    
192
    @Override
193
    @Transactional(readOnly = true)
194
    public List<T> load(List<UUID> uuids, List<String> propertyPaths){
195
        if(uuids == null) {
196
            return null;
197
        }
198

    
199
        List<T> entities = new ArrayList<>();
200
        for(UUID uuid : uuids) {
201
            entities.add(uuid == null ? null : dao.load(uuid, propertyPaths));
202
        }
203
        return entities;
204
    }
205

    
206
    @Override
207
    @Transactional(readOnly = false)
208
    public T merge(T newInstance) {
209
        return dao.merge(newInstance);
210
    }
211

    
212
    @Override
213
    @Transactional(readOnly = false)
214
    public MergeResult<T> merge(T newInstance, boolean returnTransientEntity) {
215
        return dao.merge(newInstance, returnTransientEntity);
216
    }
217

    
218
    @Override
219
    @Transactional(readOnly = false)
220
    public List<T> merge(List<T> detachedObjects) {
221
        List<T> mergedObjects = new ArrayList<T>();
222
        for(T obj : detachedObjects) {
223
            mergedObjects.add(dao.merge(obj));
224
        }
225
        return mergedObjects;
226
    }
227

    
228
    @Override
229
    @Transactional(readOnly = false)
230
    public List<MergeResult<T>> merge(List<T> detachedObjects, boolean returnTransientEntity) {
231
        List<MergeResult<T>> mergedObjects = new ArrayList<MergeResult<T>>();
232
        for(T obj : detachedObjects) {
233
            mergedObjects.add(dao.merge(obj, returnTransientEntity));
234
        }
235
        return mergedObjects;
236
    }
237

    
238
    @Override
239
    @Transactional(readOnly = true)
240
    public  <S extends T> Pager<S> page(Class<S> type, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths){
241
        Integer numberOfResults = dao.count(type);
242
        List<S> results = new ArrayList<S>();
243
        pageNumber = pageNumber == null ? 0 : pageNumber;
244
        if(numberOfResults > 0) { // no point checking again  //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
245
            Integer start = pageSize == null ? 0 : pageSize * pageNumber;
246
            results = dao.list(type, pageSize, start, orderHints,propertyPaths);
247
        }
248
        return new DefaultPagerImpl<S>(pageNumber, numberOfResults, pageSize, results);
249
    }
250

    
251
    @Override
252
    @Transactional(readOnly = true)
253
    public UUID refresh(T persistentObject) {
254
        return dao.refresh(persistentObject);
255
    }
256

    
257
    @Override
258
    @Transactional(readOnly = false)
259
    public Map<UUID, T> save(Collection<T> newInstances) {
260
        return dao.saveAll(newInstances);
261
    }
262

    
263
    @Override
264
    @Transactional(readOnly = false)
265
    public T save(T newInstance) {
266
        return dao.save(newInstance);
267
    }
268

    
269
    @Override
270
    @Transactional(readOnly = false)
271
    public UUID saveOrUpdate(T transientObject) {
272
        return dao.saveOrUpdate(transientObject);
273
    }
274

    
275
    @Override
276
    @Transactional(readOnly = false)
277
    public Map<UUID, T> saveOrUpdate(Collection<T> transientInstances) {
278
        return dao.saveOrUpdateAll(transientInstances);
279
    }
280

    
281
    @Override
282
    public void setApplicationContext(ApplicationContext appContext){
283
        this.appContext = appContext;
284
    }
285

    
286

    
287
    protected abstract void setDao(DAO dao);
288

    
289
    @Override
290
    @Transactional(readOnly = false)
291
    public UUID update(T transientObject) {
292
        return dao.update(transientObject);
293
    }
294

    
295
    @Override
296
    @Transactional(readOnly = true)
297
    public List<T> list(T example, Set<String> includeProperties, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {
298
        return dao.list(example, includeProperties, limit, start, orderHints, propertyPaths);
299
    }
300

    
301

    
302

    
303
}
(92-92/106)