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