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;
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<>();
descriptions.clear();
wrappers.stream().filter(row->row.getTaxonNode()!=null).forEach(wrapper->CharacterMatrix.this.descriptions.add(wrapper));
loadingDone(isInitialExpandToDeepestTaxonLevel);
+
});
}
});
private void loadingDone(boolean isInitialExpandToDeepestTaxonLevel) {
this.part.loadingDone();
createTable(isTreeView, freezeLayer.isFrozen(), isInitialExpandToDeepestTaxonLevel);
+
}
public List<TermDto> getSupportedStatesForCategoricalFeature(Feature feature){
}
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() {
dataSet = this.getCdmEntitiySession().load(dataSet, true);
// update local dataset
this.setDescriptiveDataSet(dataSet);
- this.loadDescriptions(getDescriptiveDataSet().getUuid(), false);
+// this.loadDescriptions(getDescriptiveDataSet().getUuid(), false);
}
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;
}
}
//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);
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());
}
}
}
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;
@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);
}
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){
}
private static boolean hasType(TaxonRowWrapperDTO taxonRowWrapperDTO, DescriptionType descriptionType){
- return taxonRowWrapperDTO.getDescription().getTypes().stream()
+ return taxonRowWrapperDTO.getDescription().getDescription().getTypes().stream()
.anyMatch(type->type.equals(descriptionType));
}
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:
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
// 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;
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
@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);
}
});
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) {