cleanup
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / DescriptionServiceImpl.java
index b3bfe1d888b56fa0b18dc70fc5852742e26517c2..b4b003adb28b3adfe0087a5e94871ec2951e8289 100644 (file)
 package eu.etaxonomy.cdm.api.service;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -23,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import eu.etaxonomy.cdm.api.service.dto.TaxonDistributionDTO;
 import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.api.service.pager.impl.AbstractPagerImpl;
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
@@ -39,10 +42,12 @@ import eu.etaxonomy.cdm.model.common.MarkerType;
 import eu.etaxonomy.cdm.model.common.TermVocabulary;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
 import eu.etaxonomy.cdm.model.description.Distribution;
 import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
+import eu.etaxonomy.cdm.model.description.SpecimenDescription;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
 import eu.etaxonomy.cdm.model.description.TextData;
@@ -50,28 +55,29 @@ import eu.etaxonomy.cdm.model.location.NamedArea;
 import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
 import eu.etaxonomy.cdm.model.media.Media;
 import eu.etaxonomy.cdm.model.name.TaxonName;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
 import eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao;
 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;
 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionElementDao;
+import eu.etaxonomy.cdm.persistence.dao.description.IDescriptiveDataSetDao;
 import eu.etaxonomy.cdm.persistence.dao.description.IFeatureDao;
 import eu.etaxonomy.cdm.persistence.dao.description.IFeatureNodeDao;
 import eu.etaxonomy.cdm.persistence.dao.description.IFeatureTreeDao;
 import eu.etaxonomy.cdm.persistence.dao.description.IStatisticalMeasurementValueDao;
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
+import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.TermDto;
 import eu.etaxonomy.cdm.persistence.query.OrderHint;
 import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
 
 /**
  * @author a.mueller
- * @since 24.06.2008
- * @version 1.0
- */
-/**
  * @author a.kohlbecker
- * @since Dec 5, 2013
+ *
+ * @since 24.06.2008
  *
  */
 @Service
@@ -84,12 +90,18 @@ public class DescriptionServiceImpl
 
     protected IDescriptionElementDao descriptionElementDao;
     protected IFeatureTreeDao featureTreeDao;
+    protected IDescriptiveDataSetDao descriptiveDataSetDao;
     protected IFeatureNodeDao featureNodeDao;
     protected IFeatureDao featureDao;
     protected ITermVocabularyDao vocabularyDao;
     protected IDefinedTermDao definedTermDao;
     protected IStatisticalMeasurementValueDao statisticalMeasurementValueDao;
     protected ITaxonDao taxonDao;
+    protected ITaxonNodeDao taxonNodeDao;
+    protected IDescriptiveDataSetDao dataSetDao;
+
+    @Autowired
+    private IProgressMonitorService progressMonitorService;
 
     //TODO change to Interface
     private NaturalLanguageGenerator naturalLanguageGenerator;
@@ -99,6 +111,11 @@ public class DescriptionServiceImpl
         this.featureTreeDao = featureTreeDao;
     }
 
+    @Autowired
+    protected void setDescriptiveDataSetDao(IDescriptiveDataSetDao descriptiveDataSetDao) {
+        this.descriptiveDataSetDao = descriptiveDataSetDao;
+    }
+
     @Autowired
     protected void setFeatureNodeDao(IFeatureNodeDao featureNodeDao) {
         this.featureNodeDao = featureNodeDao;
@@ -139,6 +156,16 @@ public class DescriptionServiceImpl
         this.taxonDao = taxonDao;
     }
 
+    @Autowired
+    protected void setTaxonNodeDao(ITaxonNodeDao taxonNodeDao) {
+        this.taxonNodeDao = taxonNodeDao;
+    }
+
+    @Autowired
+    protected void setDataSetDao(IDescriptiveDataSetDao dataSetDao) {
+        this.dataSetDao = dataSetDao;
+    }
+
     /**
      *
      */
@@ -171,7 +198,7 @@ public class DescriptionServiceImpl
     }
 
     @Override
-    public int count(Class<? extends DescriptionBase> type, Boolean hasImages, Boolean hasText,Set<Feature> feature) {
+    public long count(Class<? extends DescriptionBase> type, Boolean hasImages, Boolean hasText,Set<Feature> feature) {
         return dao.countDescriptions(type, hasImages, hasText, feature);
     }
 
@@ -180,7 +207,7 @@ public class DescriptionServiceImpl
             Set<Feature> features, Class<T> type, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
 
         List<T> results = listDescriptionElements(description, descriptionType, features, type, pageSize, pageNumber, propertyPaths);
-        return new DefaultPagerImpl<T>(pageNumber, results.size(), pageSize, results);
+        return new DefaultPagerImpl<>(pageNumber, results.size(), pageSize, results);
     }
 
     @Override
