merge trunk into model change 3.6
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / ServiceBase.java
index b9a62e17a67eeb8055bdc4989e095295c66572af..4e494d0f4f490ffdb1333f26945303e53f812548 100644 (file)
@@ -18,13 +18,13 @@ import java.util.Set;
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.hibernate.LockMode;\r
+import org.hibernate.LockOptions;\r
 import org.hibernate.Session;\r
 import org.springframework.context.ApplicationContext;\r
 import org.springframework.context.ApplicationContextAware;\r
+import org.springframework.dao.DataAccessException;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \r
-import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;\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
@@ -44,14 +44,14 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
 \r
     @Override\r
     @Transactional(readOnly = true)\r
-    public void lock(T t, LockMode lockMode) {\r
-        dao.lock(t, lockMode);\r
+    public void lock(T t, LockOptions lockOptions) {\r
+        dao.lock(t, lockOptions);\r
     }\r
 \r
     @Override\r
     @Transactional(readOnly = true)\r
-    public void refresh(T t, LockMode lockMode, List<String> propertyPaths) {\r
-        dao.refresh(t, lockMode, propertyPaths);\r
+    public void refresh(T t, LockOptions lockOptions, List<String> propertyPaths) {\r
+        dao.refresh(t, lockOptions, propertyPaths);\r
     }\r
 \r
     @Override\r
@@ -68,8 +68,15 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
 \r
     @Override\r
     @Transactional(readOnly = false)\r
-    public UUID delete(T persistentObject) throws ReferencedObjectUndeletableException {\r
-        return dao.delete(persistentObject);\r
+    public DeleteResult delete(T persistentObject) {\r
+       DeleteResult result = new DeleteResult();\r
+       try{\r
+               dao.delete(persistentObject);\r
+       } catch(DataAccessException e){\r
+               result.setError();\r
+               result.addException(e);\r
+       }\r
+        return result;\r
     }\r
 \r
     @Override\r
@@ -93,7 +100,13 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
     @Override\r
     @Transactional(readOnly = true)\r
     public T find(UUID uuid) {\r
-        return dao.findByUuid(uuid);\r
+        return uuid == null ? null : dao.findByUuid(uuid);\r
+    }\r
+\r
+    @Override\r
+    @Transactional(readOnly = true)\r
+    public T findWithoutFlush(UUID uuid) {\r
+        return uuid == null ? null : dao.findByUuidWithoutFlush(uuid);\r
     }\r
 \r
     @Override\r
@@ -116,20 +129,20 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
 \r
     @Override\r
     @Transactional(readOnly = true)\r
-    public  List<T> list(Class<? extends T> type, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths){\r
+    public <S extends T> List<S> list(Class<S> type, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths){\r
         return dao.list(type,limit, start, orderHints,propertyPaths);\r
     }\r
 \r
     @Override\r
     @Transactional(readOnly = true)\r
     public T load(UUID uuid) {\r
-        return dao.load(uuid);\r
+        return uuid == null ? null : dao.load(uuid);\r
     }\r
 \r
     @Override\r
     @Transactional(readOnly = true)\r
     public T load(UUID uuid, List<String> propertyPaths){\r
-        return dao.load(uuid, propertyPaths);\r
+        return uuid == null ? null : dao.load(uuid, propertyPaths);\r
     }\r
 \r
     @Override\r
@@ -140,15 +153,15 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
 \r
     @Override\r
     @Transactional(readOnly = true)\r
-    public  Pager<T> page(Class<? extends T> type, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths){\r
+    public  <S extends T> Pager<S> page(Class<S> type, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths){\r
         Integer numberOfResults = dao.count(type);\r
-        List<T> results = new ArrayList<T>();\r
+        List<S> results = new ArrayList<S>();\r
         pageNumber = pageNumber == null ? 0 : pageNumber;\r
         if(numberOfResults > 0) { // no point checking again  //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)\r
             Integer start = pageSize == null ? 0 : pageSize * pageNumber;\r
             results = dao.list(type, pageSize, start, orderHints,propertyPaths);\r
         }\r
-        return new DefaultPagerImpl<T>(pageNumber, numberOfResults, pageSize, results);\r
+        return new DefaultPagerImpl<S>(pageNumber, numberOfResults, pageSize, results);\r
     }\r
 \r
     @Override\r
@@ -213,4 +226,6 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
         return dao.list(example, includeProperties, limit, start, orderHints, propertyPaths);\r
     }\r
 \r
+\r
+\r
 }\r