ref #8871, ref #7980 handle aggregation source modes for SDD aggregation
authorAndreas Müller <a.mueller@bgbm.org>
Thu, 7 Oct 2021 09:04:19 +0000 (11:04 +0200)
committerAndreas Müller <a.mueller@bgbm.org>
Thu, 7 Oct 2021 09:04:19 +0000 (11:04 +0200)
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/DescriptionAggregationConfigurationBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/StructuredDescriptionAggregation.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/description/StructuredDescriptionAggregationConfiguration.java

index 7e9650e4ff77823b3083cb70729c049b68909ec5..f1fc1b477c0dfa9b636ace9d70e761ff2af5817b 100644 (file)
@@ -110,6 +110,17 @@ public abstract class DescriptionAggregationConfigurationBase<TASK extends Descr
     public void setToParentSourceMode(AggregationSourceMode toParentSourceMode) {
         this.toParentSourceMode = toParentSourceMode;
     }
+    public AggregationSourceMode getSourceMode(AggregationMode aggregationMode){
+        AggregationSourceMode result;
+        if (aggregationMode == AggregationMode.WithinTaxon){
+            result = withinTaxonSourceMode;
+        }else if (aggregationMode == AggregationMode.ToParent){
+            result = toParentSourceMode;
+        }else{
+            throw new IllegalArgumentException("Aggregation mode not yet supported: " + aggregationMode);
+        }
+        return result == null ? AggregationSourceMode.NONE : result;
+    }
 
     public AggregationSourceMode getWithinTaxonSourceMode() {
         return withinTaxonSourceMode;
index ae2804c6976580c1f6f783a9fcdb7c76b9ebc76e..ee84ba9aa5a28d7c8abed7c675579bb611f15847 100644 (file)
@@ -150,16 +150,13 @@ public class StructuredDescriptionAggregation
                 .collect(Collectors.toSet());
 
         Set<IdentifiableSource> newSources = structuredResultHolder.sources;
-        //TODO FIXME only toParentSourceMode is wrong
-        if (getConfig().getToParentSourceMode() != AggregationSourceMode.NONE){
-            for (IdentifiableSource newSource : newSources) {
-                IdentifiableSource mergeSourceCandidate = findSourceCandidate(targetDescription, newSource);
-                if (mergeSourceCandidate == null){
-                    addNewSource(targetDescription, newSource);
-                }else{
-                    mergeSource(mergeSourceCandidate, newSource);
-                    sourcesToRemove.remove(mergeSourceCandidate);
-                }
+        for (IdentifiableSource newSource : newSources) {
+            IdentifiableSource mergeSourceCandidate = findSourceCandidate(targetDescription, newSource);
+            if (mergeSourceCandidate == null){
+                addNewSource(targetDescription, newSource);
+            }else{
+                mergeSource(mergeSourceCandidate, newSource);
+                sourcesToRemove.remove(mergeSourceCandidate);
             }
         }
 
@@ -197,7 +194,7 @@ public class StructuredDescriptionAggregation
             ((IDescribable<T>)existingTarget.describedEntity()).addDescription(existingTarget);
             ((IDescribable<T>)newTarget.describedEntity()).removeDescription(newTarget);
         }else{
-            //TODO merge non-description based sources
+            throw new IllegalStateException("Sources not linking to another CdmBase instance currently not yet supported.");
         }
     }
 
@@ -232,7 +229,7 @@ public class StructuredDescriptionAggregation
     }
     @SuppressWarnings("unchecked")
     private <T extends DescriptionBase<?>> void removeSourceDescriptionFromDescribedEntity(T sourceDescription) {
-        ((IDescribable<T>)sourceDescription.describedEntity()).addDescription(sourceDescription);
+        ((IDescribable<T>)sourceDescription.describedEntity()).removeDescription(sourceDescription);
     }
 
     private IdentifiableSource findSourceCandidate(TaxonDescription targetDescription, IdentifiableSource newSource) {
@@ -416,7 +413,7 @@ public class StructuredDescriptionAggregation
             Set<TaxonDescription> excludedDescriptions) {
         StructuredDescriptionResultHolder descriptiveResultHolder = (StructuredDescriptionResultHolder)resultHolder;
         Set<TaxonDescription> childDescriptions = getChildTaxonDescriptions(taxonNode, dataSet);
-        addDescriptionToResultHolder(descriptiveResultHolder, childDescriptions);
+        addDescriptionToResultHolder(descriptiveResultHolder, childDescriptions, AggregationMode.ToParent);
     }
 
     @Override
