ref #8785: update descriptions in description list after merge
authorKatja Luther <k.luther@bgbm.org>
Tue, 19 May 2020 10:16:25 +0000 (12:16 +0200)
committerKatja Luther <k.luther@bgbm.org>
Tue, 19 May 2020 10:16:25 +0000 (12:16 +0200)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrix.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrixConfigLabelAccumulator.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrixPart.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/MatrixRowComparator.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/MatrixUtility.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/SpecimenColumnPropertyAccessor.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/handler/AddDescriptionHandler.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/handler/DeleteDescriptionHandler.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/configurator/StructuredDescriptionAggregationConfigurationWizardPage.java

index e2403b91e8acb8cca4701a071838ac4012e71197..33c16685679a545d41b9eed61cfc5a68c8e0f9cf 100644 (file)
@@ -13,7 +13,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -158,7 +157,8 @@ public class CharacterMatrix extends Composite {
 
     private NatTable natTable;
 
-    private Collection<RowWrapperDTO<?>> rowsToSave = new HashSet<>();
+//    private Collection<RowWrapperDTO<?>> rowsToSave = new HashSet<>();
+    private HashMap<UUID, RowWrapperDTO<?>> rowsToMerge = new HashMap<>();
 
     private Map<Integer, Feature> indexToFeatureMap = new HashMap<>();
 
@@ -692,6 +692,7 @@ public class CharacterMatrix extends Composite {
                     descriptions.clear();
                     wrappers.stream().filter(row->row.getTaxonNode()!=null).forEach(wrapper->CharacterMatrix.this.descriptions.add(wrapper));
                     loadingDone(isInitialExpandToDeepestTaxonLevel);
+
                 });
             }
         });
