ref #9668 fix CCE due to unordered result.getUpdatedObjects() and NPE due to missing...
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 14 Jul 2021 13:44:24 +0000 (15:44 +0200)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 14 Jul 2021 13:44:24 +0000 (15:44 +0200)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/operation/SwapSynonymAndAcceptedOperation.java

index 1d0b80cd65d7d5c8ffa75e2e8a8f18841cab6e9f..d308b79b0973e8f9fc4ba9f535e425262594eb6d 100644 (file)
@@ -10,7 +10,6 @@ package eu.etaxonomy.taxeditor.editor.name.operation;
 
 import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
@@ -24,7 +23,6 @@ import eu.etaxonomy.cdm.api.service.ITaxonService;
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.media.ExternalLink;
-import eu.etaxonomy.cdm.model.media.ExternalLinkType;
 import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
@@ -71,50 +69,59 @@ public class SwapSynonymAndAcceptedOperation extends AbstractPostTaxonOperation
 
                monitor.worked(20);
                UpdateResult result = CdmStore.getService(ITaxonService.class).swapSynonymAndAcceptedTaxon(synonym.getUuid(), element.getUuid(), setNameInSource, false);//TODO
-//             element = (Taxon) result.getCdmEntity();
-               element = (Taxon)CdmStore.getService(ITaxonService.class).load(result.getCdmEntity().getUuid());
+               //note: without reload a multiple representations exceptions appears, not yet tested why
+               Taxon newTaxon = (Taxon)CdmStore.getService(ITaxonService.class).load(result.getCdmEntity().getUuid());
                Synonym newSyn = null;
-               if (!result.getUpdatedObjects().isEmpty()){
-                   Iterator<CdmBase> it = result.getUpdatedObjects().iterator();
-                   while(it.hasNext()){
-                       CdmBase tb = it.next();
-                       if (tb instanceof Synonym){
-                           newSyn = (Synonym)tb;
-                       }
+               for (CdmBase cdmBase : result.getUpdatedObjects()){
+                   if (cdmBase instanceof Synonym){
+                       newSyn = (Synonym)cdmBase;
+                   }
+               }
+
+               //for some reason simple cloning of the secundum source does not work if external links exist (throws exception because an OriginalSourceBase_id in an AuditTable (probably OriginalSourceBase_ExternalLink) becomes null)
+
+               //remember oldAcc secSource info
+               Reference oldAccRef = newTaxon.getSec();
+               String oldAccMicroRef = newTaxon.getSecMicroReference();
+               Set<ExternalLink> oldAccLinks = new HashSet<>();
+               if (newTaxon.getSecSource()!= null){
+                   for (ExternalLink link: newTaxon.getSecSource().getLinks()){
+                       oldAccLinks.add(link.clone());
                    }
-                   newSyn = (Synonym)CdmStore.getService(ITaxonService.class).load(result.getUpdatedObjects().iterator().next().getUuid());
                }
-               Reference accRef = element.getSec();
-               String accMicroRef = element.getSecMicroReference();
-               Set<ExternalLink> accLinks = new HashSet<>();
 
-               for (ExternalLink link: element.getSecSource().getLinks()){
-            accLinks.add(ExternalLink.NewInstance(ExternalLinkType.Unknown, link.getUri()));
-        }
                if (newSyn != null ){
-               element.setSec(newSyn.getSec());
-               element.setSecMicroReference(newSyn.getSecMicroReference());
-               element.getSecSource().getLinks().clear();
-               for (ExternalLink link: newSyn.getSecSource().getLinks()){
-                   element.getSecSource().addLink(ExternalLink.NewInstance(ExternalLinkType.Unknown, link.getUri()));
+                   //adapt new taxon secSource info
+                   newTaxon.setSec(newSyn.getSec());
+                   newTaxon.setSecMicroReference(newSyn.getSecMicroReference());
+               if (newTaxon.getSecSource() != null){
+                   newTaxon.getSecSource().getLinks().clear();
+                   if (newSyn.getSecSource() != null){
+                       for (ExternalLink link: newSyn.getSecSource().getLinks()){
+                           newTaxon.getSecSource().addLink(link.clone());
+                       }
+                   }
                }
-               newSyn.setSec(accRef);
-               newSyn.setSecMicroReference(accMicroRef);
-               newSyn.getSecSource().getLinks().clear();
-               for (ExternalLink link: accLinks){
-                newSyn.getSecSource().addLink(link);
-            }
-               }
 
+               //adapt new synonym secSource info
+               newSyn.setSec(oldAccRef);
+               newSyn.setSecMicroReference(oldAccMicroRef);
+               if (newSyn.getSecSource()!= null){
+                   newSyn.getSecSource().getLinks().clear();
+                   for (ExternalLink link: oldAccLinks){
+                       newSyn.getSecSource().addLink(link);
+                   }
+               }
+               }
 
                List<TaxonBase> mergeList = new ArrayList<>();
-               mergeList.add(element);
+               mergeList.add(newTaxon);
                mergeList.add(newSyn);
 
                CdmStore.getService(ITaxonService.class).merge(mergeList, true);
                monitor.worked(40);
 
-               return postExecute(element);
+               return postExecute(newTaxon);
        }
 
        @Override