e8c78941e0c732d37dafd1de47f967c802315033
[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.hibernate.collection.spi.PersistentCollection;
22 import org.springframework.beans.factory.annotation.Autowired;
23 import org.springframework.stereotype.Service;
24 import org.springframework.transaction.annotation.Transactional;
25
26 import eu.etaxonomy.cdm.model.common.CdmBase;
27 import eu.etaxonomy.cdm.model.common.ISourceable;
28 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
29 import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
30 import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
31 import eu.etaxonomy.cdm.model.metadata.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.strategy.match.DefaultMatchStrategy;
35 import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
36 import eu.etaxonomy.cdm.strategy.match.IMatchable;
37 import eu.etaxonomy.cdm.strategy.match.MatchException;
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 extends ServiceBase<OriginalSourceBase,IOriginalSourceDao> implements ICommonService {
47 @SuppressWarnings("unused")
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 @Override
63 public CdmBase find(Class<? extends CdmBase> clazz, int id){
64 return genericDao.find(clazz, id);
65 }
66
67
68 @Override
69 public Map<String, ? extends ISourceable> getSourcedObjectsByIdInSource(Class clazz, Set<String> idInSourceSet, String idNamespace) {
70 Map<String, ? extends ISourceable> list = originalSourceDao.findOriginalSourcesByIdInSource(clazz, idInSourceSet, idNamespace);
71 return list;
72 }
73
74 @Override
75 public ISourceable getSourcedObjectByIdInSource(Class clazz, String idInSource, String idNamespace) {
76 ISourceable result = null;
77 List<IdentifiableEntity> list = originalSourceDao.findOriginalSourceByIdInSource(clazz, idInSource, idNamespace);
78 if (! list.isEmpty()){
79 result = list.get(0);
80 }return result;
81 }
82
83
84 @Override
85 public Set<CdmBase> getReferencingObjects(CdmBase referencedCdmBase){
86 return this.genericDao.getReferencingObjects(referencedCdmBase);
87 }
88
89
90 @Override
91 public Set<CdmBase> getReferencingObjectsForDeletion(CdmBase referencedCdmBase){
92 return this.genericDao.getReferencingObjectsForDeletion(referencedCdmBase);
93 }
94 // try {
95 // Set<Class<? extends CdmBase>> allCdmClasses = genericDao.getAllCdmClasses(false); //findAllCdmClasses();
96 //
97 // referencedCdmBase = (CdmBase)HibernateProxyHelper.deproxy(referencedCdmBase);
98 // Class referencedClass = referencedCdmBase.getClass();
99 // Set<CdmBase> result = new HashSet<CdmBase>();
100 // logger.debug("Referenced Class: " + referencedClass.getName());
101 //
102 // for (Class<? extends CdmBase> cdmClass : allCdmClasses){
103 // Set<Field> fields = getFields(cdmClass);
104 // for (Field field: fields){
105 // Class<?> type = field.getType();
106 // //class
107 // if (! type.isInterface()){
108 // if (referencedClass.isAssignableFrom(type)||
109 // type.isAssignableFrom(referencedClass) && CdmBase.class.isAssignableFrom(type)){
110 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
111 // }
112 // //interface
113 // }else if (type.isAssignableFrom(referencedClass)){
114 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);
115 // }else if (Collection.class.isAssignableFrom(type)){
116 //
117 // if (checkIsSetOfType(field, referencedClass, type) == true){
118 // handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, true);
119 // }
120 // }
121 //// Class[] interfaces = referencedClass.getInterfaces();
122 //// for (Class interfaze: interfaces){
123 //// if (interfaze == type){
124 ////// if(interfaze.isAssignableFrom(returnType)){
125 //// handleSingleClass(interfaze, type, field, cdmClass, result, referencedCdmBase);
126 //// }
127 //// }
128 // }
129 // }
130 // return result;
131 // } catch (Exception e) {
132 // e.printStackTrace();
133 // throw new RuntimeException(e);
134 // }
135 //
136 // }
137 //
138 // private boolean checkIsSetOfType(Field field, Class referencedClass, Class<?> type){
139 // Type genericType = (ParameterizedTypeImpl)field.getGenericType();
140 // if (genericType instanceof ParameterizedTypeImpl){
141 // ParameterizedTypeImpl paraType = (ParameterizedTypeImpl)genericType;
142 // paraType.getRawType();
143 // Type[] arguments = paraType.getActualTypeArguments();
144 // //logger.debug(arguments.length);
145 // if (arguments.length == 1){
146 // Class collectionClass;
147 // try {
148 // if (arguments[0] instanceof Class){
149 // collectionClass = (Class)arguments[0];
150 // }else if(arguments[0] instanceof TypeVariableImpl){
151 // TypeVariableImpl typeVariable = (TypeVariableImpl)arguments[0];
152 // GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration();
153 // collectionClass = (Class)genericDeclaration;
154 // }else{
155 // logger.warn("Unknown Type");
156 // return false;
157 // }
158 // if (CdmBase.class.isAssignableFrom(collectionClass) && collectionClass.isAssignableFrom(referencedClass) ){
159 // return true;
160 // }
161 // } catch (Exception e) {
162 // logger.warn(e.getMessage());
163 // }
164 // }else{
165 // logger.warn("Length of arguments <> 1");
166 // }
167 // }else{
168 // logger.warn("Not a generic type of type ParameterizedTypeImpl");
169 // }
170 // return false;
171 // }
172 //
173 //
174 //
175 //
176 // private boolean handleSingleClass(Class itemClass, Class type, Field field, Class cdmClass, Set<CdmBase> result,CdmBase value, boolean isCollection){
177 // if (! Modifier.isStatic(field.getModifiers())){
178 // String methodName = StringUtils.rightPad(field.getName(), 30);
179 // String className = StringUtils.rightPad(cdmClass.getSimpleName(), 30);
180 // String returnTypeName = StringUtils.rightPad(type.getSimpleName(), 30);
181 //
182 // logger.debug(methodName + "\t\t" + className + "\t\t" + returnTypeName);
183 //// result_old.add(method);
184 // result.addAll(getCdmBasesByFieldAndClass(field, itemClass, cdmClass, value, isCollection));
185 // }
186 // return true;
187 // }
188 //
189 // private Set<Field> getFields(Class clazz){
190 // Set<Field> result = new HashSet<Field>();
191 // for (Field field: clazz.getDeclaredFields()){
192 // if (!Modifier.isStatic(field.getModifiers())){
193 // result.add(field);
194 // }
195 // }
196 // Class superclass = clazz.getSuperclass();
197 // if (CdmBase.class.isAssignableFrom(superclass)){
198 // result.addAll(getFields(superclass));
199 // }
200 // return result;
201 // }
202 //
203 // private Set<CdmBase> getCdmBasesByFieldAndClass(Field field, Class itemClass, Class otherClazz, CdmBase item, boolean isCollection){
204 // Set<CdmBase> result = new HashSet<CdmBase>();
205 // if (isCollection){
206 // result.addAll(genericDao.getCdmBasesWithItemInCollection(itemClass, otherClazz, field.getName(), item));
207 // }else{
208 // result.addAll(genericDao.getCdmBasesByFieldAndClass(otherClazz, field.getName(), item));
209 // }
210 // return result;
211 // }
212
213 @Override
214 public List getHqlResult(String hqlQuery){
215 return genericDao.getHqlResult(hqlQuery);
216 }
217
218 @Override
219 public <T extends IMergable> void merge(T mergeFirst, T mergeSecond, IMergeStrategy mergeStrategy) throws MergeException {
220 if (mergeStrategy == null){
221 mergeStrategy = DefaultMergeStrategy.NewInstance(((CdmBase)mergeFirst).getClass());
222 }
223 genericDao.merge((CdmBase)mergeFirst, (CdmBase)mergeSecond, mergeStrategy);
224 }
225
226
227 @Override
228 public <T extends IMatchable> List<T> findMatching(T objectToMatch, IMatchStrategy matchStrategy) throws MatchException {
229 if (matchStrategy == null){
230 matchStrategy = DefaultMatchStrategy.NewInstance(((objectToMatch).getClass()));
231 }
232 return genericDao.findMatching(objectToMatch, matchStrategy);
233 }
234
235
236
237 // /* (non-Javadoc)
238 // * @see eu.etaxonomy.cdm.api.service.IService#list(java.lang.Class, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
239 // */
240 // @Override
241 // public <TYPE extends OriginalSourceBase> Pager<TYPE> list(Class<TYPE> type,
242 // Integer pageSize, Integer pageNumber, List<OrderHint> orderHints,
243 // List<String> propertyPaths) {
244 // logger.warn("Not yet implemented");
245 // return null;
246 // }
247
248 @Transactional(readOnly = false)
249 @Override
250 public void saveAllMetaData(Collection<CdmMetaData> metaData) {
251 Iterator<CdmMetaData> iterator = metaData.iterator();
252 while(iterator.hasNext()){
253 CdmMetaData cdmMetaData = iterator.next();
254 genericDao.saveMetaData(cdmMetaData);
255 }
256 }
257
258 @Override
259 public Map<MetaDataPropertyName, CdmMetaData> getCdmMetaData() {
260 Map<MetaDataPropertyName, CdmMetaData> result = new HashMap<MetaDataPropertyName, CdmMetaData>();
261 List<CdmMetaData> metaDataList = genericDao.getMetaData();
262 for (CdmMetaData metaData : metaDataList){
263 MetaDataPropertyName propertyName = metaData.getPropertyName();
264 result.put(propertyName, metaData);
265 }
266 return result;
267 }
268
269 @Override
270 public PersistentCollection initializeCollection(PersistentCollection col) {
271 return genericDao.initializeCollection(col);
272
273 }
274
275 @Override
276 public boolean isEmpty(PersistentCollection col) {
277 return genericDao.isEmpty(col);
278
279 }
280
281 @Override
282 public int size(PersistentCollection col) {
283 return genericDao.size(col);
284 }
285
286 @Override
287 public Object get(PersistentCollection col, int index) {
288 return genericDao.get(col, index);
289 }
290
291 @Override
292 public boolean contains(PersistentCollection col, Object element) {
293 return genericDao.contains(col, element);
294 }
295
296 @Override
297 public boolean containsKey(PersistentCollection col, Object key) {
298 return genericDao.containsKey(col, key);
299 }
300
301 @Override
302 public boolean containsValue(PersistentCollection col, Object element) {
303 return genericDao.containsValue(col, element);
304 }
305
306
307 }