better use of generics in service layer and persistence list methods
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / TaxonServiceImpl.java
index 57df43331362d275290ede14c0ba8edb2ea2a812..d4c1b5942c902cb8701cb0f6bb9366099e605c73 100644 (file)
@@ -21,6 +21,8 @@ import java.util.Map;
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
+import javax.persistence.EntityNotFoundException;\r
+\r
 import org.apache.log4j.Logger;\r
 import org.apache.lucene.index.CorruptIndexException;\r
 import org.apache.lucene.queryParser.ParseException;\r
@@ -35,6 +37,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 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.config.IFindTaxaAndNamesConfigurator;\r
 import eu.etaxonomy.cdm.api.service.config.MatchingTaxonConfigurator;\r
 import eu.etaxonomy.cdm.api.service.config.SynonymDeletionConfigurator;\r
@@ -91,6 +94,7 @@ import eu.etaxonomy.cdm.model.molecular.DnaSample;
 import eu.etaxonomy.cdm.model.molecular.Sequence;\r
 import eu.etaxonomy.cdm.model.molecular.SingleRead;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
@@ -113,6 +117,7 @@ import eu.etaxonomy.cdm.persistence.dao.common.IOrderedTermVocabularyDao;
 import eu.etaxonomy.cdm.persistence.dao.initializer.AbstractBeanInitializer;\r
 import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;\r
 import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;\r
+import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;\r
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
 import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;\r
 import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
@@ -147,7 +152,6 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
     @Autowired\r
     private ITaxonNodeService nodeService;\r
 \r
-\r
     @Autowired\r
     private ICdmGenericDao genericDao;\r
 \r
@@ -160,6 +164,9 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
     @Autowired\r
     private IOccurrenceDao occurrenceDao;\r
 \r
+    @Autowired\r
+    private IClassificationDao classificationDao;\r
+\r
     @Autowired\r
     private AbstractBeanInitializer beanInitializer;\r
 \r
@@ -182,28 +189,6 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         return dao.getTaxaByName(name, sec);\r
     }\r
 \r
-    /**\r
-     * FIXME Candidate for harmonization\r
-     * list(Synonym.class, ...)\r
-     *  (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.api.service.ITaxonService#getAllSynonyms(int, int)\r
-     */\r
-    @Override\r
-    public List<Synonym> getAllSynonyms(int limit, int start) {\r
-        return dao.getAllSynonyms(limit, start);\r
-    }\r
-\r
-    /**\r
-     * FIXME Candidate for harmonization\r
-     * list(Taxon.class, ...)\r
-     *  (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.api.service.ITaxonService#getAllTaxa(int, int)\r
-     */\r
-    @Override\r
-    public List<Taxon> getAllTaxa(int limit, int start) {\r
-        return dao.getAllTaxa(limit, start);\r
-    }\r
-\r
     /**\r
      * FIXME Candidate for harmonization\r
      * merge with getRootTaxa(Reference sec, ..., ...)\r
@@ -218,18 +203,11 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         return dao.getRootTaxa(sec, cdmFetch, onlyWithChildren, false);\r
     }\r
 \r
-\r
-    /* (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.name.Rank, eu.etaxonomy.cdm.model.reference.Reference, boolean, boolean)\r
-     */\r
     @Override\r
     public List<Taxon> getRootTaxa(Rank rank, Reference sec, boolean onlyWithChildren,boolean withMisapplications, List<String> propertyPaths) {\r
         return dao.getRootTaxa(rank, sec, null, onlyWithChildren, withMisapplications, propertyPaths);\r
     }\r
 \r
