+// $Id$\r
/**\r
* Copyright (C) 2007 EDIT\r
* European Distributed Institute of Taxonomy \r
\r
package eu.etaxonomy.cdm.api.service;\r
\r
+import java.util.ArrayList;\r
import java.util.Collection;\r
import java.util.HashMap;\r
import java.util.Iterator;\r
import java.util.UUID;\r
\r
import org.apache.log4j.Logger;\r
+import org.springframework.beans.factory.annotation.Qualifier;\r
import org.springframework.context.ApplicationContext;\r
import org.springframework.context.ApplicationContextAware;\r
+import org.springframework.transaction.TransactionStatus;\r
import org.springframework.transaction.annotation.Transactional;\r
\r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
+import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
\r
-\r
-public abstract class ServiceBase<T extends CdmBase> implements IService<T>, ApplicationContextAware {\r
- static Logger logger = Logger.getLogger(ServiceBase.class);\r
+public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T>> implements IService<T>, ApplicationContextAware {\r
+ private static final Logger logger = Logger.getLogger(ServiceBase.class);\r
\r
//flush after saving this number of objects\r
int flushAfterNo = 2000;\r
protected ApplicationContext appContext;\r
- protected ICdmEntityDao<T> dao;\r
- \r
- protected void setEntityDao(ICdmEntityDao<T> dao){\r
- this.dao=dao;\r
- }\r
+\r
+ @Qualifier("baseDao")\r
+ protected DAO dao;\r
+\r
+ protected abstract void setDao(DAO dao);\r
\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.cdm.api.service.Iyyy#setApplicationContext(org.springframework.context.ApplicationContext)\r
this.appContext = appContext;\r
}\r
\r
- protected T getCdmObjectByUuid(UUID uuid){\r
+ public T getCdmObjectByUuid(UUID uuid) {\r
return dao.findByUuid(uuid);\r
}\r
\r
-\r
- public int count(Class<T> clazz) {\r
+ @Transactional(readOnly = true)\r
+ public <TYPE extends T> int count(Class<TYPE> clazz) {\r
return dao.count(clazz);\r
}\r
+ \r
+ @Transactional(readOnly = true)\r
+ public int count() {\r
+ return dao.count();\r
+ }\r
\r
+ /**\r
+ * FIXME harmonise with saveOrUpdate\r
+ * @param cdmObj\r
+ * @return\r
+ */\r
@Transactional(readOnly = false)\r
protected UUID saveCdmObject(T cdmObj){\r
if (logger.isDebugEnabled()){logger.debug("Save cdmObj: " + (cdmObj == null? null: cdmObj.toString()));}\r
return dao.saveOrUpdate(cdmObj);\r
}\r
+ \r
\r
+ /**\r
+ * FIXME harmonise with saveOrUpdate\r
+ * @param cdmObj\r
+ * @return\r
+ */\r
@Transactional(readOnly = false)\r
- protected <S extends T> Map<UUID, S> saveCdmObjectAll(Collection<S> cdmObjCollection){\r
+ protected UUID saveCdmObject(T cdmObj, TransactionStatus txStatus){\r
+ // TODO: Implement with considering txStatus\r
+ if (logger.isDebugEnabled()){logger.debug("Save cdmObj: " + (cdmObj == null? null: cdmObj.toString()));}\r
+ return dao.saveOrUpdate(cdmObj);\r
+ }\r
+ \r
+ /**\r
+ * FIXME harmonise with saveAll\r
+ * @param <S>\r
+ * @param cdmObjCollection\r
+ * @return\r
+ */\r
+ @Transactional(readOnly = false)\r
+ protected <S extends T> Map<UUID, S> saveCdmObjectAll(Collection<? extends S> cdmObjCollection){\r
int types = cdmObjCollection.getClass().getTypeParameters().length;\r
if (types > 0){\r
if (logger.isDebugEnabled()){logger.debug("ClassType: + " + cdmObjCollection.getClass().getTypeParameters()[0]);}\r
}\r
\r
Map<UUID, S> resultMap = new HashMap<UUID, S>();\r
- Iterator<S> iterator = cdmObjCollection.iterator();\r
+ Iterator<? extends S> iterator = cdmObjCollection.iterator();\r
int i = 0;\r
while(iterator.hasNext()){\r
if ( ( (i % 5000) == 0) && (i > 0) ){logger.debug("Saved " + i + " objects" );}\r
S cdmObj = iterator.next();\r
UUID uuid = saveCdmObject(cdmObj);\r
- if (logger.isDebugEnabled()){logger.debug("Save cdmObj: " + (cdmObj == null? null: cdmObj.toString()));}\r
+// if (logger.isDebugEnabled()){logger.debug("Save cdmObj: " + (cdmObj == null? null: cdmObj.toString()));}\r
resultMap.put(uuid, cdmObj);\r
i++;\r
if ( (i % flushAfterNo) == 0){\r
if ( logger.isInfoEnabled() ){logger.info("Saved " + i + " objects" );}\r
return resultMap;\r
}\r
+\r
+ @Transactional(readOnly = false)\r
+ public UUID delete(T persistentObject) {\r
+ return dao.delete(persistentObject);\r
+ }\r
+\r
+ @Transactional(readOnly = true)\r
+ public boolean exists(UUID uuid) {\r
+ return dao.exists(uuid);\r
+ }\r
+\r
+ @Transactional(readOnly = true)\r
+ public T findByUuid(UUID uuid) {\r
+ return dao.findByUuid(uuid);\r
+ }\r
+ \r
+ @Transactional(readOnly = true)\r
+ public T load(UUID uuid) {\r
+ return dao.load(uuid);\r
+ }\r
+ \r
+ @Transactional(readOnly = true)\r
+ public T load(UUID uuid, List<String> propertyPaths){\r
+ return dao.load(uuid, propertyPaths);\r
+ }\r
+ \r
+\r
+ @Transactional(readOnly = true)\r
+ public <TYPE extends T> List<TYPE> list(Class<TYPE> type, int limit,int start) {\r
+ return dao.list(type, limit, start);\r
+ }\r
+ \r
+ @Transactional(readOnly = true)\r
+ public Pager<T> list(Integer pageSize, Integer pageNumber){\r
+ return list(pageSize, pageNumber, null);\r
+ }\r
+ \r
+ @Transactional (readOnly = true)\r
+ public Pager<T> list(Integer pageSize, Integer pageNumber, List<OrderHint> orderHints){\r
+ Integer numberOfResults = dao.count();\r
+ List<T> results = new ArrayList<T>();\r
+ if(numberOfResults > 0) { // no point checking again\r
+ Integer start = pageSize == null ? 0 : pageSize * (pageNumber - 1);\r
+ results = dao.list(pageSize, start, orderHints);\r
+ }\r
+ return new DefaultPagerImpl<T>(pageNumber, numberOfResults, pageSize, results);\r
+ }\r
+\r
+ @Transactional(readOnly = false)\r
+ public UUID save(T newInstance) {\r
+ return dao.save(newInstance);\r
+ }\r
\r
+ @Transactional(readOnly = false)\r
+ public Map<UUID, T> saveAll(Collection<T> newInstances) {\r
+ return dao.saveAll(newInstances);\r
+ }\r
+\r
+ @Transactional(readOnly = false)\r
+ public UUID saveOrUpdate(T transientObject) {\r
+ return dao.saveOrUpdate(transientObject);\r
+ }\r
+\r
+ @Transactional(readOnly = false)\r
+ public UUID update(T transientObject) {\r
+ return dao.update(transientObject);\r
+ }\r
+\r
+ @Transactional(readOnly = true)\r
+ public UUID refresh(T persistentObject) {\r
+ return dao.refresh(persistentObject);\r
+ }\r
+ \r
+ /**\r
+ * FIXME harmonise with delete()\r
+ * @param cdmObj\r
+ * @return\r
+ */\r
@Transactional(readOnly = false)\r
protected UUID removeCdmObject(T cdmObj){\r
if (logger.isDebugEnabled()){logger.debug("Save cdmObj: " + (cdmObj == null? null: cdmObj.toString()));}\r
return dao.delete(cdmObj);\r
}\r
\r
- protected List<T> list(int limit, int start) {\r
+ @Transactional(readOnly = true)\r
+ public List<T> list(int limit, int start) {\r
return dao.list(limit, start);\r
}\r
\r
+ @Transactional(readOnly = true)\r
+ public List<T> rows(String tableName, int limit, int start) {\r
+ return dao.rows(tableName, limit, start);\r
+ }\r
}\r