import java.util.ArrayList;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
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;
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