ref #6072 test missing entity in webservice
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / PolytomousKeyServiceImpl.java
index e1cd6dd5be6622f0093bea3e014340962538c40a..f586e93d8a22f324f4e2c9e0995ccd81598b484d 100644 (file)
 package eu.etaxonomy.cdm.api.service;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Iterator;\r
 import java.util.List;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \r
+import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;\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.AbstractPagerImpl;\r
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.description.PolytomousKey;\r
 import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IIdentificationKeyDao;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IPolytomousKeyDao;\r
-import eu.etaxonomy.cdm.persistence.dao.description.IPolytomousKeyNodeDao;\r
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
 import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;\r
 \r
@@ -36,7 +41,8 @@ public class PolytomousKeyServiceImpl extends IdentifiableServiceBase<Polytomous
 \r
        private IIdentificationKeyDao identificationKeyDao;\r
        private ITaxonDao taxonDao;\r
-       private IPolytomousKeyNodeDao nodeDao;\r
+       @Autowired\r
+       private IPolytomousKeyNodeService nodeService;\r
 \r
 \r
        @Override\r
@@ -55,10 +61,7 @@ public class PolytomousKeyServiceImpl extends IdentifiableServiceBase<Polytomous
                this.taxonDao = taxonDao;\r
        }\r
 \r
-       @Autowired\r
-    protected void setDao(IPolytomousKeyNodeDao nodeDao) {\r
-        this.nodeDao = nodeDao;\r
-    }\r
+\r
 \r
 \r
        /* (non-Javadoc)\r
@@ -153,24 +156,54 @@ public class PolytomousKeyServiceImpl extends IdentifiableServiceBase<Polytomous
 \r
        @Override\r
        public DeleteResult delete(PolytomousKey key){\r
-           DeleteResult result = new DeleteResult();\r
+           //DeleteResult result = new DeleteResult();\r
            PolytomousKeyNode root = key.getRoot();\r
-           key.setRoot(null);\r
-           try{\r
-               nodeDao.delete(root);\r
-           }catch(Exception e){\r
-               result.addException(e);\r
-               result.setAbort();\r
-               return result;\r
+\r
+\r
+           DeleteResult result = isDeletable(key, null);\r
+\r
+           if (result.isOk()){\r
+           try{\r
+               if (root != null){\r
+                   nodeService.delete(root.getUuid(), true);\r
+               }\r
+           }catch(Exception e){\r
+               result.addException(e);\r
+               result.setAbort();\r
+               return result;\r
+           }\r
+           try{\r
+               dao.delete(key);\r
+           }catch(Exception e){\r
+                result.addException(e);\r
+                result.setAbort();\r
+                return result;\r
+            }\r
            }\r
-           try{\r
-               dao.delete(key);\r
-           }catch(Exception e){\r
-            result.addException(e);\r
-            result.setAbort();\r
-            return result;\r
-        }\r
         return result;\r
        }\r
 \r
+       @Override\r
+    public DeleteResult isDeletable(PolytomousKey key, DeleteConfiguratorBase config){\r
+        DeleteResult result = new DeleteResult();\r
+        Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(key);\r
+        if (references != null){\r
+           Iterator<CdmBase> iterator = references.iterator();\r
+           CdmBase ref;\r
+           while (iterator.hasNext()){\r
+               ref = iterator.next();\r
+               if ((ref instanceof PolytomousKeyNode) ){\r
+                   PolytomousKeyNode node = HibernateProxyHelper.deproxy(ref, PolytomousKeyNode.class);\r
+                   if (!node.getKey().equals(key)){\r
+                       String message = "The key is a subkey of " + node.getKey() + ", referenced in node with id: " + node.getId() + ". Please remove the subkey reference first and then delete the key. " ;\r
+                       result.addException(new ReferencedObjectUndeletableException(message));\r
+                       result.setAbort();\r
+                       result.addRelatedObject(ref);\r
+                   }\r
+               }\r
+           }\r
+        }\r
+        return result;\r
+    }\r
+\r
 }\r