Fix specimen retrieval by assignment status
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / TermServiceImpl.java
index a2324dda0fea4aca95a4b76a0b2842df452665a9..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);
        }
@@ -97,7 +100,12 @@ public class TermServiceImpl extends IdentifiableServiceBase<DefinedTermBase,IDe
 
        @Override
        public Language getLanguageByIso(String iso639) {
-               return dao.getLanguageByIso(iso639);
+           return dao.getLanguageByIso(iso639);
+       }
+
+       @Override
+       public Language getLanguageByLabel(String label) {
+           return Language.getLanguageByLabel(label);
        }
 
        @Override
@@ -251,16 +259,28 @@ public class TermServiceImpl extends IdentifiableServiceBase<DefinedTermBase,IDe
                return result;
        }
 
+       @Override
+       @Deprecated
+       @Transactional(readOnly = false)
+       public DeleteResult delete(UUID termUuid){
+           DeleteResult result = new DeleteResult();
+
+           TermDeletionConfigurator defaultConfig = new TermDeletionConfigurator();
+           result = delete(dao.load(termUuid), defaultConfig);
+           return result;
+       }
+
        @Override
        public DeleteResult delete(DefinedTermBase term, TermDeletionConfigurator config){
                if (config == null){
                        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();
@@ -381,6 +401,12 @@ public class TermServiceImpl extends IdentifiableServiceBase<DefinedTermBase,IDe
                return result;
        }
 
+       @Override
+       @Transactional(readOnly = false)
+       public DeleteResult delete(UUID termUuid, TermDeletionConfigurator config){
+           return delete(dao.load(termUuid), config);
+       }
+
        @Override
        @Transactional(readOnly = false)
     public void updateTitleCache(Class<? extends DefinedTermBase> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<DefinedTermBase> cacheStrategy, IProgressMonitor monitor) {
@@ -391,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;
+    }
+
 }