Project

General

Profile

« Previous | Next » 

Revision e13687ce

Added by Andreas Müller over 2 years ago

ref #9668 fix CCE due to unordered result.getUpdatedObjects() and NPE due to missing secSources and some cleanup and javadoc

View differences:

eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/operation/SwapSynonymAndAcceptedOperation.java
10 10

  
11 11
import java.util.ArrayList;
12 12
import java.util.HashSet;
13
import java.util.Iterator;
14 13
import java.util.List;
15 14
import java.util.Set;
16 15

  
......
24 23
import eu.etaxonomy.cdm.api.service.UpdateResult;
25 24
import eu.etaxonomy.cdm.model.common.CdmBase;
26 25
import eu.etaxonomy.cdm.model.media.ExternalLink;
27
import eu.etaxonomy.cdm.model.media.ExternalLinkType;
28 26
import eu.etaxonomy.cdm.model.reference.Reference;
29 27
import eu.etaxonomy.cdm.model.taxon.Synonym;
30 28
import eu.etaxonomy.cdm.model.taxon.Taxon;
......
71 69

  
72 70
		monitor.worked(20);
73 71
		UpdateResult result = CdmStore.getService(ITaxonService.class).swapSynonymAndAcceptedTaxon(synonym.getUuid(), element.getUuid(), setNameInSource, false);//TODO
74
//		element = (Taxon) result.getCdmEntity();
75
		element = (Taxon)CdmStore.getService(ITaxonService.class).load(result.getCdmEntity().getUuid());
72
		//note: without reload a multiple representations exceptions appears, not yet tested why
73
		Taxon newTaxon = (Taxon)CdmStore.getService(ITaxonService.class).load(result.getCdmEntity().getUuid());
76 74
		Synonym newSyn = null;
77
		if (!result.getUpdatedObjects().isEmpty()){
78
		    Iterator<CdmBase> it = result.getUpdatedObjects().iterator();
79
		    while(it.hasNext()){
80
		        CdmBase tb = it.next();
81
		        if (tb instanceof Synonym){
82
		            newSyn = (Synonym)tb;
83
		        }
75
		for (CdmBase cdmBase : result.getUpdatedObjects()){
76
		    if (cdmBase instanceof Synonym){
77
		        newSyn = (Synonym)cdmBase;
78
		    }
79
		}
80

  
81
		//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)
82

  
83
		//remember oldAcc secSource info
84
		Reference oldAccRef = newTaxon.getSec();
85
		String oldAccMicroRef = newTaxon.getSecMicroReference();
86
		Set<ExternalLink> oldAccLinks = new HashSet<>();
87
		if (newTaxon.getSecSource()!= null){
88
		    for (ExternalLink link: newTaxon.getSecSource().getLinks()){
89
		        oldAccLinks.add(link.clone());
84 90
		    }
85
		    newSyn = (Synonym)CdmStore.getService(ITaxonService.class).load(result.getUpdatedObjects().iterator().next().getUuid());
86 91
		}
87
		Reference accRef = element.getSec();
88
		String accMicroRef = element.getSecMicroReference();
89
		Set<ExternalLink> accLinks = new HashSet<>();
90 92

  
91
		for (ExternalLink link: element.getSecSource().getLinks()){
92
            accLinks.add(ExternalLink.NewInstance(ExternalLinkType.Unknown, link.getUri()));
93
        }
94 93
		if (newSyn != null ){
95
    		element.setSec(newSyn.getSec());
96
    		element.setSecMicroReference(newSyn.getSecMicroReference());
97
    		element.getSecSource().getLinks().clear();
98
    		for (ExternalLink link: newSyn.getSecSource().getLinks()){
99
    		    element.getSecSource().addLink(ExternalLink.NewInstance(ExternalLinkType.Unknown, link.getUri()));
94
		    //adapt new taxon secSource info
95
		    newTaxon.setSec(newSyn.getSec());
96
		    newTaxon.setSecMicroReference(newSyn.getSecMicroReference());
97
    		if (newTaxon.getSecSource() != null){
98
    		    newTaxon.getSecSource().getLinks().clear();
99
    		    if (newSyn.getSecSource() != null){
100
    		        for (ExternalLink link: newSyn.getSecSource().getLinks()){
101
    		            newTaxon.getSecSource().addLink(link.clone());
102
    		        }
103
    		    }
100 104
    		}
101
    		newSyn.setSec(accRef);
102
    		newSyn.setSecMicroReference(accMicroRef);
103
    		newSyn.getSecSource().getLinks().clear();
104
    		for (ExternalLink link: accLinks){
105
                newSyn.getSecSource().addLink(link);
106
            }
107
		}
108 105

  
106
    		//adapt new synonym secSource info
107
    		newSyn.setSec(oldAccRef);
108
    		newSyn.setSecMicroReference(oldAccMicroRef);
109
    		if (newSyn.getSecSource()!= null){
110
    		    newSyn.getSecSource().getLinks().clear();
111
    		    for (ExternalLink link: oldAccLinks){
112
    		        newSyn.getSecSource().addLink(link);
113
    		    }
114
    		}
115
		}
109 116

  
110 117
		List<TaxonBase> mergeList = new ArrayList<>();
111
		mergeList.add(element);
118
		mergeList.add(newTaxon);
112 119
		mergeList.add(newSyn);
113 120

  
114 121
		CdmStore.getService(ITaxonService.class).merge(mergeList, true);
115 122
		monitor.worked(40);
116 123

  
117
		return postExecute(element);
124
		return postExecute(newTaxon);
118 125
	}
119 126

  
120 127
	@Override

Also available in: Unified diff