adding missing delete method to CommonServiceImpl
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / CommonServiceImpl.java
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.common.ISourceable;
27 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
28 import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
29 import eu.etaxonomy.cdm.model.metadata.CdmMetaDataPropertyName;
30 import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
31 import eu.etaxonomy.cdm.persistence.dao.common.IOriginalSourceDao;
32 import eu.etaxonomy.cdm.persistence.query.OrderHint;
33 import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
34 import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
35 import eu.etaxonomy.cdm.strategy.match.IMatchable;
36 import eu.etaxonomy.cdm.strategy.match.MatchException;
37 import eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator;
38 import eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator.MatchStrategy;
39 import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy;
40 import eu.etaxonomy.cdm.strategy.merge.IMergable;
41 import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;
42 import eu.etaxonomy.cdm.strategy.merge.MergeException;
43
44
45 @Service
46 @Transactional(readOnly = true)
47 public class CommonServiceImpl /*extends ServiceBase<OriginalSourceBase,IOriginalSourceDao>*/ implements ICommonService {
48 @SuppressWarnings("unused")
49 private static final Logger logger = Logger.getLogger(CommonServiceImpl.class);
50
51
52 @Autowired
53 private IOriginalSourceDao originalSourceDao;
54
55
56 @Autowired
57 private ICdmGenericDao genericDao;
58
59
60 @Override
61 public CdmBase findWithUpdate(Class<? extends CdmBase> clazz, int id){
62 return genericDao.find(clazz, id);
63 }
64
65 @Override
66 public CdmBase find(Class<? extends CdmBase> clazz, int id){
67 return genericDao.find(clazz, id);
68 }
69
70 @Override
71 public CdmBase find(Class<? extends CdmBase> clazz, int id, List<String> propertyPaths){
72 return genericDao.find(clazz, id, propertyPaths);
73 }
74
75 @Override
76 public <T extends CdmBase> T find(Class<T> clazz, UUID uuid) {
77 return uuid == null ? null : genericDao.find(clazz, uuid);
78 }
79
80 @Override
81 public <T extends CdmBase> T find(Class<T> clazz, UUID uuid, List<String> propertyPaths) {
82 return uuid == null ? null : genericDao.find(clazz, uuid, propertyPaths);
83 }
84
85 @Override
86 public Map<String, ? extends ISourceable> getSourcedObjectsByIdInSource(Class clazz, Set<String> idInSourceSet, String idNamespace) {
87 Map<String, ? extends ISourceable> list = originalSourceDao.findOriginalSourcesByIdInSource(clazz, idInSourceSet, idNamespace);
88 return list;
89 }
90
91 @Override
92 public ISourceable getSourcedObjectByIdInSource(Class clazz, String idInSource, String idNamespace) {
93 ISourceable<?> result = null;
94 List<IdentifiableEntity> list = originalSourceDao.findOriginalSourceByIdInSource(clazz, idInSource, idNamespace);
95 if (! list.isEmpty()){
96 result = list.get(0);
97 }return result;
98 }
99
100
101 @Override
102 public Set<CdmBase> getReferencingObjects(CdmBase referencedCdmBase){
103 return this.genericDao.getReferencingObjects(referencedCdmBase);
104 }
105
106 @Override
107 public Integer getReferencingObjectsCount(CdmBase referencedCdmBase){
108 return this.genericDao.getReferencingObjectsCount(referencedCdmBase);
109 }
110
111 @Override
112 public Set<CdmBase> getReferencingObjectsForDeletion(CdmBase referencedCdmBase){
113 return this.genericDao.getReferencingObjectsForDeletion(referencedCdmBase);
114 }
115 // try {
116 // Set<Class<? extends CdmBase>> allCdmClasses = genericDao.getAllCdmClasses(false); //findAllCdmClasses();
117 //
118 // referencedCdmBase = (CdmBase)HibernateProxyHelper.deproxy(referencedCdmBase);
119 // Class referencedClass = referencedCdmBase.getClass();
120 // Set<CdmBase> result = new HashSet<>();
121 // logger.debug("Referenced Class: " + referencedClass.getName());
122 //
123 // for (Class<? extends CdmBase> cdmClass : allCdmClasses){
124 // Set<Field> fields = getFields(cdmClass);
125 // for (Field field: fields){
126 // Class<?> type = field.getType();
127 // //class
128 // if (! type.isInterface()){
129 // if (referencedClass.isAssignableFrom(type)||
130 // type.isAssignableFrom(referencedClass) && CdmBase.class.isAssignableFrom(type)){
131 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
132 // }
133 // //interface
134 // }else if (type.isAssignableFrom(referencedClass)){
135 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
136 // }else if (Collection.class.isAssignableFrom(type)){
137 //
138 // if (checkIsSetOfType(field, referencedClass, type) == true){
139 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, true);
140 // }
141 // }
142 //// Class[] interfaces = referencedClass.getInterfaces();
143 //// for (Class interfaze: interfaces){
144 //// if (interfaze == type){
145 ////// if(interfaze.isAssignableFrom(returnType)){
146 //// handleSingleClass(interfaze, type, field, cdmClass, result, referencedCdmBase);
147 //// }
148 //// }
149 // }
150 // }
151 // return result;
152 // } catch (Exception e) {
153 // e.printStackTrace();
154 // throw new RuntimeException(e);
155 // }
156 //
157 // }
158 //
159 // private boolean checkIsSetOfType(Field field, Class referencedClass, Class<?> type){
160 // Type genericType = (ParameterizedTypeImpl)field.getGenericType();
161 // if (genericType instanceof ParameterizedTypeImpl){
162 // ParameterizedTypeImpl paraType = (ParameterizedTypeImpl)genericType;
163 // paraType.getRawType();
164 // Type[] arguments = paraType.getActualTypeArguments();
165 // //logger.debug(arguments.length);
166 // if (arguments.length == 1){
167 // Class collectionClass;
168 // try {
169 // if (arguments[0] instanceof Class){
170 // collectionClass = (Class)arguments[0];
171 // }else if(arguments[0] instanceof TypeVariableImpl){
172 // TypeVariableImpl typeVariable = (TypeVariableImpl)arguments[0];
173 // GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration();
174 // collectionClass = (Class)genericDeclaration;
175 // }else{
176 // logger.warn("Unknown Type");
177 // return false;
178 // }
179 // if (CdmBase.class.isAssignableFrom(collectionClass) && collectionClass.isAssignableFrom(referencedClass) ){
180 // return true;
181 // }
182 // } catch (Exception e) {
183 // logger.warn(e.getMessage());
184 // }
185 // }else{
186 // logger.warn("Length of arguments <> 1");
187 // }
188 // }else{
189 // logger.warn("Not a generic type of type ParameterizedTypeImpl");
190 // }
191 // return false;
192 // }
193 //
194 //
195 //
196 //
197 // private boolean handleSingleClass(Class itemClass, Class type, Field field, Class cdmClass, Set<CdmBase> result,CdmBase value, boolean isCollection){
198 // if (! Modifier.isStatic(field.getModifiers())){
199 // String methodName = StringUtils.rightPad(field.getName(), 30);
200 // String className = StringUtils.rightPad(cdmClass.getSimpleName(), 30);
201 // String returnTypeName = StringUtils.rightPad(type.getSimpleName(), 30);
202 //
203 // logger.debug(methodName + "\t\t" + className + "\t\t" + returnTypeName);
204 //// result_old.add(method);
205 // result.addAll(getCdmBasesByFieldAndClass(field, itemClass, cdmClass, value, isCollection));
206 // }
207 // return true;
208 // }
209 //
210 // private Set<Field> getFields(Class clazz){
211 // Set<Field> result = new HashSet<>();
212 // for (Field field: clazz.getDeclaredFields()){
213 // if (!Modifier.isStatic(field.getModifiers())){
214 // result.add(field);
215 // }
216 // }
217 // Class superclass = clazz.getSuperclass();
218 // if (CdmBase.class.isAssignableFrom(superclass)){
219 // result.addAll(getFields(superclass));
220 // }
221 // return result;
222 // }
223 //
224 // private Set<CdmBase> getCdmBasesByFieldAndClass(Field field, Class itemClass, Class otherClazz, CdmBase item, boolean isCollection){
225 // Set<CdmBase> result = new HashSet<>();
226 // if (isCollection){
227 // result.addAll(genericDao.getCdmBasesWithItemInCollection(itemClass, otherClazz, field.getName(), item));
228 // }else{
229 // result.addAll(genericDao.getCdmBasesByFieldAndClass(otherClazz, field.getName(), item));
230 // }
231 // return result;
232 // }
233
234 @Override
235 public List getHqlResult(String hqlQuery){
236 return genericDao.getHqlResult(hqlQuery);
237 }
238
239 @Override
240 public <T extends IMergable> void merge(T mergeFirst, T mergeSecond, IMergeStrategy mergeStrategy) throws MergeException {
241 if (mergeStrategy == null){
242 mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
243 }
244 genericDao.merge((CdmBase)mergeFirst, (CdmBase)mergeSecond, mergeStrategy);
245 }
246
247 @Override
248 public <T extends IMergable> void merge(T mergeFirst, T mergeSecond, Class<? extends CdmBase> clazz) throws MergeException {
249 IMergeStrategy mergeStrategy;
250 if (clazz == null){
251 mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
252 } else {
253 mergeStrategy = DefaultMergeStrategy.NewInstance(clazz);
254 }
255 merge(mergeFirst, mergeSecond, mergeStrategy);
256 }
257
258 @Override
259 @Transactional(readOnly = false)
260 @Deprecated
261 public <T extends IMergable> void merge(int mergeFirstId, int mergeSecondId, Class<? extends CdmBase> clazz) throws MergeException {
262 IMergeStrategy mergeStrategy;
263 T mergeFirst = (T) genericDao.find(clazz, mergeFirstId);
264 T mergeSecond = (T) genericDao.find(clazz, mergeSecondId);
265 mergeStrategy = DefaultMergeStrategy.NewInstance(clazz);
266 merge(mergeFirst, mergeSecond, mergeStrategy);
267 }
268
269 @Override
270 @Transactional(readOnly = false)
271 public <T extends IMergable> void merge(UUID mergeFirstUuid, UUID mergeSecondUuid, Class<? extends CdmBase> clazz) throws MergeException {
272 IMergeStrategy mergeStrategy;
273 T mergeFirst = (T) genericDao.find(clazz, mergeFirstUuid);
274 T mergeSecond = (T) genericDao.find(clazz, mergeSecondUuid);
275 mergeStrategy = DefaultMergeStrategy.NewInstance(clazz);
276 merge(mergeFirst, mergeSecond, mergeStrategy);
277 }
278
279 @Override
280 public <T extends IMergable> void merge(T mergeFirst, T mergeSecond) throws MergeException {
281 IMergeStrategy mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
282 merge(mergeFirst, mergeSecond, mergeStrategy);
283 }
284
285
286 @Override
287 public <T extends IMatchable> List<T> findMatching(T objectToMatch, IMatchStrategy matchStrategy) throws MatchException {
288 if (matchStrategy == null){
289 matchStrategy = DefaultMatchStrategy.NewInstance(((objectToMatch).getClass()));
290 }
291 return genericDao.findMatching(objectToMatch, matchStrategy);
292 }
293
294
295
296 /* (non-Javadoc)
297 * @see eu.etaxonomy.cdm.api.service.ICommonService#findMatching(eu.etaxonomy.cdm.strategy.match.IMatchable, eu.etaxonomy.cdm.strategy.match.MatchStrategyConfigurator.MatchStrategy)
298 */
299 @Override
300 public <T extends IMatchable> List<T> findMatching(T objectToMatch, MatchStrategy strategy) throws MatchException {
301 return findMatching(objectToMatch, MatchStrategyConfigurator.getMatchStrategy(strategy));
302 }
303
304 // /* (non-Javadoc)
305 // * @see eu.etaxonomy.cdm.api.service.IService#list(java.lang.Class, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
306 // */
307 // @Override
308 // public <TYPE extends OriginalSourceBase> Pager<TYPE> list(Class<TYPE> type,
309 // Integer pageSize, Integer pageNumber, List<OrderHint> orderHints,
310 // List<String> propertyPaths) {
311 // logger.warn("Not yet implemented");
312 // return null;
313 // }
314
315
316 @Transactional(readOnly = false)
317 @Override
318 public void saveAllMetaData(Collection<CdmMetaData> metaData) {
319 Iterator<CdmMetaData> iterator = metaData.iterator();
320 while(iterator.hasNext()){
321 CdmMetaData cdmMetaData = iterator.next();
322 genericDao.saveMetaData(cdmMetaData);
323 }
324 }
325
326 @Override
327 public Map<CdmMetaDataPropertyName, CdmMetaData> getCdmMetaData() {
328 Map<CdmMetaDataPropertyName, CdmMetaData> result = new HashMap<>();
329 List<CdmMetaData> metaDataList = genericDao.getMetaData();
330 for (CdmMetaData metaData : metaDataList){
331 CdmMetaDataPropertyName propertyName = metaData.getPropertyName();
332 result.put(propertyName, metaData);
333 }
334 return result;
335 }
336
337 @Override
338 public Object initializeCollection(UUID ownerUuid, String fieldName) {
339 return genericDao.initializeCollection(ownerUuid, fieldName);
340
341 }
342
343 @Override
344 public Object initializeCollection(UUID ownerUuid, String fieldName, List<String> propertyPaths) {
345 return genericDao.initializeCollection(ownerUuid, fieldName, propertyPaths);
346
347 }
348
349 @Override
350 public boolean isEmpty(UUID ownerUuid, String fieldName) {
351 return genericDao.isEmpty(ownerUuid, fieldName);
352
353 }
354
355 @Override
356 public int size(UUID ownerUuid, String fieldName) {
357 return genericDao.size(ownerUuid, fieldName);
358 }
359
360
361 @Override
362 public Object get(UUID ownerUuid, String fieldName, int index) {
363 return genericDao.get(ownerUuid, fieldName, index);
364 }
365
366 @Override
367 public boolean contains(UUID ownerUuid, String fieldName, Object element) {
368 return genericDao.contains(ownerUuid, fieldName, element);
369 }
370
371 @Override
372 public boolean containsKey(UUID ownerUuid, String fieldName, Object key) {
373 return genericDao.containsKey(ownerUuid, fieldName, key);
374 }
375
376 @Override
377 public boolean containsValue(UUID ownerUuid, String fieldName, Object value) {
378 return genericDao.containsValue(ownerUuid, fieldName, value);
379 }
380
381 @Override
382 @Transactional(readOnly = false)
383 public void createFullSampleData() {
384 genericDao.createFullSampleData();
385 }
386
387
388
389 @Override
390 public <S extends CdmBase> List<S> list(Class<S> type, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths){
391 return genericDao.list(type,limit, start, orderHints,propertyPaths);
392 }
393
394 @Override
395 public <S extends CdmBase> int count(Class<S> type) {
396 return genericDao.count(type);
397 }
398
399 @Override
400 @Transactional(readOnly = false)
401 public CdmBase save(CdmBase newInstance) {
402 return genericDao.save(newInstance);
403 }
404
405 @Override
406 @Transactional(readOnly = false)
407 public UUID delete(CdmBase instance) {
408 return genericDao.delete(instance);
409 }
410
411 @Override
412 @Transactional(readOnly = false)
413 public UUID saveOrUpdate(CdmBase newInstance) {
414 return genericDao.saveOrUpdate(newInstance);
415 }
416
417
418 @Override
419 @Transactional(readOnly = false)
420 public <T extends CdmBase> Map<UUID,T> save(Collection<T> newInstances) {
421 //this is very ugly, I know, but for now I do not want to copy the saveAll method from CdmEntityDaoBase to genericDao
422 //and generally the saveAll method should work for other CdmBase types with generics removed
423 return originalSourceDao.saveAll((Collection)newInstances);
424 }
425
426 @Override
427 @Transactional(readOnly = false)
428 public <T extends CdmBase> Map<UUID,T> saveOrUpdate(Collection<T> newInstances) {
429 //this is very ugly, I know, but for now I do not want to copy the saveAll method from CdmEntityDaoBase to genericDao
430 //and generally the saveAll method should work for other CdmBase types with generics removed
431 return originalSourceDao.saveOrUpdateAll((Collection)newInstances);
432 }
433
434
435 @Override
436 public <T extends CdmBase> boolean isMergeable(T cdmBase1, T cdmBase2, IMergeStrategy mergeStrategy) throws MergeException {
437 return genericDao.isMergeable(cdmBase1, cdmBase2, mergeStrategy);
438 }
439
440 }