Project

General

Profile

« Previous | Next » 

Revision 749a2e19

Added by Andreas Müller over 2 years ago

ref #9477 fix term loading for ordered new terms

View differences:

cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/term/init/TermLoader.java
12 12
import java.lang.reflect.Constructor;
13 13
import java.util.ArrayList;
14 14
import java.util.HashMap;
15
import java.util.HashSet;
16 15
import java.util.List;
17 16
import java.util.Map;
18 17
import java.util.Set;
......
23 22

  
24 23
import au.com.bytecode.opencsv.CSVReader;
25 24
import eu.etaxonomy.cdm.common.CdmUtils;
25
import eu.etaxonomy.cdm.model.common.CdmBase;
26 26
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
27 27
import eu.etaxonomy.cdm.model.term.OrderedTermBase;
28 28
import eu.etaxonomy.cdm.model.term.OrderedTermVocabulary;
......
50 50
	}
51 51

  
52 52
	@Override
53
	public UUID loadUuids(VocabularyEnum vocType, Map<UUID, Set<UUID>> uuidMap) {
53
	public UUID loadUuids(VocabularyEnum vocType, Map<UUID, List<UUID>> uuidMap) {
54 54

  
55 55
		try {
56 56
			CSVReader reader = getCsvReader(vocType);
57 57
			String[] nextLine = reader.readNext();
58 58
			UUID uuidVocabulary = UUID.fromString(nextLine[0]);
59
			Set<UUID> termSet = new HashSet<>();
60
			uuidMap.put(uuidVocabulary, termSet);
59
			List<UUID> termList = new ArrayList<>();
60
			uuidMap.put(uuidVocabulary, termList);
61 61

  
62 62
			while ( (nextLine = reader.readNext()) != null) {
63 63
				UUID uuidTerm = UUID.fromString(nextLine[0]);
64
				termSet.add(uuidTerm);
64
				termList.add(uuidTerm);
65 65
			}
66 66
			reader.close();
67 67
			return uuidVocabulary;
......
76 76
	}
77 77

  
78 78
	@Override
79
	public <T extends DefinedTermBase> TermVocabulary<T> loadTerms(VocabularyEnum vocType, Map<UUID,DefinedTermBase> terms) {
79
	public <T extends DefinedTermBase<T>, S extends OrderedTermBase<S>> TermVocabulary<T> loadTerms(
80
	        VocabularyEnum vocType, Map<UUID,DefinedTermBase> terms) {
80 81

  
81 82
		try {
82 83
			CSVReader reader = getCsvReader(vocType);
83 84
			String [] nextLine = reader.readNext();
84 85

  
85
			Class<? extends DefinedTermBase> termClass = vocType.getClazz();
86
			Class<T> termClass = (Class<T>)vocType.getClazz();
86 87

  
87 88
			//vocabulary
88 89
			TermVocabulary<T> voc;
......
102 103
			// Ugly, I know, but I don't think we can use a static method here . .
103 104

  
104 105
			T classDefiningTermInstance = getInstance(termClass);// ((Class<T>)termClass).newInstance();
105

  
106
			S lastInstance = null;
106 107
			while ((nextLine = reader.readNext()) != null) {
107 108
				// nextLine[] is an array of values from the line
108 109
				if (nextLine.length == 0){
109 110
					continue;
110 111
				}
111 112

  
112
				handleSingleTerm(nextLine, terms, termClass, voc,
113
						abbrevAsId, classDefiningTermInstance);
113
				lastInstance = handleSingleTerm(nextLine, terms, termClass, voc,
114
						abbrevAsId, lastInstance, classDefiningTermInstance);
114 115
			}
115 116
	        reader.close();
116 117
			return voc;
......
133 134
	 * @param classDefiningTermInstance instance for calling readCsvLine
134 135
	 * @return
135 136
	 */
136
	private <T extends DefinedTermBase> T handleSingleTerm(String[] csvLine, Map<UUID,DefinedTermBase> terms,
137
			Class<? extends DefinedTermBase> termClass,
138
			TermVocabulary<T> voc, boolean abbrevAsId,
137
	private <T extends DefinedTermBase<T>, S extends OrderedTermBase<S> > S handleSingleTerm(
138
	            String[] csvLine, Map<UUID,DefinedTermBase> terms, Class<T> termClass,
139
			TermVocabulary<T> voc, boolean abbrevAsId, S lastTerm,
139 140
			T classDefiningTermInstance) {
140
		T term = (T) classDefiningTermInstance.readCsvLine(termClass,arrayedLine(csvLine), voc.getTermType(), terms, abbrevAsId);
141
		voc.addTerm(term);
141
		T term = classDefiningTermInstance.readCsvLine(termClass, arrayedLine(csvLine), voc.getTermType(), terms, abbrevAsId);
142 142
		terms.put(term.getUuid(), term);
143
		return term;
143
		if (voc.isInstanceOf(OrderedTermVocabulary.class) && term.isInstanceOf(OrderedTermBase.class)){
144
		    @SuppressWarnings("unchecked")
145
            OrderedTermVocabulary<S> orderedVoc = CdmBase.deproxy(voc, OrderedTermVocabulary.class);
146
		    @SuppressWarnings("unchecked")
147
            S orderedTerm = (S)CdmBase.deproxy(term, OrderedTermBase.class);
148
		    if (lastTerm != null){
149
		        orderedVoc.addTermBelow(orderedTerm, lastTerm);
150
		    }else{
151
		        orderedVoc.addTerm(orderedTerm);
152
		    }
153
		    return orderedTerm;
154
		}else{
155
		    voc.addTerm(term);
156
		    return null;
157
		}
144 158
	}
145 159

  
146 160

  
147 161
	@Override
148
	public <T extends DefinedTermBase> Set<T> loadSingleTerms(VocabularyEnum vocType,
162
	public <T extends DefinedTermBase<T>,S extends OrderedTermBase<S>> Set<T> loadSingleTerms(VocabularyEnum vocType,
149 163
			TermVocabulary<T> voc, Set<UUID> missingTerms) {
150 164
		try {
151
			Class<? extends DefinedTermBase> termClass = vocType.getClazz();
165
		    Class<T> termClass = (Class<T>)vocType.getClazz();
152 166

  
153 167
			CSVReader reader = getCsvReader(vocType);
154 168
			String [] nextLine =  reader.readNext();
......
160 174
			boolean abbrevAsId = (arrayedLine(nextLine).get(5).equals("1"));
161 175
			T classDefiningTermInstance = getInstance(termClass);// ((Class<T>)termClass).newInstance();
162 176
			Map<UUID,DefinedTermBase> allVocTerms = new HashMap<>();
163
			for (T term:voc.getTerms()){
177
			for (T term: voc.getTerms()){
164 178
				allVocTerms.put(term.getUuid(), term);
165 179
			}
166 180

  
181
			UUID lastTermUuid = null;
182
			S lastTerm;
167 183
			while ((nextLine = reader.readNext()) != null) {
168 184
				if (nextLine.length == 0){
169 185
					continue;
170 186
				}
171 187
				UUID uuid = UUID.fromString(nextLine[0]);
172 188
				if (missingTerms.contains(uuid)){
173
					handleSingleTerm(nextLine, allVocTerms, termClass, voc, abbrevAsId, classDefiningTermInstance);
189
				    lastTerm = (S)allVocTerms.get(lastTermUuid);
190
					lastTerm = handleSingleTerm(nextLine, allVocTerms, termClass, voc, abbrevAsId, lastTerm, classDefiningTermInstance);
174 191
				}
192
				lastTermUuid = uuid;
175 193
			}
176 194

  
177 195
			return null;

Also available in: Unified diff