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