@@ -197,9 +224,9 @@ public class DescriptionServiceImpl
             Class<? extends DescriptionBase> descriptionType, Set<Feature> features, Class<T> type, Integer pageSize, Integer pageNumber,
             List<String> propertyPaths) {
 
-        Integer numberOfResults = dao.countDescriptionElements(description, descriptionType, features, type);
+        long numberOfResults = dao.countDescriptionElements(description, descriptionType, features, type);
         List<T> results = new ArrayList<T>();
-        if(AbstractPagerImpl.hasResultsInRange(numberOfResults.longValue(), pageNumber, pageSize)) {
+        if(AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)) {
             results = dao.getDescriptionElements(description, descriptionType, features, type, pageSize, pageNumber, propertyPaths);
         }
         return results;
@@ -217,14 +244,14 @@ public class DescriptionServiceImpl
 
     @Override
     public Pager<Annotation> getDescriptionElementAnnotations(DescriptionElementBase annotatedObj, MarkerType status, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths){
-        Integer numberOfResults = descriptionElementDao.countAnnotations(annotatedObj, status);
+        long numberOfResults = descriptionElementDao.countAnnotations(annotatedObj, status);
 
-        List<Annotation> results = new ArrayList<Annotation>();
+        List<Annotation> results = new ArrayList<>();
         if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
             results = descriptionElementDao.getAnnotations(annotatedObj, status, pageSize, pageNumber, orderHints, propertyPaths);
         }
 
-        return new DefaultPagerImpl<Annotation>(pageNumber, numberOfResults, pageSize, results);
+        return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
     }
 
 
@@ -254,14 +281,14 @@ public class DescriptionServiceImpl
 
     @Override
     public Pager<TaxonDescription> pageTaxonDescriptions(Taxon taxon, Set<DefinedTerm> scopes, Set<NamedArea> geographicalScope, Set<MarkerType> markerTypes, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
-        Integer numberOfResults = dao.countTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes);
+        long numberOfResults = dao.countTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes);
 
-        List<TaxonDescription> results = new ArrayList<TaxonDescription>();
+        List<TaxonDescription> results = new ArrayList<>();
         if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
             results = dao.listTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes, pageSize, pageNumber, propertyPaths);
         }
 
-        return new DefaultPagerImpl<TaxonDescription>(pageNumber, numberOfResults, pageSize, results);
+        return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
     }
 
     @Override
@@ -343,27 +370,28 @@ public class DescriptionServiceImpl
 
     @Override
     public Pager<TaxonNameDescription> getTaxonNameDescriptions(TaxonName name, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
-        Integer numberOfResults = dao.countTaxonNameDescriptions(name);
+        long numberOfResults = dao.countTaxonNameDescriptions(name);
 
         List<TaxonNameDescription> results = new ArrayList<>();
         if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
             results = dao.getTaxonNameDescriptions(name, pageSize, pageNumber,propertyPaths);
         }
 
-        return new DefaultPagerImpl<TaxonNameDescription>(pageNumber, numberOfResults, pageSize, results);
+        return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
     }
 
 
     @Override
     public Pager<DescriptionBase> page(Class<? extends DescriptionBase> type, Boolean hasImages, Boolean hasText, Set<Feature> feature, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
-        Integer numberOfResults = dao.countDescriptions(type, hasImages, hasText, feature);
+        long numberOfResults = dao.countDescriptions(type, hasImages, hasText, feature);
 
-        List<DescriptionBase> results = new ArrayList<DescriptionBase>();
+        @SuppressWarnings("rawtypes")
+        List<DescriptionBase> results = new ArrayList<>();
         if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
             results = dao.listDescriptions(type, hasImages, hasText, feature, pageSize, pageNumber,orderHints,propertyPaths);
         }
 
-        return new DefaultPagerImpl<DescriptionBase>(pageNumber, numberOfResults, pageSize, results);
+        return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
     }
 
     /**
@@ -372,14 +400,14 @@ public class DescriptionServiceImpl
      */
     @Override
     public Pager<TaxonDescription> searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTerm presence,    Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
-        Integer numberOfResults = dao.countDescriptionByDistribution(namedAreas, presence);
+        long numberOfResults = dao.countDescriptionByDistribution(namedAreas, presence);
 
