configurable bean initialization methods
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / ServiceBase.java
index 272562bde5522119547238faab41fc2f4472869c..36cebd38bc212036e5d4268c73878c755a737df9 100644 (file)
@@ -1,3 +1,4 @@
+// $Id$\r
 /**\r
 * Copyright (C) 2007 EDIT\r
 * European Distributed Institute of Taxonomy \r
@@ -9,6 +10,7 @@
 \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
@@ -17,25 +19,31 @@ import java.util.Map;
 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
@@ -44,36 +52,65 @@ public abstract class ServiceBase<T extends CdmBase> implements IService<T>, App
                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
@@ -90,15 +127,97 @@ public abstract class ServiceBase<T extends CdmBase> implements IService<T>, App
                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