Revision 8422c0cd
Added by Andreas Müller almost 8 years ago
app-import/src/main/java/eu/etaxonomy/cdm/io/berlinModel/in/BerlinModelCommonNamesImport.java | ||
---|---|---|
1 | 1 |
/** |
2 | 2 |
* Copyright (C) 2007 EDIT |
3 |
* European Distributed Institute of Taxonomy
|
|
3 |
* European Distributed Institute of Taxonomy |
|
4 | 4 |
* http://www.e-taxonomy.eu |
5 |
*
|
|
5 |
* |
|
6 | 6 |
* The contents of this file are subject to the Mozilla Public License Version 1.1 |
7 | 7 |
* See LICENSE.TXT at the top of this package for the full license terms. |
8 | 8 |
*/ |
... | ... | |
52 | 52 |
import eu.etaxonomy.cdm.model.taxon.TaxonBase; |
53 | 53 |
|
54 | 54 |
/** |
55 |
*
|
|
55 |
* |
|
56 | 56 |
* @author a.mueller |
57 | 57 |
* @created 20.03.2008 |
58 | 58 |
*/ |
... | ... | |
63 | 63 |
public static final UUID REFERENCE_LANGUAGE_ISO639_2_UUID = UUID.fromString("40c4f8dd-3d9c-44a4-b77a-76e137a89a5f"); |
64 | 64 |
public static final UUID REFERENCE_LANGUAGE_STRING_UUID = UUID.fromString("2a1b678f-c27d-48c1-b43e-98fd0d426305"); |
65 | 65 |
public static final UUID STATUS_ANNOTATION_UUID = UUID.fromString("e3f7b80a-1286-458d-812c-5e818f731968"); |
66 |
|
|
66 |
|
|
67 | 67 |
public static final String NAMESPACE = "common name"; |
68 |
|
|
69 |
|
|
68 |
|
|
69 |
|
|
70 | 70 |
private static final String pluralString = "common names"; |
71 | 71 |
private static final String dbTableName = "emCommonName"; |
72 | 72 |
|
... | ... | |
77 | 77 |
public BerlinModelCommonNamesImport(){ |
78 | 78 |
super(dbTableName, pluralString); |
79 | 79 |
} |
80 |
|
|
80 |
|
|
81 | 81 |
@Override |
82 | 82 |
protected String getIdQuery(BerlinModelImportState state) { |
83 | 83 |
String result = " SELECT CommonNameId FROM emCommonName WHERE (1=1) "; |
84 | 84 |
if (StringUtils.isNotBlank(state.getConfig().getCommonNameFilter())){ |
85 | 85 |
result += " AND " + state.getConfig().getCommonNameFilter(); |
86 | 86 |
} |
87 |
|
|
87 |
|
|
88 | 88 |
return result; |
89 | 89 |
} |
90 | 90 |
|
91 | 91 |
@Override |
92 | 92 |
protected String getRecordQuery(BerlinModelImportConfigurator config) { |
93 | 93 |
String recordQuery = ""; |
94 |
recordQuery =
|
|
94 |
recordQuery = |
|
95 | 95 |
" SELECT cn.CommonNameId, cn.CommonName, PTaxon.RIdentifier AS taxonId, cn.PTNameFk, cn.RefFk AS refId, cn.Status, cn.RegionFks, cn.MisNameRefFk, " + |
96 | 96 |
" cn.NameInSourceFk, cn.Created_When, cn.Updated_When, cn.Created_Who, cn.Updated_Who, cn.Note AS Notes, languageCommonName.Language, " + |
97 | 97 |
" languageCommonName.LanguageOriginal, languageCommonName.ISO639_1, languageCommonName.ISO639_2, " + |
98 | 98 |
" emLanguageReference.RefFk AS languageRefRefFk, emLanguageReference.ReferenceShort, emLanguageReference.ReferenceLong, " + |
99 |
" emLanguageReference.LanguageFk, languageReferenceLanguage.Language AS refLanguage, languageReferenceLanguage.ISO639_2 AS refLanguageIso639_2, "+
|
|
99 |
" emLanguageReference.LanguageFk, languageReferenceLanguage.Language AS refLanguage, languageReferenceLanguage.ISO639_2 AS refLanguageIso639_2, "+ |
|
100 | 100 |
" misappliedTaxon.RIdentifier AS misappliedTaxonId " + |
101 | 101 |
" FROM PTaxon AS misappliedTaxon RIGHT OUTER JOIN " + |
102 |
" emLanguage AS languageReferenceLanguage RIGHT OUTER JOIN " +
|
|
102 |
" emLanguage AS languageReferenceLanguage RIGHT OUTER JOIN " + |
|
103 | 103 |
" emLanguageReference ON languageReferenceLanguage.LanguageId = emLanguageReference.LanguageFk RIGHT OUTER JOIN " + |
104 | 104 |
" emCommonName AS cn INNER JOIN " + |
105 | 105 |
" PTaxon ON cn.PTNameFk = PTaxon.PTNameFk AND cn.PTRefFk = PTaxon.PTRefFk ON " + |
... | ... | |
109 | 109 |
" WHERE cn.CommonNameId IN (" + ID_LIST_TOKEN + ")"; |
110 | 110 |
return recordQuery; |
111 | 111 |
} |
112 |
|
|
112 |
|
|
113 | 113 |
@Override |
114 | 114 |
protected void doInvoke(BerlinModelImportState state) { |
115 | 115 |
try { |
... | ... | |
122 | 122 |
super.doInvoke(state); |
123 | 123 |
return; |
124 | 124 |
} |
125 |
|
|
125 |
|
|
126 | 126 |
/** |
127 |
* @param state
|
|
128 |
*
|
|
127 |
* @param state |
|
128 |
* |
|
129 | 129 |
*/ |
130 | 130 |
private void makeRegions(BerlinModelImportState state) { |
131 | 131 |
try { |
132 | 132 |
SortedSet<Integer> regionFks = new TreeSet<Integer>(); |
133 | 133 |
Source source = state.getConfig().getSource(); |
134 |
|
|
134 |
|
|
135 | 135 |
//fill set with all regionFk from emCommonName.regionFks |
136 | 136 |
getRegionFks(state, regionFks, source); |
137 | 137 |
//concat filter string |
138 | 138 |
String sqlWhere = getSqlWhere(regionFks); |
139 |
|
|
139 |
|
|
140 | 140 |
//get E+M - TDWG Mapping |
141 | 141 |
Map<String, String> emTdwgMap = getEmTdwgMap(source); |
142 | 142 |
//fill regionMap |
143 | 143 |
fillRegionMap(state, sqlWhere, emTdwgMap); |
144 |
|
|
144 |
|
|
145 | 145 |
return; |
146 | 146 |
} catch (NumberFormatException e) { |
147 | 147 |
e.printStackTrace(); |
... | ... | |
158 | 158 |
@Override |
159 | 159 |
public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) { |
160 | 160 |
boolean success = true ; |
161 |
|
|
161 |
|
|
162 | 162 |
Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>(); |
163 |
Map<String, Taxon> taxonMap = (Map<String, Taxon>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);
|
|
164 |
Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
|
|
165 |
|
|
166 |
Map<String, Reference> refMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
|
|
167 |
|
|
163 |
Map<String, Taxon> taxonMap = partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE); |
|
164 |
Map<String, TaxonNameBase> taxonNameMap = partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE); |
|
165 |
|
|
166 |
Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE); |
|
167 |
|
|
168 | 168 |
Map<String, Language> iso6392Map = new HashMap<String, Language>(); |
169 |
|
|
169 |
|
|
170 | 170 |
// logger.warn("MisappliedNameRefFk not yet implemented for Common Names"); |
171 |
|
|
171 |
|
|
172 | 172 |
ResultSet rs = partitioner.getResultSet(); |
173 | 173 |
try{ |
174 | 174 |
while (rs.next()){ |
... | ... | |
190 | 190 |
String status = rs.getString("Status"); |
191 | 191 |
Integer nameInSourceFk = nullSafeInt( rs, "NameInSourceFk"); |
192 | 192 |
Integer misappliedTaxonId = nullSafeInt( rs, "misappliedTaxonId"); |
193 |
|
|
193 |
|
|
194 | 194 |
//regions |
195 | 195 |
String regionFks = rs.getString("RegionFks"); |
196 | 196 |
String[] regionFkSplit = regionFks.split(","); |
197 |
|
|
197 |
|
|
198 | 198 |
//commonNameString |
199 | 199 |
if (isBlank(commonNameString)){ |
200 | 200 |
String message = "CommonName is empty or null. Do not import record for taxon " + taxonId; |
201 | 201 |
logger.warn(message); |
202 | 202 |
continue; |
203 | 203 |
} |
204 |
|
|
204 |
|
|
205 | 205 |
//taxon |
206 | 206 |
Taxon taxon = null; |
207 | 207 |
TaxonBase<?> taxonBase = taxonMap.get(String.valueOf(taxonId)); |
... | ... | |
214 | 214 |
}else{ |
215 | 215 |
taxon = CdmBase.deproxy(taxonBase, Taxon.class); |
216 | 216 |
} |
217 |
|
|
217 |
|
|
218 | 218 |
//Language |
219 | 219 |
Language language = getAndHandleLanguage(iso6392Map, iso639_2, iso639_1, languageString, originalLanguageString, state); |
220 |
|
|
220 |
|
|
221 | 221 |
//CommonTaxonName |
222 | 222 |
List<CommonTaxonName> commonTaxonNames = new ArrayList<CommonTaxonName>(); |
223 | 223 |
for (String regionFk : regionFkSplit){ // |
... | ... | |
242 | 242 |
description.addElement(commonTaxonName); |
243 | 243 |
} |
244 | 244 |
} |
245 |
|
|
245 |
|
|
246 | 246 |
//Reference/Source |
247 | 247 |
if (! CdmUtils.nullSafeEqual(refId, languageRefRefFk)){ |
248 | 248 |
//use strRefId if languageRefFk is null |
... | ... | |
252 | 252 |
logger.warn("CommonName.RefFk (" + CdmUtils.Nz(refId) + ") and LanguageReference.RefFk " + (languageRefRefFk==null? "null" : languageRefRefFk) + " are not equal. I will import only languageReference.RefFk"); |
253 | 253 |
} |
254 | 254 |
} |
255 |
|
|
256 |
Reference<?> reference = refMap.get(String.valueOf(languageRefRefFk));
|
|
255 |
|
|
256 |
Reference reference = refMap.get(String.valueOf(languageRefRefFk)); |
|
257 | 257 |
if (reference == null && languageRefRefFk != null){ |
258 | 258 |
logger.warn("CommonName reference was null but reference exists. languageRefRefFk = " + languageRefRefFk + "; commonNameId = " + commonNameId); |
259 | 259 |
} |
260 | 260 |
String microCitation = null; |
261 | 261 |
String originalNameString = null; |
262 |
|
|
262 |
|
|
263 | 263 |
TaxonNameBase<?,?> nameUsedInSource = taxonNameMap.get(String.valueOf(nameInSourceFk)); |
264 | 264 |
if (nameInSourceFk != null && nameUsedInSource == null){ |
265 | 265 |
logger.warn("Name used in source (" + nameInSourceFk + ") was not found for common name " + commonNameId); |
... | ... | |
268 | 268 |
for (CommonTaxonName commonTaxonName : commonTaxonNames){ |
269 | 269 |
commonTaxonName.addSource(source); |
270 | 270 |
} |
271 |
|
|
272 |
|
|
271 |
|
|
272 |
|
|
273 | 273 |
//MisNameRef |
274 | 274 |
if (misNameRefFk != null){ |
275 | 275 |
//Taxon misappliedName = getMisappliedName(biblioRefMap, nomRefMap, misNameRefFk, taxon); |
... | ... | |
284 | 284 |
logger.warn("Misapplied name taxon is not of type Taxon but " + misTaxonBase.getClass().getSimpleName()); |
285 | 285 |
} |
286 | 286 |
}else{ |
287 |
|
|
288 |
Reference<?> sec = refMap.get(String.valueOf(misNameRefFk));
|
|
287 |
|
|
288 |
Reference sec = refMap.get(String.valueOf(misNameRefFk)); |
|
289 | 289 |
if (nameUsedInSource == null || sec == null){ |
290 | 290 |
logger.warn("Taxon name or misapplied name reference is null for common name " + commonNameId); |
291 | 291 |
}else{ |
... | ... | |
299 | 299 |
} |
300 | 300 |
} |
301 | 301 |
if (misappliedNameTaxon != null){ |
302 |
|
|
302 |
|
|
303 | 303 |
if (! taxon.getMisappliedNames().contains(misappliedNameTaxon)){ |
304 | 304 |
taxon.addMisappliedName(misappliedNameTaxon,state.getTransactionalSourceReference(), null); |
305 | 305 |
logger.warn("Misapplied name for common name was not found related to the accepted taxon. Created new relationship. CommonNameId: " + commonNameId); |
306 | 306 |
} |
307 |
|
|
307 |
|
|
308 | 308 |
TaxonDescription misappliedNameDescription = getDescription(misappliedNameTaxon); |
309 | 309 |
for (CommonTaxonName commonTaxonName : commonTaxonNames){ |
310 | 310 |
CommonTaxonName commonNameClone = (CommonTaxonName)commonTaxonName.clone(); |
311 | 311 |
misappliedNameDescription.addElement(commonNameClone); |
312 |
}
|
|
312 |
} |
|
313 | 313 |
}else{ |
314 | 314 |
logger.warn("Misapplied name is null for common name " + commonNameId); |
315 | 315 |
} |
316 |
|
|
316 |
|
|
317 | 317 |
} |
318 |
|
|
319 |
|
|
318 |
|
|
319 |
|
|
320 | 320 |
//reference extensions |
321 | 321 |
if (reference != null){ |
322 | 322 |
if (StringUtils.isNotBlank(refLanguage)){ |
323 | 323 |
ExtensionType refLanguageExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_STRING_UUID, "reference language","The language of the reference","ref. lang."); |
324 | 324 |
Extension.NewInstance(reference, refLanguage, refLanguageExtensionType); |
325 | 325 |
} |
326 |
|
|
326 |
|
|
327 | 327 |
if (StringUtils.isNotBlank(refLanguageIso639_2)){ |
328 | 328 |
ExtensionType refLanguageIsoExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_ISO639_2_UUID, "reference language iso 639-2","The iso 639-2 code of the references language","ref. lang. 639-2"); |
329 | 329 |
Extension.NewInstance(reference, refLanguageIso639_2, refLanguageIsoExtensionType); |
... | ... | |
331 | 331 |
}else if (isNotBlank(refLanguage) || isNotBlank(refLanguageIso639_2)){ |
332 | 332 |
logger.warn("Reference is null (" + languageRefRefFk + ") but refLanguage (" + CdmUtils.Nz(refLanguage) + ") or iso639_2 (" + CdmUtils.Nz(refLanguageIso639_2) + ") was not null for common name ("+ commonNameId +")"); |
333 | 333 |
} |
334 |
|
|
334 |
|
|
335 | 335 |
//status |
336 | 336 |
if (isNotBlank(status)){ |
337 | 337 |
AnnotationType statusAnnotationType = getAnnotationType( state, STATUS_ANNOTATION_UUID, "status","The status of this object","status", null); |
... | ... | |
340 | 340 |
commonTaxonName.addAnnotation(annotation); |
341 | 341 |
} |
342 | 342 |
} |
343 |
|
|
343 |
|
|
344 | 344 |
//Notes |
345 | 345 |
for (CommonTaxonName commonTaxonName : commonTaxonNames){ |
346 | 346 |
doIdCreatedUpdatedNotes(state, commonTaxonName, rs, String.valueOf(commonNameId), NAMESPACE); |
... | ... | |
354 | 354 |
return false; |
355 | 355 |
} catch (ClassCastException e) { |
356 | 356 |
e.printStackTrace(); |
357 |
}
|
|
358 |
|
|
357 |
} |
|
358 |
|
|
359 | 359 |
// logger.info( i + " names handled"); |
360 | 360 |
getTaxonService().save(taxaToSave); |
361 | 361 |
return success; |
... | ... | |
367 | 367 |
* @param iso639_2 |
368 | 368 |
* @param languageString |
369 | 369 |
* @param originalLanguageString |
370 |
* @param state
|
|
370 |
* @param state |
|
371 | 371 |
* @return |
372 | 372 |
*/ |
373 | 373 |
private Language getAndHandleLanguage(Map<String, Language> iso639Map, String iso639_2, String iso639_1, String languageString, String originalLanguageString, BerlinModelImportState state) { |
... | ... | |
375 | 375 |
if (isNotBlank(iso639_2)|| isNotBlank(iso639_1) ){ |
376 | 376 |
//TODO test performance, implement in state |
377 | 377 |
language = getLanguageFromIsoMap(iso639Map, iso639_2, iso639_1); |
378 |
|
|
378 |
|
|
379 | 379 |
if (language == null){ |
380 | 380 |
language = getTermService().getLanguageByIso(iso639_2); |
381 | 381 |
iso639Map.put(iso639_2, language); |
... | ... | |
437 | 437 |
getTermService().saveOrUpdate(language); |
438 | 438 |
} |
439 | 439 |
} |
440 |
|
|
440 |
|
|
441 | 441 |
} |
442 |
|
|
442 |
|
|
443 | 443 |
|
444 | 444 |
|
445 | 445 |
/** |
... | ... | |
449 | 449 |
* @param source |
450 | 450 |
* @return |
451 | 451 |
* @throws SQLException |
452 |
*
|
|
452 |
* |
|
453 | 453 |
*/ |
454 | 454 |
private void getRegionFks(BerlinModelImportState state, SortedSet<Integer> regionFks, Source source) throws SQLException { |
455 | 455 |
String sql = " SELECT DISTINCT RegionFks FROM emCommonName"; |
456 | 456 |
if (state.getConfig().getCommonNameFilter() != null){ |
457 |
sql += " WHERE " + state.getConfig().getCommonNameFilter();
|
|
457 |
sql += " WHERE " + state.getConfig().getCommonNameFilter(); |
|
458 | 458 |
} |
459 |
|
|
459 |
|
|
460 | 460 |
ResultSet rs = source.getResultSet(sql); |
461 | 461 |
while (rs.next()){ |
462 |
String strRegionFks = rs.getString("RegionFks");
|
|
462 |
String strRegionFks = rs.getString("RegionFks"); |
|
463 | 463 |
if (isBlank(strRegionFks)){ |
464 | 464 |
continue; |
465 | 465 |
} |
466 |
|
|
466 |
|
|
467 | 467 |
String[] regionFkArray = strRegionFks.split(","); |
468 | 468 |
for (String regionFk: regionFkArray){ |
469 | 469 |
regionFk = regionFk.trim(); |
... | ... | |
526 | 526 |
/** |
527 | 527 |
* Returns the are for a given TDWG code. See {@link #getEmTdwgMap(Source)} for exceptions from |
528 | 528 |
* the TDWG code |
529 |
* @param state
|
|
529 |
* @param state |
|
530 | 530 |
* @param tdwgCode |
531 | 531 |
*/ |
532 | 532 |
private NamedArea getNamedArea(BerlinModelImportState state, String tdwgCode) { |
... | ... | |
559 | 559 |
private String getSqlWhere(SortedSet<Integer> regionFks) { |
560 | 560 |
String sqlWhere = ""; |
561 | 561 |
for (Integer regionFk : regionFks){ |
562 |
sqlWhere += regionFk + ",";
|
|
562 |
sqlWhere += regionFk + ","; |
|
563 | 563 |
} |
564 | 564 |
sqlWhere = sqlWhere.substring(0, sqlWhere.length()-1); |
565 | 565 |
return sqlWhere; |
... | ... | |
567 | 567 |
|
568 | 568 |
/** |
569 | 569 |
* Returns a map which is filled by the emCode->TdwgCode mapping defined in emArea. |
570 |
* Some exceptions are defined for emCode 'Ab','Rf','Uk' and some additional mapping is added
|
|
570 |
* Some exceptions are defined for emCode 'Ab','Rf','Uk' and some additional mapping is added |
|
571 | 571 |
* for 'Ab / Ab(A)', 'Ga / Ga(F)', 'It / It(I)', 'Ar / Ar(A)','Hs / Hs(S)' |
572 | 572 |
* @param source |
573 | 573 |
* @throws SQLException |
... | ... | |
583 | 583 |
String TDWGCode = rs.getString("TDWGCode"); |
584 | 584 |
if (StringUtils.isNotBlank(emCode) ){ |
585 | 585 |
emCode = emCode.trim(); |
586 |
if (emCode.equalsIgnoreCase("Ab") || emCode.equalsIgnoreCase("Rf")||
|
|
586 |
if (emCode.equalsIgnoreCase("Ab") || emCode.equalsIgnoreCase("Rf")|| |
|
587 | 587 |
emCode.equalsIgnoreCase("Uk") || emCode.equalsIgnoreCase("Gg")){ |
588 | 588 |
emTdwgMap.put(emCode, emCode); |
589 | 589 |
}else if (StringUtils.isNotBlank(TDWGCode)){ |
... | ... | |
597 | 597 |
emTdwgMap.put("Uk / Uk(U)", "Uk"); |
598 | 598 |
emTdwgMap.put("Ar / Ar(A)", "TCS-AR"); |
599 | 599 |
emTdwgMap.put("Hs / Hs(S)", "SPA-SP"); |
600 |
|
|
600 |
|
|
601 | 601 |
return emTdwgMap; |
602 | 602 |
} |
603 | 603 |
|
... | ... | |
626 | 626 |
Class<?> cdmClass; |
627 | 627 |
Set<String> idSet; |
628 | 628 |
Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>(); |
629 |
|
|
629 |
|
|
630 | 630 |
String pos = "0"; |
631 | 631 |
try{ |
632 | 632 |
Set<String> taxonIdSet = new HashSet<String>(); |
... | ... | |
641 | 641 |
handleForeignKey(rs, nameIdSet, "PTNameFk"); |
642 | 642 |
handleForeignKey(rs, referenceIdSet, "MisNameRefFk"); |
643 | 643 |
} |
644 |
|
|
644 |
|
|
645 | 645 |
//name map |
646 | 646 |
nameSpace = BerlinModelTaxonNameImport.NAMESPACE; |
647 | 647 |
cdmClass = TaxonNameBase.class; |
648 | 648 |
idSet = nameIdSet; |
649 | 649 |
Map<String, TaxonNameBase<?,?>> nameMap = (Map<String, TaxonNameBase<?,?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace); |
650 | 650 |
result.put(nameSpace, nameMap); |
651 |
|
|
651 |
|
|
652 | 652 |
//taxon map |
653 | 653 |
nameSpace = BerlinModelTaxonImport.NAMESPACE; |
654 | 654 |
cdmClass = TaxonBase.class; |
655 | 655 |
idSet = taxonIdSet; |
656 | 656 |
Map<String, TaxonBase<?>> taxonMap = (Map<String, TaxonBase<?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace); |
657 | 657 |
result.put(nameSpace, taxonMap); |
658 |
|
|
658 |
|
|
659 | 659 |
//reference map |
660 | 660 |
nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE; |
661 | 661 |
cdmClass = Reference.class; |
... | ... | |
670 | 670 |
} |
671 | 671 |
return result; |
672 | 672 |
} |
673 |
|
|
673 |
|
|
674 | 674 |
|
675 | 675 |
@Override |
676 | 676 |
protected boolean doCheck(BerlinModelImportState state){ |
Also available in: Unified diff
Remove generics from Reference in cdmlib-app #5830