-    /* (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.api.service.ITaxonService#getAllRelationships(int, int)\r
-     */\r
     @Override\r
     public List<RelationshipBase> getAllRelationships(int limit, int start){\r
         return dao.getAllRelationships(limit, start);\r
@@ -296,10 +274,12 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
 \r
         SynonymRelationshipType relTypeForGroup = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
         List<Synonym> heteroSynonyms = acceptedTaxon.getSynonymsInGroup(synonymHomotypicGroup);\r
+        Set<NameRelationship> basionymsAndReplacedSynonyms = synonymHomotypicGroup.getBasionymAndReplacedSynonymRelations();\r
 \r
         for (Synonym heteroSynonym : heteroSynonyms){\r
             if (synonym.equals(heteroSynonym)){\r
                 acceptedTaxon.removeSynonym(heteroSynonym, false);\r
+\r
             }else{\r
                 //move synonyms in same homotypic group to new accepted taxon\r
                 heteroSynonym.replaceAcceptedTaxon(newAcceptedTaxon, relTypeForGroup, copyCitationInfo, citation, microCitation);\r
@@ -312,7 +292,9 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
 //                     deleteSynonym(synonym, taxon, false);\r
             try {\r
                 this.dao.flush();\r
-                this.deleteSynonym(synonym, acceptedTaxon, new SynonymDeletionConfigurator());\r
+                SynonymDeletionConfigurator config = new SynonymDeletionConfigurator();\r
+                config.setDeleteNameIfPossible(false);\r
+                this.deleteSynonym(synonym, acceptedTaxon, config);\r
 \r
             } catch (Exception e) {\r
                 logger.info("Can't delete old synonym from database");\r
@@ -329,9 +311,9 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         // Get name from synonym\r
         TaxonNameBase<?, ?> synonymName = synonym.getName();\r
 \r
-        // remove synonym from taxon\r
+      /*  // remove synonym from taxon\r
         toTaxon.removeSynonym(synonym);\r
-\r
+*/\r
         // Create a taxon with synonym name\r
         Taxon fromTaxon = Taxon.NewInstance(synonymName, null);\r
 \r
@@ -340,7 +322,8 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
 \r
         // since we are swapping names, we have to detach the name from the synonym completely.\r
         // Otherwise the synonym will still be in the list of typified names.\r
-        synonym.getName().removeTaxonBase(synonym);\r
+       // synonym.getName().removeTaxonBase(synonym);\r
+        this.deleteSynonym(synonym, null);\r
 \r
         return fromTaxon;\r
     }\r
@@ -514,6 +497,50 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         return new DefaultPagerImpl<TaxonRelationship>(pageNumber, numberOfResults, pageSize, results);\r
     }\r
 \r
+    @Override\r
+    public List<Taxon> listAcceptedTaxaFor(UUID synonymUuid, UUID classificationUuid, Integer pageSize, Integer pageNumber,\r
+            List<OrderHint> orderHints, List<String> propertyPaths){\r
+        return pageAcceptedTaxaFor(synonymUuid, classificationUuid, pageSize, pageNumber, orderHints, propertyPaths).getRecords();\r
+    }\r
+\r
+    @Override\r
+    public Pager<Taxon> pageAcceptedTaxaFor(UUID synonymUuid, UUID classificationUuid, Integer pageSize, Integer pageNumber,\r
+            List<OrderHint> orderHints, List<String> propertyPaths){\r
+\r
+        List<Taxon> list = new ArrayList<Taxon>();\r
+        Long count = 0l;\r
+\r
+        Synonym synonym = null;\r
+\r
+        try {\r
+            synonym = (Synonym) dao.load(synonymUuid);\r
+        } catch (ClassCastException e){\r
+            throw new EntityNotFoundException("The TaxonBase entity referenced by " + synonymUuid + " is not a Synonmy");\r
+        } catch (NullPointerException e){\r
+            throw new EntityNotFoundException("No TaxonBase entity found for " + synonymUuid);\r
+        }\r
+\r
+        Classification classificationFilter = null;\r
+        if(classificationUuid != null){\r
+            try {\r
+            classificationFilter = classificationDao.load(classificationUuid);\r
+            } catch (NullPointerException e){\r
+                throw new EntityNotFoundException("No Classification entity found for " + classificationUuid);\r
+            }\r
+            if(classificationFilter == null){\r
+\r
+            }\r
+        }\r
+\r
+        count = dao.countAcceptedTaxaFor(synonym, classificationFilter) ;\r
+        if(count > (pageSize * pageNumber)){\r
+            list = dao.listAcceptedTaxaFor(synonym, classificationFilter, pageSize, pageNumber, orderHints, propertyPaths);\r
+        }\r
+\r
+        return new DefaultPagerImpl<Taxon>(pageNumber, count.intValue(), pageSize, list);\r
+    }\r
+\r
+\r
     /**\r
      * @param taxon\r
      * @param includeRelationships\r
@@ -980,11 +1007,14 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
      * @see eu.etaxonomy.cdm.api.service.ITaxonService#deleteTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator)\r
      */\r
     @Override\r
-    public UUID deleteTaxon(Taxon taxon, TaxonDeletionConfigurator config, Classification classification) throws DataChangeNoRollbackException {\r
+    public String deleteTaxon(Taxon taxon, TaxonDeletionConfigurator config, Classification classification)  {\r
         if (config == null){\r
             config = new TaxonDeletionConfigurator();\r
         }\r
-\r
+        \r
+        List<String> referencedObjects = isDeletable(taxon, config);\r
+        \r
+        if (referencedObjects.isEmpty()){\r
             // --- DeleteSynonymRelations\r
             if (config.isDeleteSynonymRelations()){\r
                 boolean removeSynonymNameFromHomotypicalGroup = false;\r
@@ -1019,7 +1049,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                 if (taxon.getTaxonRelations().size() > 0){\r
                     String message = "Taxon can't be deleted as it is related to another taxon. " +\r
                             "Remove taxon from all relations to other taxa prior to deletion.";\r
-                    throw new ReferencedObjectUndeletableException(message);\r
+                   // throw new ReferencedObjectUndeletableException(message);\r
                 }\r
             } else{\r
                 for (TaxonRelationship taxRel: taxon.getTaxonRelations()){\r
@@ -1058,7 +1088,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                     if (desc.getDescribedSpecimenOrObservation() != null){\r
                         String message = "Taxon can't be deleted as it is used in a TaxonDescription" +\r
                                 " which also describes specimens or abservations";\r
-                        throw new ReferencedObjectUndeletableException(message);\r
+                        //throw new ReferencedObjectUndeletableException(message);\r
                     }\r
                     removeDescriptions.add(desc);\r
                     descriptionService.delete(desc);\r
@@ -1070,17 +1100,17 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
             }\r
 \r
 \r
-            //check references with only reverse mapping\r
+         /*   //check references with only reverse mapping\r
         String message = checkForReferences(taxon);\r
         if (message != null){\r
-            throw new ReferencedObjectUndeletableException(message.toString());\r
-        }\r
+            //throw new ReferencedObjectUndeletableException(message.toString());\r
+        }*/\r
 \r
          if (! config.isDeleteTaxonNodes() || (!config.isDeleteInAllClassifications() && classification == null )){\r
-                if (taxon.getTaxonNodes().size() > 0){\r
-                    message = "Taxon can't be deleted as it is used in a classification node. Remove taxon from all classifications prior to deletion or define a classification where it should be deleted or adapt the taxon deletion configurator.";\r
-                    throw new ReferencedObjectUndeletableException(message);\r
-                }\r
+                //if (taxon.getTaxonNodes().size() > 0){\r
+                   // message = "Taxon can't be deleted as it is used in a classification node. Remove taxon from all classifications prior to deletion or define a classification where it should be deleted or adapt the taxon deletion configurator.";\r
+                   // throw new ReferencedObjectUndeletableException(message);\r
+                //}\r
             }else{\r
                 if (taxon.getTaxonNodes().size() != 0){\r
                     Set<TaxonNode> nodes = taxon.getTaxonNodes();\r
@@ -1105,8 +1135,8 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                             success =taxon.removeTaxonNode(node, deleteChildren);\r
                             nodeService.delete(node);\r
                         } else {\r
-                            message = "Taxon is not used in defined classification";\r
-                            throw new DataChangeNoRollbackException(message);\r
+                           // message = "Taxon is not used in defined classification";\r
+                           // throw new DataChangeNoRollbackException(message);\r
                         }\r
                     } else if (config.isDeleteInAllClassifications()){\r
                         Set<ITaxonTreeNode> nodesList = new HashSet<ITaxonTreeNode>();\r
@@ -1144,8 +1174,8 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                         nodeService.deleteTaxonNodes(nodesList, config);\r
                     }\r
                     if (!success){\r
-                         message = "The taxon node could not be deleted.";\r
-                        throw new DataChangeNoRollbackException(message);\r
+                        // message = "The taxon node could not be deleted.";\r
+                        //throw new DataChangeNoRollbackException(message);\r
                     }\r
                 }\r
             }\r
@@ -1156,22 +1186,19 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
              boolean usedInPolytomousKey = checkForPolytomousKeys(taxon);\r
             //TaxonNameBase\r
             if (config.isDeleteNameIfPossible()){\r
-                try {\r
+                \r
 \r
                     //TaxonNameBase name = nameService.find(taxon.getName().getUuid());\r
                     TaxonNameBase name = (TaxonNameBase)HibernateProxyHelper.deproxy(taxon.getName());\r
                     //check whether taxon will be deleted or not\r
-                    if ((taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0) && name != null && !usedInPolytomousKey){\r
+                    if ((taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0) && name != null ){\r
                         taxon = (Taxon) HibernateProxyHelper.deproxy(taxon);\r
                         name.removeTaxonBase(taxon);\r
                         nameService.save(name);\r
-                        nameService.delete(name, config.getNameDeletionConfig());\r
+                        String uuidString = nameService.delete(name, config.getNameDeletionConfig());\r
+                        logger.debug(uuidString);\r
                     }\r
-                } catch (ReferencedObjectUndeletableException e) {\r
-                    //do nothing\r
-                    if (logger.isDebugEnabled()){logger.debug("Name could not be deleted");}\r
-\r
-                }\r
+                \r
             }\r
 \r
 //             TaxonDescription\r
@@ -1191,19 +1218,16 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
     }\r
                     }\r
                 }*/\r
-\r
-            if ((taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0) && !usedInPolytomousKey ){\r
-                dao.delete(taxon);\r
-                return taxon.getUuid();\r
-            } else if (usedInPolytomousKey){\r
-                return null;\r
-            }else{\r
-                message = "Taxon can't be deleted as it is used in another Taxonnode";\r
-                if (!config.isDeleteInAllClassifications() && classification != null) {\r
-                    message += "The Taxonnode in " + classification.getTitleCache() + " was deleted.";\r
-                }\r
-                throw new ReferencedObjectUndeletableException(message);\r
+        \r
+            if ((taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0)  ){\r
+                UUID uuid = dao.delete(taxon);\r
+                return uuid.toString();\r
+            } else {\r
+               return "The Taxon can't be deleted.";\r
             }\r
+        }else {\r
+                return referencedObjects.toString();\r
+        }\r
 \r
 \r
     }\r
@@ -1264,8 +1288,8 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
      */\r
     @Transactional(readOnly = false)\r
     @Override\r
-    public void deleteSynonym(Synonym synonym, SynonymDeletionConfigurator config) {\r
-        deleteSynonym(synonym, null, config);\r
+    public String deleteSynonym(Synonym synonym, SynonymDeletionConfigurator config) {\r
+        return deleteSynonym(synonym, null, config);\r
 \r
     }\r
 \r
@@ -1275,49 +1299,57 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
      */\r
     @Transactional(readOnly = false)\r
     @Override\r
-    public void deleteSynonym(Synonym synonym, Taxon taxon, SynonymDeletionConfigurator config) {\r
+    public String deleteSynonym(Synonym synonym, Taxon taxon, SynonymDeletionConfigurator config) {\r
         if (synonym == null){\r
-            return;\r
+            return null;\r
         }\r
+        \r
         if (config == null){\r
             config = new SynonymDeletionConfigurator();\r
         }\r
-        synonym = CdmBase.deproxy(dao.merge(synonym), Synonym.class);\r
-\r
-        //remove synonymRelationship\r
-        Set<Taxon> taxonSet = new HashSet<Taxon>();\r
-        if (taxon != null){\r
-            taxonSet.add(taxon);\r
+        List<String> messages = isDeletable(synonym, config);\r
+        if (messages.isEmpty()){\r
+               synonym = CdmBase.deproxy(dao.merge(synonym), Synonym.class);\r
+       \r
+               //remove synonymRelationship\r
+               Set<Taxon> taxonSet = new HashSet<Taxon>();\r
+               if (taxon != null){\r
+                   taxonSet.add(taxon);\r
+               }else{\r
+                   taxonSet.addAll(synonym.getAcceptedTaxa());\r
+               }\r
+               for (Taxon relatedTaxon : taxonSet){\r
+       //                      dao.deleteSynonymRelationships(synonym, relatedTaxon);\r
+                   relatedTaxon.removeSynonym(synonym, config.isNewHomotypicGroupIfNeeded());\r
+               }\r
+               this.saveOrUpdate(synonym);\r
+       \r
+               //TODO remove name from homotypical group?\r
+       \r
+               //remove synonym (if necessary)\r
+       \r
+               UUID uuid = null;\r
+               if (synonym.getSynonymRelations().isEmpty()){\r
+                   TaxonNameBase<?,?> name = synonym.getName();\r
+                   synonym.setName(null);\r
+                   uuid = dao.delete(synonym);\r
+       \r
+                   //remove name if possible (and required)\r
+                   if (name != null && config.isDeleteNameIfPossible()){\r
+                       \r
+                           nameService.delete(name, config.getNameDeletionConfig());\r
+                       \r
+                   }\r
+                   \r
+               }else {\r
+                       return null;\r
+               }\r
+               return uuid.toString();\r
         }else{\r
-            taxonSet.addAll(synonym.getAcceptedTaxa());\r
-        }\r
-        for (Taxon relatedTaxon : taxonSet){\r
-//                     dao.deleteSynonymRelationships(synonym, relatedTaxon);\r
-            relatedTaxon.removeSynonym(synonym, config.isNewHomotypicGroupIfNeeded());\r
-        }\r
-        this.saveOrUpdate(synonym);\r
-\r
-        //TODO remove name from homotypical group?\r
-\r
-        //remove synonym (if necessary)\r
-\r
-\r
-        if (synonym.getSynonymRelations().isEmpty()){\r
-            TaxonNameBase<?,?> name = synonym.getName();\r
-            synonym.setName(null);\r
-            dao.delete(synonym);\r
-\r
-            //remove name if possible (and required)\r
-            if (name != null && config.isDeleteNameIfPossible()){\r
-                try{\r
-                    nameService.delete(name, config.getNameDeletionConfig());\r
-                }catch (ReferencedObjectUndeletableException ex){\r
-                    if (logger.isDebugEnabled()) {\r
-                        logger.debug("Name wasn't deleted as it is referenced");\r
-                    }\r
-                }\r
-            }\r
+               return messages.toString();\r
         }\r
+        \r
+     \r
     }\r
 \r
 \r
@@ -2970,6 +3002,126 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         return list;\r
     }\r
 \r
+    @Override\r
+    public Synonym changeRelatedTaxonToSynonym(Taxon fromTaxon, Taxon toTaxon, TaxonRelationshipType oldRelationshipType,\r
+            SynonymRelationshipType synonymRelationshipType) throws DataChangeNoRollbackException {\r
+        // Create new synonym using concept name\r
+                TaxonNameBase<?, ?> synonymName = fromTaxon.getName();\r
+                Synonym synonym = Synonym.NewInstance(synonymName, fromTaxon.getSec());\r
+\r
+                // Remove concept relation from taxon\r
+                toTaxon.removeTaxon(fromTaxon, oldRelationshipType);\r
+\r
+\r
+\r
+\r
+                // Create a new synonym for the taxon\r
+                SynonymRelationship synonymRelationship;\r
+                if (synonymRelationshipType != null\r
+                        && synonymRelationshipType.equals(SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF())){\r
+                    synonymRelationship = toTaxon.addHomotypicSynonym(synonym, null, null);\r
+                } else{\r
+                    synonymRelationship = toTaxon.addHeterotypicSynonymName(synonymName);\r
+                }\r
+\r
+                this.saveOrUpdate(toTaxon);\r
+                //TODO: configurator and classification\r
+                this.deleteTaxon(fromTaxon, null, null);\r
+                return synonymRelationship.getSynonym();\r
+\r
+    }\r
+    @Override\r
+    public List<String> isDeletable(TaxonBase taxonBase, DeleteConfiguratorBase config){\r
+       List<String> result = new ArrayList<String>();\r
+       Set<CdmBase> references = commonService.getReferencingObjects(taxonBase);\r
+       if (taxonBase instanceof Taxon){\r
+               TaxonDeletionConfigurator taxonConfig = (TaxonDeletionConfigurator) config;\r
+               result = isDeletableForTaxon(references, taxonConfig);\r
+       }else{\r
+               SynonymDeletionConfigurator synonymConfig = (SynonymDeletionConfigurator) config;\r
+               result = isDeletableForSynonym(references, synonymConfig);\r
+       }\r
+       return result;\r
+    }\r
+    \r
+    private List<String> isDeletableForSynonym(Set<CdmBase> references, SynonymDeletionConfigurator config){\r
+       String message;\r
+       List<String> result = new ArrayList<String>();\r
+       for (CdmBase ref: references){\r
+               if (!(ref instanceof SynonymRelationship || ref instanceof Taxon || ref instanceof TaxonNameBase)){\r
+                       message = "The Synonym can't be deleted as long as it is referenced by " + ref.getClass().getSimpleName() + " with id "+ ref.getId();\r
+                       result.add(message);\r
+               }\r
+       }\r
+       \r
+       return result;\r
+    }\r
+    private List<String> isDeletableForTaxon(Set<CdmBase> references, TaxonDeletionConfigurator config){\r
+       String message;\r
+       List<String> result = new ArrayList<String>();\r
+       for (CdmBase ref: references){\r
+               if (!(ref instanceof TaxonNameBase)){\r
+                       if (!config.isDeleteSynonymRelations() && (ref instanceof SynonymRelationship)){\r
+                               message = "The Taxon can't be deleted as long as it has synonyms.";\r
+                               result.add(message);\r
+                       }\r
+                       if (!config.isDeleteDescriptions() && (ref instanceof DescriptionBase)){\r
+                               message = "The Taxon can't be deleted as long as it has factual data.";\r
+                               result.add(message);\r
+                       }\r
+                       \r
+                       if (!config.isDeleteTaxonNodes() && (ref instanceof TaxonNode)){\r
+                               message = "The Taxon can't be deleted as long as it belongs to a taxon node.";\r
+                               result.add(message);\r
+                       }\r
+                       if (!config.isDeleteTaxonRelationships() && (ref instanceof TaxonNode)){\r
+                               if (!config.isDeleteMisappliedNamesAndInvalidDesignations() && (((TaxonRelationship)ref).getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())|| ((TaxonRelationship)ref).getType().equals(TaxonRelationshipType.INVALID_DESIGNATION_FOR()))){\r
+                                       message = "The Taxon can't be deleted as long as it has misapplied names or invalid designations.";\r
+                                       result.add(message);\r
+                               } else{\r
+                                       message = "The Taxon can't be deleted as long as it belongs to a taxon node.";\r
+                                       result.add(message);\r
+                               }\r
+                       }\r
+                       if (ref instanceof PolytomousKeyNode){\r
+                               message = "The Taxon can't be deleted as long as it is referenced by a polytomous key node.";\r
+                               result.add(message);\r
+                       }\r
+                       \r
+                       if (HibernateProxyHelper.isInstanceOf(ref, IIdentificationKey.class)){\r
+                   message = "Taxon can't be deleted as it is used in an identification key. Remove from identification key prior to deleting this name";\r
+                   result.add(message);\r
+                   \r
+                }\r
+\r
+\r
+               /* //PolytomousKeyNode\r
+                if (referencingObject.isInstanceOf(PolytomousKeyNode.class)){\r
+                    String message = "Taxon" + taxon.getTitleCache() + " can't be deleted as it is used in polytomous key node";\r
+                    return message;\r
+                }*/\r
+\r
+                //TaxonInteraction\r
+                if (ref.isInstanceOf(TaxonInteraction.class)){\r
+                    message = "Taxon can't be deleted as it is used in taxonInteraction#taxon2";\r
+                    result.add(message);\r
+                }\r
+\r
+              //TaxonInteraction\r
+                if (ref.isInstanceOf(DeterminationEvent.class)){\r
+                    message = "Taxon can't be deleted as it is used in a determination event";\r
+                    result.add(message);\r
+                }\r
+\r
+            }\r
+\r
+       }\r
+       \r
+       return result;\r
+    }\r
+\r
 \r
 \r
-}\r
+\r
+\r
+    }\r