@@ -425,10 +422,10 @@ public class StructuredDescriptionAggregation
             Set<TaxonDescription> excludedDescriptions) {
         StructuredDescriptionResultHolder descriptiveResultHolder = (StructuredDescriptionResultHolder)resultHolder;
         Set<SpecimenDescription> specimenDescriptions = getSpecimenDescriptions(taxon, dataSet);
-        addDescriptionToResultHolder(descriptiveResultHolder, specimenDescriptions);
+        addDescriptionToResultHolder(descriptiveResultHolder, specimenDescriptions, AggregationMode.WithinTaxon);
         if (getConfig().isIncludeLiterature()){
             Set<TaxonDescription> literatureDescriptions = getLiteratureDescriptions(taxon, dataSet);
-            addDescriptionToResultHolder(descriptiveResultHolder, literatureDescriptions);
+            addDescriptionToResultHolder(descriptiveResultHolder, literatureDescriptions, AggregationMode.WithinTaxon);
         }
         //TODO add default descriptions
         //xxx
@@ -436,7 +433,8 @@ public class StructuredDescriptionAggregation
     }
 
     private void addDescriptionToResultHolder(StructuredDescriptionResultHolder descriptiveResultHolder,
-            Set<? extends DescriptionBase<?>> specimenLiteraturOrDefaultDescriptions) {
+            Set<? extends DescriptionBase<?>> specimenLiteraturOrDefaultDescriptions,
+            AggregationMode aggregationMode) {
 
         boolean descriptionWasUsed = false;
         for (DescriptionBase<?> desc: specimenLiteraturOrDefaultDescriptions){
@@ -451,12 +449,37 @@ public class StructuredDescriptionAggregation
                     }
                 }
             }
-            if(descriptionWasUsed){
-                IdentifiableSource identifiableSource = IdentifiableSource.NewAggregationSourceInstance();
-                //TODO preliminary (what about distinction within<-> parentChild
-                DescriptionBase<?> clonedDesc = cloneNewSourceDescription(desc);
-                identifiableSource.setCdmSource(clonedDesc);
-                descriptiveResultHolder.sources.add(identifiableSource);
+
+            //sources
+            AggregationSourceMode sourceMode = getConfig().getSourceMode(aggregationMode);
+            if(descriptionWasUsed && sourceMode != AggregationSourceMode.NONE){
+                IdentifiableSource source = IdentifiableSource.NewAggregationSourceInstance();
+                desc = CdmBase.deproxy(desc);
+
+                switch (sourceMode){
+                    case DESCRIPTION:
+                        DescriptionBase<?> clonedDesc = cloneNewSourceDescription(desc);
+                        source.setCdmSource(clonedDesc);
+                        break;
+                    case TAXON:
+                        if (desc instanceof TaxonDescription){
+                            Taxon taxon = ((TaxonDescription) desc).getTaxon();
+                            source.setCdmSource(taxon);
+                        }else {
+                            throw new IllegalStateException("Description type not yet supported for aggregation source mode TAXON: " + desc.getClass().getSimpleName() );
+                        }
+                        break;
+                    case ALL: //not yet supported
+                    case ALL_SAMEVALUE: //makes no sense
+                    case NONE:
+                        source = null;
+                        break;
+                    default:
+                        throw new IllegalStateException("Source mode not yet supported:" + sourceMode);
+                }
+                if (source != null){
+                    descriptiveResultHolder.sources.add(source);
+                }
             }
         }
     }
index c7aa3008a02c3166bb4d513edfaf7e033a0a05d5..3cdb8a2df5af4b9bf52d4a40582a04813d11fc71 100644 (file)
@@ -49,6 +49,7 @@ public class StructuredDescriptionAggregationConfiguration
     protected StructuredDescriptionAggregationConfiguration(TaxonNodeFilter filter,
             List<AggregationMode> aggregationModes, IProgressMonitor monitor, Boolean includeDefault, Boolean includeLiterature) {
         super(filter, monitor, aggregationModes);
+        setWithinTaxonSourceMode(AggregationSourceMode.DESCRIPTION);  //default mode for structured descriptions
         if (includeDefault != null){
             this.includeDefault = includeDefault;
         }