Revision 749a2e19
Added by Andreas Müller over 2 years ago
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
ref #9477 fix term loading for ordered new terms