Project

General

Profile

Download (16.7 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.Collection;
13
import java.util.HashMap;
14
import java.util.Iterator;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.Set;
18
import java.util.UUID;
19

    
20
import org.apache.log4j.Logger;
21
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.stereotype.Service;
23
import org.springframework.transaction.annotation.Transactional;
24

    
25
import eu.etaxonomy.cdm.model.common.CdmBase;
26
import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
27
import eu.etaxonomy.cdm.model.metadata.CdmMetaDataPropertyName;
28
import eu.etaxonomy.cdm.model.reference.ISourceable;
29
import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
30
import eu.etaxonomy.cdm.persistence.dao.reference.IOriginalSourceDao;
31
import eu.etaxonomy.cdm.persistence.query.OrderHint;
32
import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
33
import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
34
import eu.etaxonomy.cdm.strategy.match.IMatchable;
35
import eu.etaxonomy.cdm.strategy.match.MatchException;
36
import eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator;
37
import eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator.MatchStrategy;
38
import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy;
39
import eu.etaxonomy.cdm.strategy.merge.IMergable;
40
import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;
41
import eu.etaxonomy.cdm.strategy.merge.MergeException;
42

    
43

    
44
@Service
45
@Transactional(readOnly = true)
46
public class CommonServiceImpl
47
        /*extends ServiceBase<OriginalSourceBase,IOriginalSourceDao>*/
48
        implements ICommonService {
49

    
50
    @SuppressWarnings("unused")
51
    private static final Logger logger = Logger.getLogger(CommonServiceImpl.class);
52

    
53
    @Autowired
54
    private IOriginalSourceDao originalSourceDao;
55

    
56
    @Autowired
57
    private ICdmGenericDao genericDao;
58

    
59
    @Override
60
    public <T extends CdmBase> T findWithUpdate(Class<T> clazz, int id){
61
        return genericDao.find(clazz, id);
62
    }
63

    
64
    @Override
65
    public <T extends CdmBase> T find(Class<T> clazz, int id){
66
        return genericDao.find(clazz, id);
67
    }
68

    
69
    @Override
70
    public <T extends CdmBase> T find(Class<T> clazz, int id, List<String> propertyPaths){
71
        return  genericDao.find(clazz, id, propertyPaths);
72
    }
73

    
74
    @Override
75
    public <T extends CdmBase> T find(Class<T> clazz, UUID uuid) {
76
        return uuid == null ? null : genericDao.find(clazz, uuid);
77
    }
78

    
79
    @Override
80
    public <T extends CdmBase> T find(Class<T> clazz, UUID uuid, List<String> propertyPaths) {
81
        return uuid == null ? null : genericDao.find(clazz, uuid, propertyPaths);
82
    }
83

    
84
    @Override
85
    public <S extends ISourceable> Map<String, S> getSourcedObjectsByIdInSourceC(Class<S> clazz, Set<String> idInSourceSet, String idNamespace){
86
        Map<String, S> list = originalSourceDao.findOriginalSourcesByIdInSource(clazz, idInSourceSet, idNamespace);
87
        return list;
88
    }
89

    
90
    @Override
91
    public <S extends ISourceable> S getSourcedObjectByIdInSource(Class<S> clazz, String idInSource, String idNamespace) {
92
        S result = null;
93
        List<S> list = originalSourceDao.findOriginalSourceByIdInSource(clazz, idInSource, idNamespace);
94
        if (! list.isEmpty()){
95
            result = list.get(0);
96
        }return result;
97
    }
98

    
99
    @Override
100
    public Set<CdmBase> getReferencingObjects(CdmBase referencedCdmBase){
101
        return this.genericDao.getReferencingObjects(referencedCdmBase);
102
    }
103

    
104
    @Override
105
    public long getReferencingObjectsCount(CdmBase referencedCdmBase){
106
        return this.genericDao.getReferencingObjectsCount(referencedCdmBase);
107
    }
108

    
109
    @Override
110
    public Set<CdmBase> getReferencingObjectsForDeletion(CdmBase referencedCdmBase){
111
        return this.genericDao.getReferencingObjectsForDeletion(referencedCdmBase);
112
    }
113
    //		try {
114
    //			Set<Class<? extends CdmBase>> allCdmClasses = genericDao.getAllCdmClasses(false); //findAllCdmClasses();
115
    //
116
    //			referencedCdmBase = (CdmBase)HibernateProxyHelper.deproxy(referencedCdmBase);
117
    //			Class referencedClass = referencedCdmBase.getClass();
118
    //			Set<CdmBase> result = new HashSet<>();
119
    //			logger.debug("Referenced Class: " + referencedClass.getName());
120
    //
121
    //			for (Class<? extends CdmBase> cdmClass : allCdmClasses){
122
    //				Set<Field> fields = getFields(cdmClass);
123
    //				for (Field field: fields){
124
    //					Class<?> type = field.getType();
125
    //					//class
126
    //					if (! type.isInterface()){
127
    //						if (referencedClass.isAssignableFrom(type)||
128
    //								type.isAssignableFrom(referencedClass) && CdmBase.class.isAssignableFrom(type)){
129
    //							handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
130
    //						}
131
    //					//interface
132
    //					}else if (type.isAssignableFrom(referencedClass)){
133
    //							handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
134
    //					}else if (Collection.class.isAssignableFrom(type)){
135
    //
136
    //						if (checkIsSetOfType(field, referencedClass, type) == true){
137
    //							handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, true);
138
    //						}
139
    //					}
140
    ////				Class[] interfaces = referencedClass.getInterfaces();
141
    ////				for (Class interfaze: interfaces){
142
    ////					if (interfaze == type){
143
    //////					if(interfaze.isAssignableFrom(returnType)){
144
    ////						handleSingleClass(interfaze, type, field, cdmClass, result, referencedCdmBase);
145
    ////					}
146
    ////				}
147
    //				}
148
    //			}
149
    //			return result;
150
    //		} catch (Exception e) {
151
    //			e.printStackTrace();
152
    //			throw new RuntimeException(e);
153
    //		}
154
    //
155
    //	}
156
    //
157
    //	private boolean checkIsSetOfType(Field field, Class referencedClass, Class<?> type){
158
    //		Type genericType = (ParameterizedTypeImpl)field.getGenericType();
159
    //		if (genericType instanceof ParameterizedTypeImpl){
160
    //			ParameterizedTypeImpl paraType = (ParameterizedTypeImpl)genericType;
161
    //			paraType.getRawType();
162
    //			Type[] arguments = paraType.getActualTypeArguments();
163
    //			//logger.debug(arguments.length);
164
    //			if (arguments.length == 1){
165
    //				Class collectionClass;
166
    //				try {
167
    //					if (arguments[0] instanceof Class){
168
    //						collectionClass = (Class)arguments[0];
169
    //					}else if(arguments[0] instanceof TypeVariableImpl){
170
    //						TypeVariableImpl typeVariable = (TypeVariableImpl)arguments[0];
171
    //						GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration();
172
    //						collectionClass = (Class)genericDeclaration;
173
    //					}else{
174
    //						logger.warn("Unknown Type");
175
    //						return false;
176
    //					}
177
    //					if (CdmBase.class.isAssignableFrom(collectionClass) && collectionClass.isAssignableFrom(referencedClass)  ){
178
    //						return true;
179
    //					}
180
    //				} catch (Exception e) {
181
    //					logger.warn(e.getMessage());
182
    //				}
183
    //			}else{
184
    //				logger.warn("Length of arguments <> 1");
185
    //			}
186
    //		}else{
187
    //			logger.warn("Not a generic type of type ParameterizedTypeImpl");
188
    //		}
189
    //		return false;
190
    //	}
191
    //
192
    //
193
    //
194
    //
195
    //	private boolean handleSingleClass(Class itemClass, Class type, Field field, Class cdmClass, Set<CdmBase> result,CdmBase value, boolean isCollection){
196
    //		if (! Modifier.isStatic(field.getModifiers())){
197
    //			String methodName = StringUtils.rightPad(field.getName(), 30);
198
    //			String className = StringUtils.rightPad(cdmClass.getSimpleName(), 30);
199
    //			String returnTypeName = StringUtils.rightPad(type.getSimpleName(), 30);
200
    //
201
    //			logger.debug(methodName +   "\t\t" + className + "\t\t" + returnTypeName);
202
    ////			result_old.add(method);
203
    //			result.addAll(getCdmBasesByFieldAndClass(field, itemClass, cdmClass, value, isCollection));
204
    //		}
205
    //		return true;
206
    //	}
207
    //
208
    //	private Set<Field> getFields(Class clazz){
209
    //		Set<Field> result = new HashSet<>();
210
    //		for (Field field: clazz.getDeclaredFields()){
211
    //			if (!Modifier.isStatic(field.getModifiers())){
212
    //				result.add(field);
213
    //			}
214
    //		}
215
    //		Class superclass = clazz.getSuperclass();
216
    //		if (CdmBase.class.isAssignableFrom(superclass)){
217
    //			result.addAll(getFields(superclass));
218
    //		}
219
    //		return result;
220
    //	}
221
    //
222
    //	private Set<CdmBase> getCdmBasesByFieldAndClass(Field field, Class itemClass, Class otherClazz, CdmBase item, boolean isCollection){
223
    //		Set<CdmBase> result = new HashSet<>();
224
    //		if (isCollection){
225
    //			result.addAll(genericDao.getCdmBasesWithItemInCollection(itemClass, otherClazz, field.getName(), item));
226
    //		}else{
227
    //			result.addAll(genericDao.getCdmBasesByFieldAndClass(otherClazz, field.getName(), item));
228
    //		}
229
    //		return result;
230
    //	}
231

    
232
    @Override
233
    public List getHqlResult(String hqlQuery){
234
        return genericDao.getHqlResult(hqlQuery, new Object[0]);
235
    }
236

    
237
    @Override
238
    public List getHqlResult(String hqlQuery, Object[] params){
239
        return genericDao.getHqlResult(hqlQuery, params);
240
    }
241

    
242
    @Override
243
    public <T extends IMergable> void merge(T mergeFirst, T mergeSecond, IMergeStrategy mergeStrategy) throws MergeException {
244
        if (mergeStrategy == null){
245
            mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
246
        }
247
        genericDao.merge((CdmBase)mergeFirst, (CdmBase)mergeSecond, mergeStrategy);
248
    }
249

    
250
    @Override
251
    public <T extends IMergable> void merge(T mergeFirst, T mergeSecond, Class<? extends CdmBase> clazz) throws MergeException {
252
        IMergeStrategy mergeStrategy;
253
        if (clazz == null){
254
            mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
255
        } else {
256
            mergeStrategy = DefaultMergeStrategy.NewInstance(clazz);
257
        }
258
        merge(mergeFirst, mergeSecond, mergeStrategy);
259
    }
260

    
261
    @Override
262
    @Transactional(readOnly = false)
263
    @Deprecated
264
    public <T extends IMergable> void merge(int mergeFirstId, int mergeSecondId, Class<? extends CdmBase> clazz) throws MergeException {
265
        IMergeStrategy mergeStrategy;
266
        T mergeFirst = (T) genericDao.find(clazz, mergeFirstId);
267
        T mergeSecond = (T) genericDao.find(clazz, mergeSecondId);
268
        mergeStrategy = DefaultMergeStrategy.NewInstance(clazz);
269
        merge(mergeFirst, mergeSecond, mergeStrategy);
270
    }
271

    
272
    @Override
273
    @Transactional(readOnly = false)
274
    public <T extends IMergable> void merge(UUID mergeFirstUuid, UUID mergeSecondUuid, Class<? extends CdmBase> clazz) throws MergeException {
275
        IMergeStrategy mergeStrategy;
276
        T mergeFirst = (T) genericDao.find(clazz, mergeFirstUuid);
277
        T mergeSecond = (T) genericDao.find(clazz, mergeSecondUuid);
278
        if (mergeFirst == null){
279
            throw new MergeException("The merge target is not available anymore.");
280
        }
281
        if (mergeSecond == null){
282
            throw new MergeException("The merge candidate is not available anymore.");
283
        }
284
        mergeStrategy = DefaultMergeStrategy.NewInstance(clazz);
285
        merge(mergeFirst, mergeSecond, mergeStrategy);
286
    }
287

    
288
    @Override
289
    public <T extends IMergable> void merge(T mergeFirst, T mergeSecond) throws MergeException {
290
        IMergeStrategy mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
291
        merge(mergeFirst, mergeSecond, mergeStrategy);
292
    }
293

    
294
    @Override
295
    public <T extends IMatchable> List<T> findMatching(T objectToMatch, IMatchStrategy matchStrategy) throws MatchException {
296
        if (matchStrategy == null){
297
            matchStrategy = DefaultMatchStrategy.NewInstance(((objectToMatch).getClass()));
298
        }
299
        return genericDao.findMatching(objectToMatch, matchStrategy);
300
    }
301

    
302
    @Override
303
    public <T extends IMatchable> List<T> findMatching(T objectToMatch, MatchStrategy strategy) throws MatchException {
304
        return findMatching(objectToMatch, MatchStrategyConfigurator.getMatchStrategy(strategy));
305
    }
306

    
307
    @Transactional(readOnly = false)
308
    @Override
309
    public void saveAllMetaData(Collection<CdmMetaData> metaData) {
310
        Iterator<CdmMetaData> iterator = metaData.iterator();
311
        while(iterator.hasNext()){
312
            CdmMetaData cdmMetaData = iterator.next();
313
            genericDao.saveMetaData(cdmMetaData);
314
        }
315
    }
316

    
317
    @Override
318
    public Map<CdmMetaDataPropertyName, CdmMetaData> getCdmMetaData() {
319
        Map<CdmMetaDataPropertyName, CdmMetaData> result = new HashMap<>();
320
        List<CdmMetaData> metaDataList = genericDao.getMetaData();
321
        for (CdmMetaData metaData : metaDataList){
322
            CdmMetaDataPropertyName propertyName = metaData.getPropertyName();
323
            result.put(propertyName, metaData);
324
        }
325
        return result;
326
    }
327

    
328
    @Override
329
    public Object initializeCollection(UUID ownerUuid, String fieldName) {
330
        return genericDao.initializeCollection(ownerUuid, fieldName);
331

    
332
    }
333

    
334
    @Override
335
    public Object initializeCollection(UUID ownerUuid, String fieldName, List<String> propertyPaths) {
336
        return genericDao.initializeCollection(ownerUuid, fieldName, propertyPaths);
337

    
338
    }
339

    
340
    @Override
341
    public boolean isEmpty(UUID ownerUuid, String fieldName) {
342
        return genericDao.isEmpty(ownerUuid, fieldName);
343

    
344
    }
345

    
346
    @Override
347
    public int size(UUID ownerUuid, String fieldName) {
348
        return genericDao.size(ownerUuid, fieldName);
349
    }
350

    
351

    
352
    @Override
353
    public Object get(UUID ownerUuid, String fieldName, int index) {
354
        return genericDao.get(ownerUuid, fieldName, index);
355
    }
356

    
357
    @Override
358
    public boolean contains(UUID ownerUuid, String fieldName, Object element) {
359
        return genericDao.contains(ownerUuid, fieldName, element);
360
    }
361

    
362
    @Override
363
    public boolean containsKey(UUID ownerUuid, String fieldName, Object key) {
364
        return genericDao.containsKey(ownerUuid, fieldName, key);
365
    }
366

    
367
    @Override
368
    public boolean containsValue(UUID ownerUuid, String fieldName, Object value) {
369
        return genericDao.containsValue(ownerUuid, fieldName, value);
370
    }
371

    
372
    @Override
373
    @Transactional(readOnly = false)
374
    public void createFullSampleData() {
375
        genericDao.createFullSampleData();
376
    }
377

    
378
    @Override
379
    public <S extends CdmBase> List<S> list(Class<S> type, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths){
380
        return genericDao.list(type, limit, start, orderHints, propertyPaths);
381
    }
382

    
383
    @Override
384
    public <S extends CdmBase> long count(Class<S> type) {
385
        return genericDao.count(type);
386
    }
387

    
388
    @Override
389
    @Transactional(readOnly = false)
390
    public CdmBase save(CdmBase newInstance) {
391
        return genericDao.save(newInstance);
392
    }
393

    
394
    @Override
395
    @Transactional(readOnly = false)
396
    public UUID delete(CdmBase instance) {
397
        return genericDao.delete(instance);
398
    }
399

    
400
    @Override
401
    @Transactional(readOnly = false)
402
    public UUID saveOrUpdate(CdmBase newInstance) {
403
        return genericDao.saveOrUpdate(newInstance);
404
    }
405

    
406
    @Override
407
    @Transactional(readOnly = false)
408
    public <T extends CdmBase> Map<UUID,T> save(Collection<T> newInstances) {
409
        //this is very ugly, I know, but for now I do not want to copy the saveAll method from CdmEntityDaoBase to genericDao
410
        //and generally the saveAll method should work for other CdmBase types with generics removed
411
        return (Map<UUID, T>) originalSourceDao.saveAll((Collection)newInstances);
412
    }
413

    
414
    @Override
415
    @Transactional(readOnly = false)
416
    public <T extends CdmBase> Map<UUID,T> saveOrUpdate(Collection<T> newInstances) {
417
        //this is very ugly, I know, but for now I do not want to copy the saveAll method from CdmEntityDaoBase to genericDao
418
        //and generally the saveAll method should work for other CdmBase types with generics removed
419
        return (Map<UUID, T>) originalSourceDao.saveOrUpdateAll((Collection)newInstances);
420
    }
421

    
422

    
423
    @Override
424
    public <T extends CdmBase> boolean isMergeable(T cdmBase1, T cdmBase2, IMergeStrategy mergeStrategy) throws MergeException {
425
        return genericDao.isMergeable(cdmBase1, cdmBase2, mergeStrategy);
426
    }
427

    
428
    @Override
429
    public List<UUID> listUuid(Class<? extends CdmBase> clazz) {
430
        return genericDao.listUuid(clazz);
431
    }
432
}
(7-7/100)