1
|
/**
|
2
|
* Copyright (C) 2007 EDIT
|
3
|
* European Distributed Institute of Taxonomy
|
4
|
* http://www.e-taxonomy.eu
|
5
|
*
|
6
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
7
|
* See LICENSE.TXT at the top of this package for the full license terms.
|
8
|
*/
|
9
|
|
10
|
package eu.etaxonomy.cdm.io.berlinModel.in;
|
11
|
|
12
|
import java.sql.ResultSet;
|
13
|
import java.sql.SQLException;
|
14
|
import java.util.ArrayList;
|
15
|
import java.util.HashMap;
|
16
|
import java.util.HashSet;
|
17
|
import java.util.List;
|
18
|
import java.util.Map;
|
19
|
import java.util.Set;
|
20
|
import java.util.SortedSet;
|
21
|
import java.util.TreeSet;
|
22
|
import java.util.UUID;
|
23
|
|
24
|
import org.apache.commons.lang.StringUtils;
|
25
|
import org.apache.log4j.Logger;
|
26
|
import org.springframework.stereotype.Component;
|
27
|
|
28
|
import eu.etaxonomy.cdm.common.CdmUtils;
|
29
|
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelCommonNamesImportValidator;
|
30
|
import eu.etaxonomy.cdm.io.common.IOValidator;
|
31
|
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
|
32
|
import eu.etaxonomy.cdm.io.common.Source;
|
33
|
import eu.etaxonomy.cdm.model.common.Annotation;
|
34
|
import eu.etaxonomy.cdm.model.common.AnnotationType;
|
35
|
import eu.etaxonomy.cdm.model.common.CdmBase;
|
36
|
import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
|
37
|
import eu.etaxonomy.cdm.model.common.Extension;
|
38
|
import eu.etaxonomy.cdm.model.common.ExtensionType;
|
39
|
import eu.etaxonomy.cdm.model.common.Language;
|
40
|
import eu.etaxonomy.cdm.model.common.Representation;
|
41
|
import eu.etaxonomy.cdm.model.description.CommonTaxonName;
|
42
|
import eu.etaxonomy.cdm.model.description.TaxonDescription;
|
43
|
import eu.etaxonomy.cdm.model.location.NamedArea;
|
44
|
import eu.etaxonomy.cdm.model.location.TdwgArea;
|
45
|
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
|
46
|
import eu.etaxonomy.cdm.model.reference.Reference;
|
47
|
import eu.etaxonomy.cdm.model.taxon.Taxon;
|
48
|
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
|
49
|
|
50
|
/**
|
51
|
*
|
52
|
* @author a.mueller
|
53
|
* @created 20.03.2008
|
54
|
* @version 1.0
|
55
|
*/
|
56
|
@Component
|
57
|
public class BerlinModelCommonNamesImport extends BerlinModelImportBase {
|
58
|
private static final Logger logger = Logger.getLogger(BerlinModelCommonNamesImport.class);
|
59
|
|
60
|
public static final UUID REFERENCE_LANGUAGE_ISO639_2_UUID = UUID.fromString("40c4f8dd-3d9c-44a4-b77a-76e137a89a5f");
|
61
|
public static final UUID REFERENCE_LANGUAGE_STRING_UUID = UUID.fromString("2a1b678f-c27d-48c1-b43e-98fd0d426305");
|
62
|
public static final UUID STATUS_ANNOTATION_UUID = UUID.fromString("e3f7b80a-1286-458d-812c-5e818f731968");
|
63
|
|
64
|
public static final String NAMESPACE = "common name";
|
65
|
|
66
|
|
67
|
private static final String pluralString = "common names";
|
68
|
private static final String dbTableName = "emCommonName";
|
69
|
|
70
|
|
71
|
//map that stores the regions (named areas) and makes them accessible via the regionFk
|
72
|
private Map<String, NamedArea> regionMap = new HashMap<String, NamedArea>();
|
73
|
|
74
|
|
75
|
|
76
|
public BerlinModelCommonNamesImport(){
|
77
|
super();
|
78
|
}
|
79
|
|
80
|
|
81
|
|
82
|
@Override
|
83
|
protected String getIdQuery() {
|
84
|
String result = " SELECT CommonNameId FROM emCommonName ";
|
85
|
return result;
|
86
|
}
|
87
|
|
88
|
|
89
|
|
90
|
/* (non-Javadoc)
|
91
|
* @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
|
92
|
*/
|
93
|
@Override
|
94
|
protected String getRecordQuery(BerlinModelImportConfigurator config) {
|
95
|
String recordQuery = "";
|
96
|
recordQuery =
|
97
|
" SELECT emCommonName.CommonNameId, emCommonName.CommonName, PTaxon.RIdentifier AS taxonId, emCommonName.PTNameFk, emCommonName.RefFk AS refId, emCommonName.Status, " +
|
98
|
" emCommonName.RegionFks, emCommonName.MisNameRefFk, emCommonName.NameInSourceFk , emCommonName.Created_When, emCommonName.Updated_When, emCommonName.Created_Who, emCommonName.Updated_Who, emCommonName.Note as Notes," +
|
99
|
" regionLanguage.Language AS regionLanguage, languageCommonName.Language, languageCommonName.LanguageOriginal, languageCommonName.ISO639_1, languageCommonName.ISO639_2, " +
|
100
|
" emLanguageRegion.Region, emLanguageReference.RefFk as languageRefRefFk, emLanguageReference.ReferenceShort, " +
|
101
|
" emLanguageReference.ReferenceLong, emLanguageReference.LanguageFk, languageReferenceLanguage.Language AS refLanguage, " +
|
102
|
" languageReferenceLanguage.ISO639_2 AS refLanguageIso639_2, regionLanguage.ISO639_2 AS regionLanguageIso, " +
|
103
|
" misappliedTaxon.RIdentifier AS misappliedTaxonId " +
|
104
|
" FROM emLanguage as regionLanguage RIGHT OUTER JOIN " +
|
105
|
" emLanguageRegion ON regionLanguage.LanguageId = emLanguageRegion.LanguageFk RIGHT OUTER JOIN " +
|
106
|
" emLanguage AS languageReferenceLanguage RIGHT OUTER JOIN " +
|
107
|
" emLanguageReference ON languageReferenceLanguage.LanguageId = emLanguageReference.LanguageFk RIGHT OUTER JOIN " +
|
108
|
" emCommonName INNER JOIN " +
|
109
|
" PTaxon ON emCommonName.PTNameFk = PTaxon.PTNameFk AND emCommonName.PTRefFk = PTaxon.PTRefFk ON " +
|
110
|
" emLanguageReference.ReferenceId = emCommonName.LanguageRefFk LEFT OUTER JOIN " +
|
111
|
" emLanguage AS languageCommonName ON emCommonName.LanguageFk = languageCommonName.LanguageId ON " +
|
112
|
" emLanguageRegion.RegionId = emCommonName.RegionFks LEFT OUTER JOIN " +
|
113
|
" PTaxon as misappliedTaxon ON emCommonName.PTNameFk = misappliedTaxon.PTNameFk AND emCommonName.MisNameRefFk = misappliedTaxon.PTRefFk " +
|
114
|
" WHERE emCommonName.CommonNameId IN (" + ID_LIST_TOKEN + ")";
|
115
|
return recordQuery;
|
116
|
}
|
117
|
|
118
|
|
119
|
|
120
|
@Override
|
121
|
protected void doInvoke(BerlinModelImportState state) {
|
122
|
try {
|
123
|
makeRegions(state);
|
124
|
} catch (Exception e) {
|
125
|
logger.error("Error when creating common name regions:" + e.getMessage());
|
126
|
state.setUnsuccessfull();
|
127
|
}
|
128
|
super.doInvoke(state);
|
129
|
return;
|
130
|
}
|
131
|
|
132
|
/**
|
133
|
* @param state
|
134
|
*
|
135
|
*/
|
136
|
private void makeRegions(BerlinModelImportState state) {
|
137
|
try {
|
138
|
SortedSet<Integer> regionFks = new TreeSet<Integer>();
|
139
|
Source source = state.getConfig().getSource();
|
140
|
|
141
|
getRegionFks(state, regionFks, source);
|
142
|
//concat filter string
|
143
|
String sqlWhere = getSqlWhere(regionFks);
|
144
|
|
145
|
//get E+M - TDWG Mapping
|
146
|
Map<String, String> emTdwgMap = getEmTdwgMap(source);
|
147
|
//fill regionMap
|
148
|
fillRegionMap(source, sqlWhere, emTdwgMap);
|
149
|
|
150
|
return;
|
151
|
} catch (NumberFormatException e) {
|
152
|
e.printStackTrace();
|
153
|
state.setUnsuccessfull();
|
154
|
return;
|
155
|
} catch (SQLException e) {
|
156
|
e.printStackTrace();
|
157
|
state.setUnsuccessfull();
|
158
|
return;
|
159
|
}
|
160
|
}
|
161
|
|
162
|
|
163
|
/* (non-Javadoc)
|
164
|
* @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
|
165
|
*/
|
166
|
public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
|
167
|
boolean success = true ;
|
168
|
BerlinModelImportConfigurator config = state.getConfig();
|
169
|
Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();
|
170
|
Map<String, Taxon> taxonMap = (Map<String, Taxon>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);
|
171
|
Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
|
172
|
|
173
|
Map<String, Reference> biblioRefMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
|
174
|
Map<String, Reference> nomRefMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
|
175
|
|
176
|
Map<String, Language> iso6392Map = new HashMap<String, Language>();
|
177
|
|
178
|
// logger.warn("MisappliedNameRefFk not yet implemented for Common Names");
|
179
|
|
180
|
ResultSet rs = partitioner.getResultSet();
|
181
|
try{
|
182
|
while (rs.next()){
|
183
|
|
184
|
//create TaxonName element
|
185
|
Object commonNameId = rs.getObject("CommonNameId");
|
186
|
int taxonId = rs.getInt("taxonId");
|
187
|
Object refId = rs.getObject("refId");
|
188
|
Object ptNameFk = rs.getObject("PTNameFk");
|
189
|
String commonNameString = rs.getString("CommonName");
|
190
|
String iso639_2 = rs.getString("ISO639_2");
|
191
|
String iso639_1 = rs.getString("ISO639_1");
|
192
|
String languageString = rs.getString("Language");
|
193
|
String originalLanguageString = rs.getString("LanguageOriginal");
|
194
|
Object misNameRefFk = rs.getObject("MisNameRefFk");
|
195
|
Object languageRefRefFk = rs.getObject("languageRefRefFk");
|
196
|
String refLanguage = rs.getString("refLanguage");
|
197
|
String refLanguageIso639_2 = rs.getString("refLanguageIso639_2");
|
198
|
String status = rs.getString("Status");
|
199
|
Object nameInSourceFk = rs.getObject("NameInSourceFk");
|
200
|
Object misappliedTaxonId = rs.getObject("misappliedTaxonId");
|
201
|
|
202
|
//regions
|
203
|
String region = rs.getString("Region");
|
204
|
String regionFks = rs.getString("RegionFks");
|
205
|
String[] regionFkSplit = regionFks.split(",");
|
206
|
|
207
|
//commonNameString
|
208
|
if (CdmUtils.isEmpty(commonNameString)){
|
209
|
String message = "CommonName is empty or null. Do not import record for taxon " + taxonId;
|
210
|
logger.warn(message);
|
211
|
continue;
|
212
|
}
|
213
|
|
214
|
//taxon
|
215
|
Taxon taxon = null;
|
216
|
TaxonBase taxonBase = null;
|
217
|
taxonBase = taxonMap.get(String.valueOf(taxonId));
|
218
|
if (taxonBase == null){
|
219
|
logger.warn("Taxon (" + taxonId + ") could not be found. Common name " + commonNameString + " not imported");
|
220
|
continue;
|
221
|
}else if (! taxonBase.isInstanceOf(Taxon.class)){
|
222
|
logger.warn("taxon (" + taxonId + ") is not accepted. Can't import common name " + commonNameId);
|
223
|
continue;
|
224
|
}else{
|
225
|
taxon = CdmBase.deproxy(taxonBase, Taxon.class);
|
226
|
}
|
227
|
|
228
|
//Language
|
229
|
Language language = getAndHandleLanguage(iso6392Map, iso639_2, iso639_1, languageString, originalLanguageString);
|
230
|
|
231
|
//CommonTaxonName
|
232
|
List<CommonTaxonName> commonTaxonNames = new ArrayList<CommonTaxonName>();
|
233
|
for (String regionFk : regionFkSplit){ //
|
234
|
CommonTaxonName commonTaxonName;
|
235
|
if (commonTaxonNames.size() == 0){
|
236
|
commonTaxonName = CommonTaxonName.NewInstance(commonNameString, language);
|
237
|
}else{
|
238
|
commonTaxonName = (CommonTaxonName)commonTaxonNames.get(0).clone();
|
239
|
}
|
240
|
commonTaxonNames.add(commonTaxonName);
|
241
|
regionFk = regionFk.trim();
|
242
|
NamedArea area = regionMap.get(regionFk);
|
243
|
if (area == null){
|
244
|
if (regionFkSplit.length > 1 && StringUtils.isNotBlank(regionFk)){
|
245
|
logger.warn("Area for " + regionFk + " not defined.");
|
246
|
}else{
|
247
|
//no region is defined
|
248
|
}
|
249
|
}else{
|
250
|
commonTaxonName.setArea(area);
|
251
|
TaxonDescription description = getDescription(taxon);
|
252
|
description.addElement(commonTaxonName);
|
253
|
}
|
254
|
}
|
255
|
|
256
|
//Reference/Source
|
257
|
String strRefId = String.valueOf(refId);
|
258
|
String languageRefFk = String.valueOf(languageRefRefFk);
|
259
|
if (! CdmUtils.nullSafeEqual(strRefId, languageRefFk)){
|
260
|
//use strRefId if languageRefFk is null
|
261
|
if (languageRefRefFk == null){
|
262
|
languageRefFk = strRefId;
|
263
|
}else{
|
264
|
logger.warn("CommonName.RefFk (" + CdmUtils.Nz(strRefId) + ") and LanguageReference.RefFk " + CdmUtils.Nz(languageRefFk) + " are not equal. I will import only languageReference.RefFk");
|
265
|
}
|
266
|
}
|
267
|
|
268
|
|
269
|
Reference reference = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(languageRefRefFk));
|
270
|
String microCitation = null;
|
271
|
String originalNameString = null;
|
272
|
|
273
|
TaxonNameBase nameUsedInSource = taxonNameMap.get(String.valueOf(nameInSourceFk));
|
274
|
if (nameInSourceFk != null && nameUsedInSource == null){
|
275
|
logger.warn("Name used in source (" + nameInSourceFk + ") was not found");
|
276
|
}
|
277
|
DescriptionElementSource source = DescriptionElementSource.NewInstance(reference, microCitation, nameUsedInSource, originalNameString);
|
278
|
for (CommonTaxonName commonTaxonName : commonTaxonNames){
|
279
|
commonTaxonName.addSource(source);
|
280
|
}
|
281
|
|
282
|
//MisNameRef
|
283
|
if (misNameRefFk != null){
|
284
|
//Taxon misappliedName = getMisappliedName(biblioRefMap, nomRefMap, misNameRefFk, taxon);
|
285
|
Taxon misappliedName = null;
|
286
|
if (misappliedTaxonId != null){
|
287
|
misappliedName = taxonMap.get(String.valueOf(misappliedTaxonId));
|
288
|
}else{
|
289
|
TaxonNameBase taxonName = taxonNameMap.get(String.valueOf(ptNameFk));
|
290
|
Reference sec = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(misNameRefFk));
|
291
|
if (taxonName == null || sec == null){
|
292
|
logger.info("Taxon name or misapplied name reference is null for common name " + commonNameId);
|
293
|
}else{
|
294
|
misappliedName = Taxon.NewInstance(taxonName, sec);
|
295
|
taxaToSave.add(misappliedName);
|
296
|
}
|
297
|
}
|
298
|
if (misappliedName != null){
|
299
|
taxon.addMisappliedName(misappliedName, config.getSourceReference(), null);
|
300
|
TaxonDescription misappliedNameDescription = getDescription(misappliedName);
|
301
|
for (CommonTaxonName commonTaxonName : commonTaxonNames){
|
302
|
CommonTaxonName commonNameClone = (CommonTaxonName)commonTaxonName.clone();
|
303
|
misappliedNameDescription.addElement(commonNameClone);
|
304
|
}
|
305
|
}else{
|
306
|
logger.warn("Misapplied name is null for common name " + commonNameId);
|
307
|
}
|
308
|
|
309
|
}
|
310
|
|
311
|
|
312
|
//reference extensions
|
313
|
if (reference != null){
|
314
|
if (CdmUtils.isNotEmpty(refLanguage)){
|
315
|
ExtensionType refLanguageExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_STRING_UUID, "reference language","The language of the reference","ref. lang.");
|
316
|
Extension.NewInstance(reference, refLanguage, refLanguageExtensionType);
|
317
|
}
|
318
|
|
319
|
if (CdmUtils.isNotEmpty(refLanguageIso639_2)){
|
320
|
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");
|
321
|
Extension.NewInstance(reference, refLanguageIso639_2, refLanguageIsoExtensionType);
|
322
|
}
|
323
|
}else if (CdmUtils.isNotEmpty(refLanguage) || CdmUtils.isNotEmpty(refLanguageIso639_2)){
|
324
|
logger.warn("Reference is null (" + languageRefRefFk + ") but refLanguage (" + CdmUtils.Nz(refLanguage) + ") or iso639_2 (" + CdmUtils.Nz(refLanguageIso639_2) + ") was not null");
|
325
|
}
|
326
|
|
327
|
//status
|
328
|
if (CdmUtils.isNotEmpty(status)){
|
329
|
AnnotationType statusAnnotationType = getAnnotationType( state, STATUS_ANNOTATION_UUID, "status","The status of this object","status");
|
330
|
Annotation annotation = Annotation.NewInstance(status, statusAnnotationType, Language.DEFAULT());
|
331
|
for (CommonTaxonName commonTaxonName : commonTaxonNames){
|
332
|
commonTaxonName.addAnnotation(annotation);
|
333
|
}
|
334
|
|
335
|
}
|
336
|
|
337
|
//Notes
|
338
|
for (CommonTaxonName commonTaxonName : commonTaxonNames){
|
339
|
doIdCreatedUpdatedNotes(state, commonTaxonName, rs, String.valueOf(commonNameId), NAMESPACE);
|
340
|
}
|
341
|
partitioner.startDoSave();
|
342
|
taxaToSave.add(taxon);
|
343
|
|
344
|
}
|
345
|
} catch (SQLException e) {
|
346
|
logger.error("SQLException:" + e);
|
347
|
return false;
|
348
|
} catch (ClassCastException e) {
|
349
|
e.printStackTrace();
|
350
|
}
|
351
|
|
352
|
// logger.info( i + " names handled");
|
353
|
getTaxonService().save(taxaToSave);
|
354
|
return success;
|
355
|
|
356
|
}
|
357
|
|
358
|
|
359
|
|
360
|
/**
|
361
|
* Not used anymore. Use MisappliedName RIdentifier instead
|
362
|
* @param biblioRefMap
|
363
|
* @param nomRefMap
|
364
|
* @param misNameRefFk
|
365
|
* @param taxon
|
366
|
*/
|
367
|
private boolean isFirstMisappliedName = true;
|
368
|
private Taxon getMisappliedName(Map<String, Reference> biblioRefMap, Map<String, Reference> nomRefMap,
|
369
|
Object misNameRefFk, Taxon taxon) {
|
370
|
Taxon misappliedTaxon = null;
|
371
|
Reference misNameRef = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(misNameRefFk));
|
372
|
misappliedTaxon = Taxon.NewInstance(taxon.getName(), misNameRef);
|
373
|
Set<String> includeProperty = new HashSet<String>();
|
374
|
try {
|
375
|
// //IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(TaxonBase.class);
|
376
|
// //List<TaxonBase> misappliedList1 = getCommonService().findMatching(misappliedTaxon, matchStrategy);
|
377
|
List<TaxonBase> misappliedList = getTaxonService().list(misappliedTaxon, includeProperty, null, null, null, null);
|
378
|
if (misappliedList.size() > 0){
|
379
|
misappliedTaxon = CdmBase.deproxy(misappliedList.get(0), Taxon.class);
|
380
|
}
|
381
|
} catch (ClassCastException e) {
|
382
|
logger.error(e.getMessage());
|
383
|
if (isFirstMisappliedName){
|
384
|
e.printStackTrace();
|
385
|
isFirstMisappliedName = false;
|
386
|
}
|
387
|
}
|
388
|
return misappliedTaxon;
|
389
|
}
|
390
|
|
391
|
|
392
|
|
393
|
/**
|
394
|
* @param iso6392Map
|
395
|
* @param iso639_2
|
396
|
* @param languageString
|
397
|
* @param originalLanguageString
|
398
|
* @return
|
399
|
*/
|
400
|
private Language getAndHandleLanguage(Map<String, Language> iso639Map, String iso639_2, String iso639_1, String languageString, String originalLanguageString) {
|
401
|
Language language;
|
402
|
if (CdmUtils.isNotEmpty(iso639_2)|| CdmUtils.isNotEmpty(iso639_1) ){
|
403
|
//TODO test performance, implement in state
|
404
|
language = getLanguageFromIsoMap(iso639Map, iso639_2, iso639_1);
|
405
|
|
406
|
if (language == null){
|
407
|
language = getTermService().getLanguageByIso(iso639_2);
|
408
|
iso639Map.put(iso639_2, language);
|
409
|
if (language == null){
|
410
|
language = getTermService().getLanguageByIso(iso639_1);
|
411
|
iso639Map.put(iso639_1, language);
|
412
|
}
|
413
|
if (language == null){
|
414
|
logger.warn("Language for code ISO693-2 '" + iso639_2 + "' and ISO693-1 '" + iso639_1 + "' was not found");
|
415
|
}
|
416
|
}
|
417
|
} else if ("unknown".equals(languageString)){
|
418
|
language = Language.UNKNOWN_LANGUAGE();
|
419
|
}else{
|
420
|
logger.warn("language ISO 639_1 and ISO 639_2 were empty for " + languageString);
|
421
|
language = null;
|
422
|
}
|
423
|
addOriginalLanguage(language, originalLanguageString);
|
424
|
return language;
|
425
|
}
|
426
|
|
427
|
|
428
|
/**
|
429
|
* @param iso639Map
|
430
|
* @param iso639_2
|
431
|
* @param iso639_1
|
432
|
* @return
|
433
|
*/
|
434
|
private Language getLanguageFromIsoMap(Map<String, Language> iso639Map, String iso639_2, String iso639_1) {
|
435
|
Language language;
|
436
|
language = iso639Map.get(iso639_2);
|
437
|
if (language == null){
|
438
|
language = iso639Map.get(iso639_1);
|
439
|
}
|
440
|
return language;
|
441
|
}
|
442
|
|
443
|
/**
|
444
|
* @param language
|
445
|
* @param originalLanguageString
|
446
|
*/
|
447
|
private void addOriginalLanguage(Language language, String originalLanguageString) {
|
448
|
if (CdmUtils.isEmpty(originalLanguageString)){
|
449
|
return;
|
450
|
}else if (language == null){
|
451
|
logger.warn("Language could not be defined, but originalLanguageString exists: " + originalLanguageString);
|
452
|
}else {
|
453
|
Representation representation = language.getRepresentation(language);
|
454
|
if (representation == null){
|
455
|
language.addRepresentation(Representation.NewInstance(originalLanguageString, originalLanguageString, originalLanguageString, language));
|
456
|
getTermService().saveOrUpdate(language);
|
457
|
}
|
458
|
}
|
459
|
|
460
|
}
|
461
|
|
462
|
|
463
|
|
464
|
/**
|
465
|
* @param state
|
466
|
* @param regionFks
|
467
|
* @param source
|
468
|
* @return
|
469
|
* @throws SQLException
|
470
|
*/
|
471
|
private void getRegionFks(BerlinModelImportState state, SortedSet<Integer> regionFks,
|
472
|
Source source) throws SQLException {
|
473
|
String sql = " SELECT DISTINCT RegionFks FROM emCommonName";
|
474
|
ResultSet rs = source.getResultSet(sql);
|
475
|
while (rs.next()){
|
476
|
String strRegionFks = rs.getString("RegionFks");
|
477
|
String[] regionFkArray = strRegionFks.split(",");
|
478
|
for (String regionFk: regionFkArray){
|
479
|
regionFk = regionFk.trim();
|
480
|
if (! StringUtils.isNumeric(regionFk) || "".equals(regionFk) ){
|
481
|
state.setUnsuccessfull();
|
482
|
logger.warn("RegionFk is not numeric: " + regionFk);
|
483
|
}else{
|
484
|
regionFks.add(Integer.valueOf(regionFk));
|
485
|
}
|
486
|
}
|
487
|
}
|
488
|
return;
|
489
|
}
|
490
|
|
491
|
|
492
|
|
493
|
/**
|
494
|
* @param source
|
495
|
* @param sqlWhere
|
496
|
* @param emTdwgMap
|
497
|
* @throws SQLException
|
498
|
*/
|
499
|
private void fillRegionMap(Source source, String sqlWhere,
|
500
|
Map<String, String> emTdwgMap) throws SQLException {
|
501
|
String sql;
|
502
|
ResultSet rs;
|
503
|
sql = " SELECT RegionId, Region FROM emLanguageRegion WHERE RegionId IN ("+ sqlWhere+ ") ";
|
504
|
rs = source.getResultSet(sql);
|
505
|
while (rs.next()){
|
506
|
Object regionId = rs.getObject("RegionId");
|
507
|
String region = rs.getString("Region");
|
508
|
String[] splitRegion = region.split("-");
|
509
|
if (splitRegion.length <= 1){
|
510
|
NamedArea newArea = NamedArea.NewInstance(region, region, null);
|
511
|
getTermService().save(newArea);
|
512
|
regionMap.put(String.valueOf(regionId), newArea);
|
513
|
logger.warn("Found new area: " + region);
|
514
|
}else if (splitRegion.length == 2){
|
515
|
String emCode = splitRegion[1].trim();
|
516
|
String tdwgCode = emTdwgMap.get(emCode);
|
517
|
if (StringUtils.isNotBlank(tdwgCode) ){
|
518
|
NamedArea tdwgArea = getNamedArea(tdwgCode);
|
519
|
regionMap.put(String.valueOf(regionId), tdwgArea);
|
520
|
}else{
|
521
|
logger.warn("emCode did not map to valid tdwgCode: " + CdmUtils.Nz(emCode) + "->" + CdmUtils.Nz(tdwgCode));
|
522
|
}
|
523
|
}
|
524
|
}
|
525
|
}
|
526
|
|
527
|
|
528
|
/**
|
529
|
* @param tdwgCode
|
530
|
*/
|
531
|
private NamedArea getNamedArea(String tdwgCode) {
|
532
|
NamedArea area;
|
533
|
if (tdwgCode.equalsIgnoreCase("Ab")){
|
534
|
area = NamedArea.NewInstance("Azerbaijan (including Nakhichevan)", "Azerbaijan & Nakhichevan", "Ab");
|
535
|
getTermService().save(area);
|
536
|
}else if (tdwgCode.equalsIgnoreCase("Rf")){
|
537
|
area = NamedArea.NewInstance("The Russian Federation", "The Russian Federation", "Rf");
|
538
|
getTermService().save(area);
|
539
|
}else if (tdwgCode.equalsIgnoreCase("Uk")){
|
540
|
area = NamedArea.NewInstance("Ukraine (including Crimea)", "Ukraine & Crimea", "Uk");
|
541
|
getTermService().save(area);
|
542
|
}else{
|
543
|
area = TdwgArea.getAreaByTdwgAbbreviation(tdwgCode);
|
544
|
}
|
545
|
return area;
|
546
|
}
|
547
|
|
548
|
|
549
|
|
550
|
/**
|
551
|
* @param regionFks
|
552
|
* @return
|
553
|
*/
|
554
|
private String getSqlWhere(SortedSet<Integer> regionFks) {
|
555
|
String sqlWhere = "";
|
556
|
for (Integer regionFk : regionFks){
|
557
|
sqlWhere += regionFk + ",";
|
558
|
}
|
559
|
sqlWhere = sqlWhere.substring(0, sqlWhere.length()-1);
|
560
|
return sqlWhere;
|
561
|
}
|
562
|
|
563
|
|
564
|
|
565
|
/**
|
566
|
* @param source
|
567
|
* @throws SQLException
|
568
|
*/
|
569
|
private Map<String, String> getEmTdwgMap(Source source) throws SQLException {
|
570
|
String sql;
|
571
|
ResultSet rs;
|
572
|
Map<String, String> emTdwgMap = new HashMap<String, String>();
|
573
|
sql = " SELECT EmCode, TDWGCode FROM emArea ";
|
574
|
rs = source.getResultSet(sql);
|
575
|
while (rs.next()){
|
576
|
String emCode = rs.getString("EMCode");
|
577
|
String TDWGCode = rs.getString("TDWGCode");
|
578
|
if (StringUtils.isNotBlank(emCode) ){
|
579
|
emCode = emCode.trim();
|
580
|
if (emCode.equalsIgnoreCase("Ab") || emCode.equalsIgnoreCase("Rf")|| emCode.equalsIgnoreCase("Uk") ){
|
581
|
emTdwgMap.put(emCode, emCode);
|
582
|
}else if (StringUtils.isNotBlank(TDWGCode)){
|
583
|
emTdwgMap.put(emCode, TDWGCode.trim());
|
584
|
}
|
585
|
}
|
586
|
}
|
587
|
return emTdwgMap;
|
588
|
}
|
589
|
|
590
|
|
591
|
|
592
|
|
593
|
/**
|
594
|
* Returns the first non-image gallery description. Creates a new one if no description exists.
|
595
|
* @param taxon
|
596
|
* @return
|
597
|
*/
|
598
|
private TaxonDescription getDescription(Taxon taxon) {
|
599
|
TaxonDescription result = null;
|
600
|
for (TaxonDescription taxonDescription : taxon.getDescriptions()){
|
601
|
if (! taxonDescription.isImageGallery()){
|
602
|
result = taxonDescription;
|
603
|
}
|
604
|
}
|
605
|
if (result == null){
|
606
|
result = TaxonDescription.NewInstance(taxon);
|
607
|
}
|
608
|
return result;
|
609
|
}
|
610
|
|
611
|
/* (non-Javadoc)
|
612
|
* @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
|
613
|
*/
|
614
|
public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
|
615
|
String nameSpace;
|
616
|
Class cdmClass;
|
617
|
Set<String> idSet;
|
618
|
Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
|
619
|
|
620
|
try{
|
621
|
Set<String> taxonIdSet = new HashSet<String>();
|
622
|
Set<String> nameIdSet = new HashSet<String>();
|
623
|
Set<String> referenceIdSet = new HashSet<String>();
|
624
|
while (rs.next()){
|
625
|
handleForeignKey(rs, taxonIdSet, "taxonId");
|
626
|
handleForeignKey(rs, taxonIdSet, "misappliedTaxonId");
|
627
|
handleForeignKey(rs, referenceIdSet, "refId");
|
628
|
handleForeignKey(rs, referenceIdSet, "languageRefRefFk");
|
629
|
handleForeignKey(rs, nameIdSet, "NameInSourceFk");
|
630
|
handleForeignKey(rs, nameIdSet, "PTNameFk");
|
631
|
handleForeignKey(rs, referenceIdSet, "MisNameRefFk");
|
632
|
}
|
633
|
|
634
|
//name map
|
635
|
nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
|
636
|
cdmClass = TaxonNameBase.class;
|
637
|
idSet = nameIdSet;
|
638
|
Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
|
639
|
result.put(nameSpace, nameMap);
|
640
|
|
641
|
//name map
|
642
|
nameSpace = BerlinModelTaxonImport.NAMESPACE;
|
643
|
cdmClass = Taxon.class;
|
644
|
idSet = taxonIdSet;
|
645
|
Map<String, TaxonNameBase> taxonMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
|
646
|
result.put(nameSpace, taxonMap);
|
647
|
|
648
|
//nom reference map
|
649
|
nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
|
650
|
cdmClass = Reference.class;
|
651
|
idSet = referenceIdSet;
|
652
|
Map<String, Reference> nomReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
|
653
|
result.put(nameSpace, nomReferenceMap);
|
654
|
|
655
|
//biblio reference map
|
656
|
nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
|
657
|
cdmClass = Reference.class;
|
658
|
idSet = referenceIdSet;
|
659
|
Map<String, Reference> biblioReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
|
660
|
result.put(nameSpace, biblioReferenceMap);
|
661
|
|
662
|
} catch (SQLException e) {
|
663
|
throw new RuntimeException(e);
|
664
|
} catch (NullPointerException nep){
|
665
|
logger.error("NullPointerException in getRelatedObjectsForPartition()");
|
666
|
}
|
667
|
return result;
|
668
|
}
|
669
|
|
670
|
|
671
|
|
672
|
/* (non-Javadoc)
|
673
|
* @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
|
674
|
*/
|
675
|
@Override
|
676
|
protected boolean doCheck(BerlinModelImportState state){
|
677
|
IOValidator<BerlinModelImportState> validator = new BerlinModelCommonNamesImportValidator();
|
678
|
return validator.validate(state);
|
679
|
}
|
680
|
|
681
|
|
682
|
/* (non-Javadoc)
|
683
|
* @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
|
684
|
*/
|
685
|
@Override
|
686
|
protected String getTableName() {
|
687
|
return dbTableName;
|
688
|
}
|
689
|
|
690
|
/* (non-Javadoc)
|
691
|
* @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
|
692
|
*/
|
693
|
@Override
|
694
|
public String getPluralString() {
|
695
|
return pluralString;
|
696
|
}
|
697
|
|
698
|
/* (non-Javadoc)
|
699
|
* @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
|
700
|
*/
|
701
|
protected boolean isIgnore(BerlinModelImportState state){
|
702
|
return ! state.getConfig().isDoCommonNames();
|
703
|
}
|
704
|
|
705
|
}
|