Fix specimen retrieval by assignment status
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / TermServiceImpl.java
index c212341d990ce90ded80eca2e844efe44bbeb54d..ab79534fd3eff37adc1bb7b36924f7682a572183 100644 (file)
@@ -15,6 +15,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -28,8 +29,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import eu.etaxonomy.cdm.api.service.UpdateResult.Status;
+import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
 import eu.etaxonomy.cdm.api.service.config.TermDeletionConfigurator;
 import eu.etaxonomy.cdm.api.service.exception.DataChangeNoRollbackException;
+import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
 import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
@@ -85,7 +88,7 @@ public class TermServiceImpl extends IdentifiableServiceBase<DefinedTermBase,IDe
         * @see eu.etaxonomy.cdm.api.service.ITermService#listByTermType(eu.etaxonomy.cdm.model.common.TermType, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
         */
        @Override
-       public List<DefinedTermBase<?>> listByTermType(TermType termType, Integer limit, Integer start,
+       public <T extends DefinedTermBase> List<T> listByTermType(TermType termType, Integer limit, Integer start,
                List<OrderHint> orderHints, List<String> propertyPaths) {
            return dao.listByTermType(termType, limit, start, orderHints, propertyPaths);
        }
@@ -273,10 +276,11 @@ public class TermServiceImpl extends IdentifiableServiceBase<DefinedTermBase,IDe
                        config = new TermDeletionConfigurator();
                }
 //             boolean isInternal = config.isInternal();
-               DeleteResult result = new DeleteResult();
+
                Set<DefinedTermBase> termsToSave = new HashSet<DefinedTermBase>();
-               CdmBase.deproxy(dao.merge(term), DefinedTermBase.class);
 
+               DeleteResult result = isDeletable(term, config);
+               //CdmBase.deproxy(dao.merge(term), DefinedTermBase.class);
                try {
                        //generalization of
                        Set<DefinedTermBase> specificTerms = term.getGeneralizationOf();
@@ -413,4 +417,28 @@ public class TermServiceImpl extends IdentifiableServiceBase<DefinedTermBase,IDe
                super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);
        }
 
+       @Override
+    public DeleteResult isDeletable(DefinedTermBase term, DeleteConfiguratorBase config){
+        DeleteResult result = new DeleteResult();
+        Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(term);
+        if (references != null){
+            result.addRelatedObjects(references);
+            Iterator<CdmBase> iterator = references.iterator();
+            CdmBase ref;
+            while (iterator.hasNext()){
+                ref = iterator.next();
+                if (ref instanceof TermVocabulary){
+                    result.getRelatedObjects().remove(ref);
+                }else{
+
+                    String message = "An object of " + ref.getClass().getName() + " with ID " + ref.getId() + " is referencing the object" ;
+                    result.addException(new ReferencedObjectUndeletableException(message));
+                    result.setAbort();
+                }
+
+            }
+        }
+        return result;
+    }
+
 }