fixed a bug that occurred when executing operations on taxon nodes on root level
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / CommonServiceImpl.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 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
11 package eu.etaxonomy.cdm.api.service;
12
13 import java.util.Collection;
14 import java.util.HashMap;
15 import java.util.Iterator;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Set;
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.api.service.pager.Pager;
26 import eu.etaxonomy.cdm.model.common.CdmBase;
27 import eu.etaxonomy.cdm.model.common.CdmMetaData;
28 import eu.etaxonomy.cdm.model.common.ISourceable;
29 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
30 import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
31 import eu.etaxonomy.cdm.model.common.CdmMetaData.MetaDataPropertyName;
32 import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
33 import eu.etaxonomy.cdm.persistence.dao.common.IOriginalSourceDao;
34 import eu.etaxonomy.cdm.persistence.query.OrderHint;
35 import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
36 import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
37 import eu.etaxonomy.cdm.strategy.match.IMatchable;
38 import eu.etaxonomy.cdm.strategy.match.MatchException;
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 private static final Logger logger = Logger.getLogger(CommonServiceImpl.class);
49
50 @Autowired
51 IOriginalSourceDao originalSourceDao;
52
53 @Autowired
54 ICdmGenericDao genericDao;
55
56
57 @Autowired
58 protected void setDao(IOriginalSourceDao dao) {
59 this.dao = dao;
60 }
61
62 /* (non-Javadoc)
63 * @see eu.etaxonomy.cdm.api.service.ICommonService#getSourcedObjectById(java.lang.String, java.lang.String)
64 */
65 public ISourceable getSourcedObjectByIdInSource(Class clazz, String idInSource, String idNamespace) {
66 ISourceable result = null;
67 // List<OriginalSource> originalSource = originalSourceDao.findOriginalSourceByIdInSource(idInSource, idNamespace);
68 // if (! originalSource.isEmpty()){
69 // result = originalSource.get(0).getSourcedObj();
70 // }
71 List<IdentifiableEntity> list = originalSourceDao.findOriginalSourceByIdInSource(clazz, idInSource, idNamespace);
72 if (! list.isEmpty()){
73 result = list.get(0);
74 }return result;
75 }
76
77
78 /* (non-Javadoc)
79 * @see eu.etaxonomy.cdm.api.service.ICommonService#getReferencingObjects(eu.etaxonomy.cdm.model.common.CdmBase)
80 */
81 public Set<CdmBase> getReferencingObjects(CdmBase referencedCdmBase){
82 return this.genericDao.getReferencingObjects(referencedCdmBase);
83 }
84 // try {
85 // Set<Class<? extends CdmBase>> allCdmClasses = genericDao.getAllCdmClasses(false); //findAllCdmClasses();
86 //
87 // referencedCdmBase = (CdmBase)HibernateProxyHelper.deproxy(referencedCdmBase);
88 // Class referencedClass = referencedCdmBase.getClass();
89 // Set<CdmBase> result = new HashSet<CdmBase>();
90 // logger.debug("Referenced Class: " + referencedClass.getName());
91 //
92 // for (Class<? extends CdmBase> cdmClass : allCdmClasses){
93 // Set<Field> fields = getFields(cdmClass);
94 // for (Field field: fields){
95 // Class<?> type = field.getType();
96 // //class
97 // if (! type.isInterface()){
98 // if (referencedClass.isAssignableFrom(type)||
99 // type.isAssignableFrom(referencedClass) && CdmBase.class.isAssignableFrom(type)){
100 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
101 // }
102 // //interface
103 // }else if (type.isAssignableFrom(referencedClass)){
104 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
105 // }else if (Collection.class.isAssignableFrom(type)){
106 //
107 // if (checkIsSetOfType(field, referencedClass, type) == true){
108 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, true);
109 // }
110 // }
111 //// Class[] interfaces = referencedClass.getInterfaces();
112 //// for (Class interfaze: interfaces){
113 //// if (interfaze == type){
114 ////// if(interfaze.isAssignableFrom(returnType)){
115 //// handleSingleClass(interfaze, type, field, cdmClass, result, referencedCdmBase);
116 //// }
117 //// }
118 // }
119 // }
120 // return result;
121 // } catch (Exception e) {
122 // e.printStackTrace();
123 // throw new RuntimeException(e);
124 // }
125 //
126 // }
127 //
128 // private boolean checkIsSetOfType(Field field, Class referencedClass, Class<?> type){
129 // Type genericType = (ParameterizedTypeImpl)field.getGenericType();
130 // if (genericType instanceof ParameterizedTypeImpl){
131 // ParameterizedTypeImpl paraType = (ParameterizedTypeImpl)genericType;
132 // paraType.getRawType();
133 // Type[] arguments = paraType.getActualTypeArguments();
134 // //logger.debug(arguments.length);
135 // if (arguments.length == 1){
136 // Class collectionClass;
137 // try {
138 // if (arguments[0] instanceof Class){
139 // collectionClass = (Class)arguments[0];
140 // }else if(arguments[0] instanceof TypeVariableImpl){
141 // TypeVariableImpl typeVariable = (TypeVariableImpl)arguments[0];
142 // GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration();
143 // collectionClass = (Class)genericDeclaration;
144 // }else{
145 // logger.warn("Unknown Type");
146 // return false;
147 // }
148 // if (CdmBase.class.isAssignableFrom(collectionClass) && collectionClass.isAssignableFrom(referencedClass) ){
149 // return true;
150 // }
151 // } catch (Exception e) {
152 // logger.warn(e.getMessage());
153 // }
154 // }else{
155 // logger.warn("Length of arguments <> 1");
156 // }
157 // }else{
158 // logger.warn("Not a generic type of type ParameterizedTypeImpl");
159 // }
160 // return false;
161 // }
162 //
163 //
164 //
165 //
166 // private boolean handleSingleClass(Class itemClass, Class type, Field field, Class cdmClass, Set<CdmBase> result,CdmBase value, boolean isCollection){
167 // if (! Modifier.isStatic(field.getModifiers())){
168 // String methodName = StringUtils.rightPad(field.getName(), 30);
169 // String className = StringUtils.rightPad(cdmClass.getSimpleName(), 30);
170 // String returnTypeName = StringUtils.rightPad(type.getSimpleName(), 30);
171 //
172 // logger.debug(methodName + "\t\t" + className + "\t\t" + returnTypeName);
173 //// result_old.add(method);
174 // result.addAll(getCdmBasesByFieldAndClass(field, itemClass, cdmClass, value, isCollection));
175 // }
176 // return true;
177 // }
178 //
179 // private Set<Field> getFields(Class clazz){
180 // Set<Field> result = new HashSet<Field>();
181 // for (Field field: clazz.getDeclaredFields()){
182 // if (!Modifier.isStatic(field.getModifiers())){
183 // result.add(field);
184 // }
185 // }
186 // Class superclass = clazz.getSuperclass();
187 // if (CdmBase.class.isAssignableFrom(superclass)){
188 // result.addAll(getFields(superclass));
189 // }
190 // return result;
191 // }
192 //
193 // private Set<CdmBase> getCdmBasesByFieldAndClass(Field field, Class itemClass, Class otherClazz, CdmBase item, boolean isCollection){
194 // Set<CdmBase> result = new HashSet<CdmBase>();
195 // if (isCollection){
196 // result.addAll(genericDao.getCdmBasesWithItemInCollection(itemClass, otherClazz, field.getName(), item));
197 // }else{
198 // result.addAll(genericDao.getCdmBasesByFieldAndClass(otherClazz, field.getName(), item));
199 // }
200 // return result;
201 // }
202
203 public List getHqlResult(String hqlQuery){
204 return genericDao.getHqlResult(hqlQuery);
205 }
206
207 /* (non-Javadoc)
208 * @see eu.etaxonomy.cdm.api.service.ICommonService#merge(eu.etaxonomy.cdm.strategy.merge.IMergable, eu.etaxonomy.cdm.strategy.merge.IMergable, eu.etaxonomy.cdm.strategy.merge.IMergeStragegy)
209 */
210 public <T extends IMergable> void merge(T mergeFirst, T mergeSecond, IMergeStrategy mergeStrategy) throws MergeException {
211 if (mergeStrategy == null){
212 mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
213 }
214 genericDao.merge((CdmBase)mergeFirst, (CdmBase)mergeSecond, mergeStrategy);
215 }
216
217
218 public <T extends IMatchable> List<T> findMatching(T objectToMatch, IMatchStrategy matchStrategy) throws MatchException {
219 if (matchStrategy == null){
220 matchStrategy = DefaultMatchStrategy.NewInstance(((objectToMatch).getClass()));
221 }
222 return genericDao.findMatching(objectToMatch, matchStrategy);
223 }
224
225
226
227 /* (non-Javadoc)
228 * @see eu.etaxonomy.cdm.api.service.IService#list(java.lang.Class, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
229 */
230 public <TYPE extends OriginalSourceBase> Pager<TYPE> list(Class<TYPE> type,
231 Integer pageSize, Integer pageNumber, List<OrderHint> orderHints,
232 List<String> propertyPaths) {
233 logger.warn("Not yet implemented");
234 return null;
235 }
236
237 /* (non-Javadoc)
238 * @see eu.etaxonomy.cdm.api.service.ICommonService#saveAll(java.util.Collection)
239 */
240 @Transactional(readOnly = false)
241 public void saveAllMetaData(Collection<CdmMetaData> metaData) {
242 Iterator<CdmMetaData> iterator = metaData.iterator();
243 while(iterator.hasNext()){
244 CdmMetaData cdmMetaData = iterator.next();
245 genericDao.saveMetaData(cdmMetaData);
246 }
247 }
248
249 /* (non-Javadoc)
250 * @see eu.etaxonomy.cdm.api.service.ICommonService#getCdmMetaData()
251 */
252 public Map<MetaDataPropertyName, CdmMetaData> getCdmMetaData() {
253 Map<MetaDataPropertyName, CdmMetaData> result = new HashMap<MetaDataPropertyName, CdmMetaData>();
254 List<CdmMetaData> metaDataList = genericDao.getMetaData();
255 for (CdmMetaData metaData : metaDataList){
256 MetaDataPropertyName propertyName = metaData.getPropertyName();
257 result.put(propertyName, metaData);
258 }
259 return result;
260 }
261
262
263
264
265 }