-        List<TaxonDescription> results = new ArrayList<TaxonDescription>();
+        List<TaxonDescription> results = new ArrayList<>();
         if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
             results = dao.searchDescriptionByDistribution(namedAreas, presence, pageSize, pageNumber,orderHints,propertyPaths);
         }
 
-        return new DefaultPagerImpl<TaxonDescription>(pageNumber, numberOfResults, pageSize, results);
+        return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
     }
 
     /**
@@ -387,15 +415,16 @@ public class DescriptionServiceImpl
      * move: descriptionElementService.search
      */
     @Override
-    public Pager<DescriptionElementBase> searchElements(Class<? extends DescriptionElementBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
-        Integer numberOfResults = descriptionElementDao.count(clazz, queryString);
+//    public Pager<T> searchElements(Class<? extends T> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
+    public <S extends DescriptionElementBase> Pager<S> searchElements(Class<S> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
+        long numberOfResults = descriptionElementDao.count(clazz, queryString);
 
-        List<DescriptionElementBase> results = new ArrayList<DescriptionElementBase>();
+        List<S> results = new ArrayList<>();
         if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
-            results = descriptionElementDao.search(clazz, queryString, pageSize, pageNumber, orderHints, propertyPaths);
+            results = (List<S>)descriptionElementDao.search(clazz, queryString, pageSize, pageNumber, orderHints, propertyPaths);
         }
 
-        return new DefaultPagerImpl<DescriptionElementBase>(pageNumber, numberOfResults, pageSize, results);
+        return new DefaultPagerImpl<>(pageNumber, numberOfResults, pageSize, results);
     }
 
     /**
@@ -436,6 +465,24 @@ public class DescriptionServiceImpl
         return descriptionElementDao.saveAll(descriptionElements);
     }
 
+    @Override
+    @Transactional(readOnly = false)
+    public List<MergeResult<DescriptionBase>> mergeDescriptionElements(Collection<TaxonDistributionDTO> descriptionElements, boolean returnTransientEntity) {
+        List<MergeResult<DescriptionBase>> mergedObjects = new ArrayList();
+        List<Distribution> toDelete = new ArrayList<>();
+        for(TaxonDistributionDTO obj : descriptionElements) {
+            Iterator<TaxonDescription> iterator = obj.getDescriptionsWrapper().getDescriptions().iterator();
+            while (iterator.hasNext()){
+                TaxonDescription desc = iterator.next();
+                mergedObjects.add(dao.merge(desc, returnTransientEntity));
+            }
+
+
+        }
+
+        return mergedObjects;
+    }
+
     /**
      * FIXME Candidate for harmonization
      * descriptionElementService.delete
@@ -458,17 +505,30 @@ public class DescriptionServiceImpl
     @Transactional(readOnly = false)
     public DeleteResult deleteDescription(DescriptionBase description) {
         DeleteResult deleteResult = new DeleteResult();
+        description = load(description.getId(), Arrays.asList("descriptiveDataSets"));//avoid lazy init exception
 
        if (description instanceof TaxonDescription){
                TaxonDescription taxDescription = HibernateProxyHelper.deproxy(description, TaxonDescription.class);
                Taxon tax = taxDescription.getTaxon();
                tax.removeDescription(taxDescription, true);
-               dao.delete(description);
-               deleteResult.addDeletedObject(taxDescription);
             deleteResult.addUpdatedObject(tax);
-            deleteResult.setCdmEntity(tax);
+       }
+       else if (HibernateProxyHelper.isInstanceOf(description, SpecimenDescription.class)){
+           SpecimenDescription specimenDescription = HibernateProxyHelper.deproxy(description, SpecimenDescription.class);
+           SpecimenOrObservationBase specimen = specimenDescription.getDescribedSpecimenOrObservation();
+           specimen.removeDescription(specimenDescription);
+           deleteResult.addUpdatedObject(specimen);
        }
 
+       Set<DescriptiveDataSet> descriptiveDataSets = description.getDescriptiveDataSets();
+       for (Iterator<DescriptiveDataSet> iterator = descriptiveDataSets.iterator(); iterator.hasNext();) {
+           iterator.next().removeDescription(description);
+        }
+
+       dao.delete(description);
+       deleteResult.addDeletedObject(description);
+       deleteResult.setCdmEntity(description);
+
 
         return deleteResult;
     }
@@ -806,4 +866,5 @@ public class DescriptionServiceImpl
 
     }
 
+
 }