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