@@ -712,6 +713,7 @@ public class CharacterMatrix extends Composite {
     private void loadingDone(boolean isInitialExpandToDeepestTaxonLevel) {
         this.part.loadingDone();
         createTable(isTreeView, freezeLayer.isFrozen(), isInitialExpandToDeepestTaxonLevel);
+
     }
 
     public List<TermDto> getSupportedStatesForCategoricalFeature(Feature feature){
@@ -803,11 +805,22 @@ public class CharacterMatrix extends Composite {
     }
 
     public void addRowToSave(RowWrapperDTO<?> row){
-        rowsToSave.add(row);
+        rowsToMerge.put(row.getDescription().getDescription().getUuid(), row);
+    }
+
+    public HashMap<UUID,RowWrapperDTO<?>> getRowsToSave() {
+        return rowsToMerge;
     }
 
-    public Collection<RowWrapperDTO<?>> getRowsToSave() {
-        return rowsToSave;
+    public HashMap<UUID, RowWrapperDTO<?>> getRowsToMerge() {
+        return rowsToMerge;
+    }
+
+    public void putRowToMerge(RowWrapperDTO rowToMerge) {
+        if (this.rowsToMerge == null){
+            this.rowsToMerge = new HashMap<>();
+        }
+        this.rowsToMerge.put(rowToMerge.getDescription().getDescription().getUuid(), rowToMerge);
     }
 
     public Properties getNatTableState() {
@@ -915,7 +928,7 @@ public class CharacterMatrix extends Composite {
                     dataSet = this.getCdmEntitiySession().load(dataSet, true);
                     // update local dataset
                     this.setDescriptiveDataSet(dataSet);
-                    this.loadDescriptions(getDescriptiveDataSet().getUuid(), false);
+//                    this.loadDescriptions(getDescriptiveDataSet().getUuid(), false);
 
 
                 }
index 01bbd805420648361178c2e414df73c95e5c039e..7d586bbadf9c7897e1f130080b2f1e6a8195a7fa 100644 (file)
@@ -14,6 +14,7 @@ import java.util.Set;
 import org.eclipse.nebula.widgets.nattable.layer.LabelStack;
 import org.eclipse.nebula.widgets.nattable.layer.cell.IConfigLabelAccumulator;
 
+import eu.etaxonomy.cdm.api.service.dto.DescriptionBaseDto;
 import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
 import eu.etaxonomy.cdm.api.service.dto.SpecimenRowWrapperDTO;
 import eu.etaxonomy.cdm.api.service.dto.TaxonRowWrapperDTO;
@@ -87,7 +88,7 @@ public class CharacterMatrixConfigLabelAccumulator implements IConfigLabelAccumu
                 }
             }
             //check for supplemental data
-            if(!taxonRowWrapper.getDescription().getSources().isEmpty() && columnPosition==0){
+            if(!taxonRowWrapper.getDescription().getDescription().getSources().isEmpty() && columnPosition==0){
                 configLabels.addLabel(CharacterMatrix.LABEL_DESCRIPTION_HAS_SUPPLEMENTAL_DATA);
             }
             configLabels.addLabel(CharacterMatrix.LABEL_TAXON_DESCRIPTION);
@@ -151,15 +152,16 @@ public class CharacterMatrixConfigLabelAccumulator implements IConfigLabelAccumu
     private boolean hasDefaultValue(Feature feature, RowWrapperDTO<?> rowWrapperDTO) {
         if(rowWrapperDTO instanceof SpecimenRowWrapperDTO
                 && ((SpecimenRowWrapperDTO) rowWrapperDTO).getDefaultDescription()!=null){
-            return hasDefaultValue(feature, ((SpecimenRowWrapperDTO)rowWrapperDTO).getDefaultDescription().getDescription());
+            TaxonDescription taxDescription = (TaxonDescription)((SpecimenRowWrapperDTO)rowWrapperDTO).getDefaultDescription().getDescription().getDescription();
+            return hasDefaultValue(feature, taxDescription);
         }
         else if(rowWrapperDTO instanceof TaxonRowWrapperDTO){
             TaxonRowWrapperDTO taxonRowWrapper = (TaxonRowWrapperDTO)rowWrapperDTO;
-            Set<TaxonDescription> descriptions = taxonRowWrapper.getDescription().getTaxon().getDescriptions();
-            for (TaxonDescription taxonDescription : descriptions) {
+            Set<DescriptionBaseDto> descriptions = taxonRowWrapper.getTaxonDescriptions();
+            for (DescriptionBaseDto taxonDescription : descriptions) {
                 if(matrix.getDescriptiveDataSet().getDescriptions().contains(taxonDescription)
-                        && taxonDescription.getTypes().contains(DescriptionType.DEFAULT_VALUES_FOR_AGGREGATION)){
-                    return hasDefaultValue(feature, taxonDescription);
+                        && taxonDescription.getDescription().getTypes().contains(DescriptionType.DEFAULT_VALUES_FOR_AGGREGATION)){
+                    return hasDefaultValue(feature, (TaxonDescription)taxonDescription.getDescription());
                 }
             }
         }
index 58454e9deff74b1469910969eb34a2aa4912b0a9..038f3f393c94dd8107f3dac3f4113f19054f3bf6 100644 (file)
@@ -40,10 +40,14 @@ import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.api.service.IDescriptionService;
 import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
+import eu.etaxonomy.cdm.api.service.dto.DescriptionBaseDto;
+import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
+import eu.etaxonomy.cdm.api.service.dto.SpecimenRowWrapperDTO;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.term.TermType;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
@@ -186,15 +190,33 @@ ICdmEntitySessionEnabled, IPartContentHasSupplementalData, IPartContentHasDetail
     @Override
     public void save(IProgressMonitor monitor) {
         // save edited descriptions
-        List<DescriptionBase> descriptions = matrix.getRowsToSave().stream()
+        List<DescriptionBaseDto> descriptions = matrix.getRowsToSave().values().stream()
         .map(row->row.getDescription())
         .collect(Collectors.toList());
         matrix.addSpecimensToDescriptiveDataSet();
-        CdmStore.getService(IDescriptiveDataSetService.class).removeDescriptions(matrix.getDescriptionsToDelete(), matrix.getDescriptiveDataSet().getUuid());
-
-        CdmStore.getService(IDescriptionService.class).merge(descriptions);
+        //newly added descriptions should not be saved again.
+        descriptions.removeAll(matrix.getRowsToSave().values());
         matrix.getRowsToSave().clear();
+        if (matrix.getDescriptionsToDelete() != null && !matrix.getDescriptionsToDelete().isEmpty()){
+            CdmStore.getService(IDescriptiveDataSetService.class).removeDescriptions(matrix.getDescriptionsToDelete(), matrix.getDescriptiveDataSet().getUuid());
+        }
+        List<MergeResult<DescriptionBase>> results = CdmStore.getService(IDescriptionService.class).mergeDescriptions(descriptions, true);
         conversation.commit();
+        HashMap<UUID, DescriptionBase> descriptionResults = new HashMap<>();
+        for (MergeResult result: results){
+            if (result.getMergedEntity() != null){
+                descriptionResults.put(result.getMergedEntity().getUuid(), (DescriptionBase)result.getMergedEntity());
+            }
+        }
+        List<Object> updateRows = matrix.getDescriptions().stream().filter(row->descriptionResults.keySet().contains(((RowWrapperDTO)row).getDescription().getDescription().getUuid())).collect(Collectors.toList());
+        for (Object updateRow: updateRows){
+            if (updateRow instanceof SpecimenRowWrapperDTO){
+                SpecimenRowWrapperDTO dto = (SpecimenRowWrapperDTO)updateRow;
+                dto.getDescription().setDescription(descriptionResults.get(((SpecimenRowWrapperDTO) updateRow).getDescription().getDescription().getUuid()));
+            }
+        }
+//        matrix.loadDescriptions(getDescriptiveDataSet().getUuid(), false);
+
         dirty.setDirty(false);
     }
 
index f9eb6b48a13eff391b2c697a11b6cd571c75a3b6..f99b01a93a1e2915ca0fe3a10211246442806ce2 100644 (file)
@@ -81,8 +81,8 @@ public class MatrixRowComparator implements Comparator<Object>{
             else{
                 // same taxon node
             }
-            DescriptionBase description1 = rowWrapper1.getDescription();
-            DescriptionBase description2 = rowWrapper2.getDescription();
+            DescriptionBase description1 = rowWrapper1.getDescription().getDescription();
+            DescriptionBase description2 = rowWrapper2.getDescription().getDescription();
             //compare by taxon description type
             if(description1 instanceof TaxonDescription){
                 if(description2 instanceof SpecimenDescription){
index bb6c7a5135362cce456188bb8f89a1abe6722410..909d80fe3a16fe97941f28facecb418458a66078 100644 (file)
@@ -70,7 +70,7 @@ public class MatrixUtility {
     }
 
     private static boolean hasType(TaxonRowWrapperDTO taxonRowWrapperDTO, DescriptionType descriptionType){
-        return taxonRowWrapperDTO.getDescription().getTypes().stream()
+        return taxonRowWrapperDTO.getDescription().getDescription().getTypes().stream()
         .anyMatch(type->type.equals(descriptionType));
     }
 
index 6ec438e154f45d4e72e04cc54c4aef90060df49b..730210d3b4b479239dbecc0f547e519b40b87d54 100644 (file)
@@ -54,7 +54,11 @@ public class SpecimenColumnPropertyAccessor implements IColumnPropertyAccessor<O
                     return rowWrapper.getTaxonNode();
                 }
             case 1:
-                return rowWrapper.getFieldUnit().getTitleCache();
+                if (rowWrapper.getFieldUnit() != null){
+                    return rowWrapper.getFieldUnit().getTitleCache();
+                }else{
+                    return "no information";
+                }
             case 2:
                 return rowWrapper.getIdentifier();
             case 3:
index 5d1c46da7043929c2885197cedcf3df9ff9d50ec..1ab3a7c5fa063f5bd30a64148a526985684ed1f8 100755 (executable)
@@ -31,7 +31,6 @@ import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrix;
 import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrixPart;
 import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.SpecimenSelectionDialog;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
 
 /**
  * @author k.luther
@@ -43,9 +42,9 @@ public class AddDescriptionHandler {
 
         // dependent on the selection the specimens are filtered
         CharacterMatrixPart matrixPart = (CharacterMatrixPart) activePart.getObject();
-        if(StoreUtil.promptCheckIsDirty(matrixPart)){
-            return;
-        }
+//        if(StoreUtil.promptCheckIsDirty(matrixPart)){
+//            return;
+//        }
         CharacterMatrix matrix = matrixPart.getMatrix();
         IStructuredSelection selection = matrixPart.getSelection();
         List<String> treeIndexList = null;
index af20bb7a704ccd610e62ef251194bd2a63bdc342..44ad997f4a3c51e0b26c3ea766f78b8a96b18910 100755 (executable)
@@ -23,9 +23,10 @@ import eu.etaxonomy.cdm.api.service.dto.SpecimenRowWrapperDTO;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
 import eu.etaxonomy.cdm.model.description.SpecimenDescription;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper;
+import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrixPart;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
 
 /**
  *  @author k.luther
@@ -37,17 +38,22 @@ public class DeleteDescriptionHandler{
     @Execute
     public void execute(@Named(IServiceConstants.ACTIVE_PART)MPart activePart, UISynchronize sync) {
         CharacterMatrixPart matrixPart = (CharacterMatrixPart) activePart.getObject();
-        if(StoreUtil.promptCheckIsDirty(matrixPart)){
-            return;
-        }
+//        if(StoreUtil.promptCheckIsDirty(matrixPart)){
+//            return;
+//        }
         DescriptiveDataSet descriptiveDataSet = matrixPart.getDescriptiveDataSet();
         RowWrapperDTO wrapper = (RowWrapperDTO) matrixPart.getSelection().getFirstElement();
-        DescriptionBase description = wrapper.getDescription();
+        DescriptionBase description = wrapper.getDescription().getDescription();
 
         boolean ok = matrixPart.getMatrix().getDescriptions().remove(wrapper);
         matrixPart.getMatrix().addDescriptionToDelete(description.getUuid());
         if (description instanceof SpecimenDescription){
-            SpecimenNodeWrapper nodeWrapper = new SpecimenNodeWrapper(((SpecimenRowWrapperDTO)wrapper).getSpecimen(), ((SpecimenRowWrapperDTO)wrapper).getType(), wrapper.getTaxonNode());
+            UuidAndTitleCache<SpecimenOrObservationBase> uuidAndTitleCache = new UuidAndTitleCache<>(((SpecimenRowWrapperDTO)wrapper).getSpecimen().getUuid(), ((SpecimenRowWrapperDTO)wrapper).getSpecimen().getId(), ((SpecimenRowWrapperDTO)wrapper).getSpecimen().getTitleCache());
+            SpecimenNodeWrapper nodeWrapper = new SpecimenNodeWrapper(uuidAndTitleCache,
+                    ((SpecimenRowWrapperDTO)wrapper).getType(),
+                    wrapper.getTaxonNode());
+
+
             if (matrixPart.getMatrix().getSpecimenCache()!= null){
                 matrixPart.getMatrix().getSpecimenCache().add(nodeWrapper);
             }
index 71f14a1317cdcff357523cbf00bdbaedcb2fc796..1e27c63742776945ae51f521e7296a5f375c9f8e 100755 (executable)
@@ -95,7 +95,7 @@ public class StructuredDescriptionAggregationConfigurationWizardPage extends Agg
         });
 
         checkUseSelectedTaxonNode= new Button(radioComposite,  SWT.RADIO);
-        checkUseSelectedTaxonNode.setText("Aggregation only for selected taxon/taxa");
+        checkUseSelectedTaxonNode.setText(Messages.AggregationWizardPage_SINGLE_TAXON);
         checkUseSelectedTaxonNode.addListener(SWT.Selection, new Listener() {
             @Override
             public void handleEvent(Event e) {