include "unknown" as language
[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 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 boolean doInvoke(BerlinModelImportState state) {
122 boolean result = true;
123 try {
124 result &= makeRegions(state);
125 } catch (Exception e) {
126 logger.error("Error when creating common name regions:" + e.getMessage());
127 result = false;
128 }
129 result &= super.doInvoke(state);
130 return result;
131 }
132
133 /**
134 * @param state
135 *
136 */
137 private boolean makeRegions(BerlinModelImportState state) {
138 boolean result = true;
139 try {
140 SortedSet<Integer> regionFks = new TreeSet<Integer>();
141 Source source = state.getConfig().getSource();
142
143 result = getRegionFks(result, regionFks, source);
144 //concat filter string
145 String sqlWhere = getSqlWhere(regionFks);
146
147 //get E+M - TDWG Mapping
148 Map<String, String> emTdwgMap = getEmTdwgMap(source);
149 //fill regionMap
150 fillRegionMap(source, sqlWhere, emTdwgMap);
151
152 return result;
153 } catch (NumberFormatException e) {
154 e.printStackTrace();
155 return false;
156 } catch (SQLException e) {
157 e.printStackTrace();
158 return false;
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 logger.warn("Area for " + regionFk + " not defined.");
245 }else{
246 commonTaxonName.setArea(area);
247 TaxonDescription description = getDescription(taxon);
248 description.addElement(commonTaxonName);
249 }
250 }
251
252 //Reference/Source
253 String strRefId = String.valueOf(refId);
254 String languageRefFk = String.valueOf(languageRefRefFk);
255 if (! CdmUtils.nullSafeEqual(strRefId, languageRefFk)){
256 logger.warn("CommonName.RefFk (" + CdmUtils.Nz(strRefId) + ") and LanguageReference.RefFk " + CdmUtils.Nz(languageRefFk) + " are not equal. I will import only languageRefFk");
257 }
258
259 Reference reference = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(languageRefRefFk));
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");
266 }
267 DescriptionElementSource source = DescriptionElementSource.NewInstance(reference, microCitation, nameUsedInSource, originalNameString);
268 for (CommonTaxonName commonTaxonName : commonTaxonNames){
269 commonTaxonName.addSource(source);
270 }
271
272 //MisNameRef
273 if (misNameRefFk != null){
274 //Taxon misappliedName = getMisappliedName(biblioRefMap, nomRefMap, misNameRefFk, taxon);
275 Taxon misappliedName = null;
276 if (misappliedTaxonId != null){
277 misappliedName = taxonMap.get(String.valueOf(misappliedTaxonId));
278 }else{
279 TaxonNameBase taxonName = taxonNameMap.get(String.valueOf(ptNameFk));
280 Reference sec = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(misNameRefFk));
281 if (taxonName == null || sec == null){
282 logger.info("Taxon name or misapplied name reference is null for common name " + commonNameId);
283 }else{
284 misappliedName = Taxon.NewInstance(taxonName, sec);
285 taxaToSave.add(misappliedName);
286 }
287 }
288 if (misappliedName != null){
289 taxon.addMisappliedName(misappliedName, config.getSourceReference(), null);
290 TaxonDescription misappliedNameDescription = getDescription(misappliedName);
291 for (CommonTaxonName commonTaxonName : commonTaxonNames){
292 CommonTaxonName commonNameClone = (CommonTaxonName)commonTaxonName.clone();
293 misappliedNameDescription.addElement(commonNameClone);
294 }
295 }else{
296 logger.warn("Misapplied name is null for common name " + commonNameId);
297 }
298
299 }
300
301
302 //reference extensions
303 if (reference != null){
304 if (CdmUtils.isNotEmpty(refLanguage)){
305 ExtensionType refLanguageExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_STRING_UUID, "reference language","The language of the reference","ref. lang.");
306 Extension.NewInstance(reference, refLanguage, refLanguageExtensionType);
307 }
308
309 if (CdmUtils.isNotEmpty(refLanguageIso639_2)){
310 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");
311 Extension.NewInstance(reference, refLanguageIso639_2, refLanguageIsoExtensionType);
312 }
313 }else if (CdmUtils.isNotEmpty(refLanguage) || CdmUtils.isNotEmpty(refLanguageIso639_2)){
314 logger.warn("Reference is null (" + languageRefRefFk + ") but refLanguage (" + CdmUtils.Nz(refLanguage) + ") or iso639_2 (" + CdmUtils.Nz(refLanguageIso639_2) + ") was not null");
315 }
316
317 //status
318 if (CdmUtils.isNotEmpty(status)){
319 AnnotationType statusAnnotationType = getAnnotationType( state, STATUS_ANNOTATION_UUID, "status","The status of this object","status");
320 Annotation annotation = Annotation.NewInstance(status, statusAnnotationType, Language.DEFAULT());
321 for (CommonTaxonName commonTaxonName : commonTaxonNames){
322 commonTaxonName.addAnnotation(annotation);
323 }
324
325 }
326
327 //Notes
328 for (CommonTaxonName commonTaxonName : commonTaxonNames){
329 doIdCreatedUpdatedNotes(state, commonTaxonName, rs, String.valueOf(commonNameId), NAMESPACE);
330 }
331 partitioner.startDoSave();
332 taxaToSave.add(taxon);
333
334 }
335 } catch (SQLException e) {
336 logger.error("SQLException:" + e);
337 return false;
338 } catch (ClassCastException e) {
339 e.printStackTrace();
340 }
341
342 // logger.info( i + " names handled");
343 getTaxonService().save(taxaToSave);
344 return success;
345
346 }
347
348
349
350 /**
351 * Not used anymore. Use MisappliedName RIdentifier instead
352 * @param biblioRefMap
353 * @param nomRefMap
354 * @param misNameRefFk
355 * @param taxon
356 */
357 private boolean isFirstMisappliedName = true;
358 private Taxon getMisappliedName(Map<String, Reference> biblioRefMap, Map<String, Reference> nomRefMap,
359 Object misNameRefFk, Taxon taxon) {
360 Taxon misappliedTaxon = null;
361 Reference misNameRef = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(misNameRefFk));
362 misappliedTaxon = Taxon.NewInstance(taxon.getName(), misNameRef);
363 Set<String> includeProperty = new HashSet<String>();
364 try {
365 // //IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(TaxonBase.class);
366 // //List<TaxonBase> misappliedList1 = getCommonService().findMatching(misappliedTaxon, matchStrategy);
367 List<TaxonBase> misappliedList = getTaxonService().list(misappliedTaxon, includeProperty, null, null, null, null);
368 if (misappliedList.size() > 0){
369 misappliedTaxon = CdmBase.deproxy(misappliedList.get(0), Taxon.class);
370 }
371 } catch (ClassCastException e) {
372 logger.error(e.getMessage());
373 if (isFirstMisappliedName){
374 e.printStackTrace();
375 isFirstMisappliedName = false;
376 }
377 }
378 return misappliedTaxon;
379 }
380
381
382
383 /**
384 * @param iso6392Map
385 * @param iso639_2
386 * @param languageString
387 * @param originalLanguageString
388 * @return
389 */
390 private Language getAndHandleLanguage(Map<String, Language> iso639Map, String iso639_2, String iso639_1, String languageString, String originalLanguageString) {
391 Language language;
392 if (CdmUtils.isNotEmpty(iso639_2)|| CdmUtils.isNotEmpty(iso639_1) ){
393 //TODO test performance, implement in state
394 language = getLanguageFromIsoMap(iso639Map, iso639_2, iso639_1);
395
396 if (language == null){
397 language = getTermService().getLanguageByIso(iso639_2);
398 iso639Map.put(iso639_2, language);
399 if (language == null){
400 language = getTermService().getLanguageByIso(iso639_1);
401 iso639Map.put(iso639_1, language);
402 }
403 if (language == null){
404 logger.warn("Language for code ISO693-2 '" + iso639_2 + "' and ISO693-1 '" + iso639_1 + "' was not found");
405 }
406 }
407 } else if ("unknown".equals(languageString)){
408 language = Language.UNKNOWN_LANGUAGE();
409 }else{
410 logger.warn("language ISO 639_1 and ISO 639_2 were empty for " + languageString);
411 language = null;
412 }
413 addOriginalLanguage(language, originalLanguageString);
414 return language;
415 }
416
417
418 /**
419 * @param iso639Map
420 * @param iso639_2
421 * @param iso639_1
422 * @return
423 */
424 private Language getLanguageFromIsoMap(Map<String, Language> iso639Map, String iso639_2, String iso639_1) {
425 Language language;
426 language = iso639Map.get(iso639_2);
427 if (language == null){
428 language = iso639Map.get(iso639_1);
429 }
430 return language;
431 }
432
433 /**
434 * @param language
435 * @param originalLanguageString
436 */
437 private void addOriginalLanguage(Language language, String originalLanguageString) {
438 if (CdmUtils.isEmpty(originalLanguageString)){
439 return;
440 }else if (language == null){
441 logger.warn("Language could not be defined, but originalLanguageString exists: " + originalLanguageString);
442 }else {
443 Representation representation = language.getRepresentation(language);
444 if (representation == null){
445 language.addRepresentation(Representation.NewInstance(originalLanguageString, originalLanguageString, originalLanguageString, language));
446 getTermService().saveOrUpdate(language);
447 }
448 }
449
450 }
451
452
453
454 /**
455 * @param result
456 * @param regionFks
457 * @param source
458 * @return
459 * @throws SQLException
460 */
461 private boolean getRegionFks(boolean result, SortedSet<Integer> regionFks,
462 Source source) throws SQLException {
463 String sql = " SELECT DISTINCT RegionFks FROM emCommonName";
464 ResultSet rs = source.getResultSet(sql);
465 while (rs.next()){
466 String strRegionFks = rs.getString("RegionFks");
467 String[] regionFkArray = strRegionFks.split(",");
468 for (String regionFk: regionFkArray){
469 regionFk = regionFk.trim();
470 if (! StringUtils.isNumeric(regionFk) || "".equals(regionFk) ){
471 result = false;
472 logger.warn("RegionFk is not numeric: " + regionFk);
473 }else{
474 regionFks.add(Integer.valueOf(regionFk));
475 }
476 }
477 }
478 return result;
479 }
480
481
482
483 /**
484 * @param source
485 * @param sqlWhere
486 * @param emTdwgMap
487 * @throws SQLException
488 */
489 private void fillRegionMap(Source source, String sqlWhere,
490 Map<String, String> emTdwgMap) throws SQLException {
491 String sql;
492 ResultSet rs;
493 sql = " SELECT RegionId, Region FROM emLanguageRegion WHERE RegionId IN ("+ sqlWhere+ ") ";
494 rs = source.getResultSet(sql);
495 while (rs.next()){
496 Object regionId = rs.getObject("RegionId");
497 String region = rs.getString("Region");
498 String[] splitRegion = region.split("-");
499 if (splitRegion.length <= 1){
500 NamedArea newArea = NamedArea.NewInstance(region, region, null);
501 getTermService().save(newArea);
502 regionMap.put(String.valueOf(regionId), newArea);
503 logger.warn("Found new area: " + region);
504 }else if (splitRegion.length == 2){
505 String emCode = splitRegion[1].trim();
506 String tdwgCode = emTdwgMap.get(emCode);
507 if (StringUtils.isNotBlank(tdwgCode) ){
508 NamedArea tdwgArea = getNamedArea(tdwgCode);
509 regionMap.put(String.valueOf(regionId), tdwgArea);
510 }else{
511 logger.warn("emCode did not map to valid tdwgCode: " + CdmUtils.Nz(emCode) + "->" + CdmUtils.Nz(tdwgCode));
512 }
513 }
514 }
515 }
516
517
518 /**
519 * @param tdwgCode
520 */
521 private NamedArea getNamedArea(String tdwgCode) {
522 NamedArea area;
523 if (tdwgCode.equalsIgnoreCase("Ab")){
524 area = NamedArea.NewInstance("Azerbaijan (including Nakhichevan)", "Azerbaijan & Nakhichevan", "Ab");
525 getTermService().save(area);
526 }else if (tdwgCode.equalsIgnoreCase("Rf")){
527 area = NamedArea.NewInstance("The Russian Federation", "The Russian Federation", "Rf");
528 getTermService().save(area);
529 }else if (tdwgCode.equalsIgnoreCase("Uk")){
530 area = NamedArea.NewInstance("Ukraine (including Crimea)", "Ukraine & Crimea", "Uk");
531 getTermService().save(area);
532 }else{
533 area = TdwgArea.getAreaByTdwgAbbreviation(tdwgCode);
534 }
535 return area;
536 }
537
538
539
540 /**
541 * @param regionFks
542 * @return
543 */
544 private String getSqlWhere(SortedSet<Integer> regionFks) {
545 String sqlWhere = "";
546 for (Integer regionFk : regionFks){
547 sqlWhere += regionFk + ",";
548 }
549 sqlWhere = sqlWhere.substring(0, sqlWhere.length()-1);
550 return sqlWhere;
551 }
552
553
554
555 /**
556 * @param source
557 * @throws SQLException
558 */
559 private Map<String, String> getEmTdwgMap(Source source) throws SQLException {
560 String sql;
561 ResultSet rs;
562 Map<String, String> emTdwgMap = new HashMap<String, String>();
563 sql = " SELECT EmCode, TDWGCode FROM emArea ";
564 rs = source.getResultSet(sql);
565 while (rs.next()){
566 String emCode = rs.getString("EMCode");
567 String TDWGCode = rs.getString("TDWGCode");
568 if (StringUtils.isNotBlank(emCode) ){
569 emCode = emCode.trim();
570 if (emCode.equalsIgnoreCase("Ab") || emCode.equalsIgnoreCase("Rf")|| emCode.equalsIgnoreCase("Uk") ){
571 emTdwgMap.put(emCode, emCode);
572 }else if (StringUtils.isNotBlank(TDWGCode)){
573 emTdwgMap.put(emCode, TDWGCode.trim());
574 }
575 }
576 }
577 return emTdwgMap;
578 }
579
580
581
582
583 /**
584 * Returns the first non-image gallery description. Creates a new one if no description exists.
585 * @param taxon
586 * @return
587 */
588 private TaxonDescription getDescription(Taxon taxon) {
589 TaxonDescription result = null;
590 for (TaxonDescription taxonDescription : taxon.getDescriptions()){
591 if (! taxonDescription.isImageGallery()){
592 result = taxonDescription;
593 }
594 }
595 if (result == null){
596 result = TaxonDescription.NewInstance(taxon);
597 }
598 return result;
599 }
600
601 /* (non-Javadoc)
602 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
603 */
604 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
605 String nameSpace;
606 Class cdmClass;
607 Set<String> idSet;
608 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
609
610 try{
611 Set<String> taxonIdSet = new HashSet<String>();
612 Set<String> nameIdSet = new HashSet<String>();
613 Set<String> referenceIdSet = new HashSet<String>();
614 while (rs.next()){
615 handleForeignKey(rs, taxonIdSet, "taxonId");
616 handleForeignKey(rs, taxonIdSet, "misappliedTaxonId");
617 handleForeignKey(rs, referenceIdSet, "refId");
618 handleForeignKey(rs, referenceIdSet, "languageRefRefFk");
619 handleForeignKey(rs, nameIdSet, "NameInSourceFk");
620 handleForeignKey(rs, nameIdSet, "PTNameFk");
621 handleForeignKey(rs, referenceIdSet, "MisNameRefFk");
622 }
623
624 //name map
625 nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
626 cdmClass = TaxonNameBase.class;
627 idSet = nameIdSet;
628 Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
629 result.put(nameSpace, nameMap);
630
631 //name map
632 nameSpace = BerlinModelTaxonImport.NAMESPACE;
633 cdmClass = Taxon.class;
634 idSet = taxonIdSet;
635 Map<String, TaxonNameBase> taxonMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
636 result.put(nameSpace, taxonMap);
637
638 //nom reference map
639 nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
640 cdmClass = Reference.class;
641 idSet = referenceIdSet;
642 Map<String, Reference> nomReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
643 result.put(nameSpace, nomReferenceMap);
644
645 //biblio reference map
646 nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
647 cdmClass = Reference.class;
648 idSet = referenceIdSet;
649 Map<String, Reference> biblioReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
650 result.put(nameSpace, biblioReferenceMap);
651
652 } catch (SQLException e) {
653 throw new RuntimeException(e);
654 } catch (NullPointerException nep){
655 logger.error("NullPointerException in getRelatedObjectsForPartition()");
656 }
657 return result;
658 }
659
660
661
662 /* (non-Javadoc)
663 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
664 */
665 @Override
666 protected boolean doCheck(BerlinModelImportState state){
667 IOValidator<BerlinModelImportState> validator = new BerlinModelCommonNamesImportValidator();
668 return validator.validate(state);
669 }
670
671
672 /* (non-Javadoc)
673 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
674 */
675 @Override
676 protected String getTableName() {
677 return dbTableName;
678 }
679
680 /* (non-Javadoc)
681 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
682 */
683 @Override
684 public String getPluralString() {
685 return pluralString;
686 }
687
688 /* (non-Javadoc)
689 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
690 */
691 protected boolean isIgnore(BerlinModelImportState state){
692 return ! state.getConfig().isDoCommonNames();
693 }
694
695 }