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