Project

General

Profile

Download (26 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(3-3/21)