2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.io
.berlinModel
.in
;
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
;
20 import java
.util
.SortedSet
;
21 import java
.util
.TreeSet
;
22 import java
.util
.UUID
;
24 import org
.apache
.commons
.lang
.StringUtils
;
25 import org
.apache
.log4j
.Logger
;
26 import org
.springframework
.stereotype
.Component
;
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
;
60 public class BerlinModelCommonNamesImport
extends BerlinModelImportBase
{
61 private static final Logger logger
= Logger
.getLogger(BerlinModelCommonNamesImport
.class);
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");
67 public static final String NAMESPACE
= "common name";
70 private static final String pluralString
= "common names";
71 private static final String dbTableName
= "emCommonName";
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
>();
77 public BerlinModelCommonNamesImport(){
78 super(dbTableName
, pluralString
);
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();
92 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
93 String 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
+ ")";
114 protected void doInvoke(BerlinModelImportState state
) {
117 } catch (Exception e
) {
118 logger
.error("Error when creating common name regions:" + e
.getMessage());
120 state
.setUnsuccessfull();
122 super.doInvoke(state
);
130 private void makeRegions(BerlinModelImportState state
) {
132 SortedSet
<Integer
> regionFks
= new TreeSet
<Integer
>();
133 Source source
= state
.getConfig().getSource();
135 //fill set with all regionFk from emCommonName.regionFks
136 getRegionFks(state
, regionFks
, source
);
137 //concat filter string
138 String sqlWhere
= getSqlWhere(regionFks
);
140 //get E+M - TDWG Mapping
141 Map
<String
, String
> emTdwgMap
= getEmTdwgMap(source
);
143 fillRegionMap(state
, sqlWhere
, emTdwgMap
);
146 } catch (NumberFormatException e
) {
148 state
.setUnsuccessfull();
150 } catch (SQLException e
) {
152 state
.setUnsuccessfull();
159 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState state
) {
160 boolean success
= true ;
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
);
166 Map
<String
, Reference
> refMap
= (Map
<String
, Reference
>) partitioner
.getObjectMap(BerlinModelReferenceImport
.REFERENCE_NAMESPACE
);
168 Map
<String
, Language
> iso6392Map
= new HashMap
<String
, Language
>();
170 // logger.warn("MisappliedNameRefFk not yet implemented for Common Names");
172 ResultSet rs
= partitioner
.getResultSet();
176 //create TaxonName element
177 Object commonNameId
= rs
.getObject("CommonNameId");
178 int taxonId
= rs
.getInt("taxonId");
179 Object refId
= rs
.getObject("refId");
180 Object ptNameFk
= rs
.getObject("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 Object misNameRefFk
= rs
.getObject("MisNameRefFk");
187 Object languageRefRefFk
= rs
.getObject("languageRefRefFk");
188 String refLanguage
= rs
.getString("refLanguage");
189 String refLanguageIso639_2
= rs
.getString("refLanguageIso639_2");
190 String status
= rs
.getString("Status");
191 Object nameInSourceFk
= rs
.getObject("NameInSourceFk");
192 Object misappliedTaxonId
= rs
.getObject("misappliedTaxonId");
195 String regionFks
= rs
.getString("RegionFks");
196 String
[] regionFkSplit
= regionFks
.split(",");
199 if (isBlank(commonNameString
)){
200 String message
= "CommonName is empty or null. Do not import record for taxon " + taxonId
;
201 logger
.warn(message
);
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");
211 }else if (! taxonBase
.isInstanceOf(Taxon
.class)){
212 logger
.warn("taxon (" + taxonId
+ ") is not accepted. Can't import common name " + commonNameId
);
215 taxon
= CdmBase
.deproxy(taxonBase
, Taxon
.class);
219 Language language
= getAndHandleLanguage(iso6392Map
, iso639_2
, iso639_1
, languageString
, originalLanguageString
, state
);
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
);
228 commonTaxonName
= (CommonTaxonName
)commonTaxonNames
.get(0).clone();
230 commonTaxonNames
.add(commonTaxonName
);
231 regionFk
= regionFk
.trim();
232 NamedArea area
= regionMap
.get(regionFk
);
234 if (regionFkSplit
.length
> 1 && StringUtils
.isNotBlank(regionFk
)){
235 logger
.warn("Area for " + regionFk
+ " not defined in regionMap.");
237 //no region is defined
240 commonTaxonName
.setArea(area
);
241 TaxonDescription description
= getDescription(taxon
);
242 description
.addElement(commonTaxonName
);
247 String strRefId
= String
.valueOf(refId
);
248 String languageRefFk
= String
.valueOf(languageRefRefFk
);
249 if (! CdmUtils
.nullSafeEqual(strRefId
, languageRefFk
)){
250 //use strRefId if languageRefFk is null
251 if (languageRefRefFk
== null){
252 languageRefFk
= strRefId
;
254 logger
.warn("CommonName.RefFk (" + CdmUtils
.Nz(strRefId
) + ") and LanguageReference.RefFk " + CdmUtils
.Nz(languageRefFk
) + " are not equal. I will import only languageReference.RefFk");
258 Reference
<?
> reference
= refMap
.get(String
.valueOf(languageRefRefFk
));
259 String microCitation
= null;
260 String originalNameString
= null;
262 TaxonNameBase
<?
,?
> nameUsedInSource
= taxonNameMap
.get(String
.valueOf(nameInSourceFk
));
263 if (nameInSourceFk
!= null && nameUsedInSource
== null){
264 logger
.warn("Name used in source (" + nameInSourceFk
+ ") was not found for common name " + commonNameId
);
266 DescriptionElementSource source
= DescriptionElementSource
.NewPrimarySourceInstance(reference
, microCitation
, nameUsedInSource
, originalNameString
);
267 for (CommonTaxonName commonTaxonName
: commonTaxonNames
){
268 commonTaxonName
.addSource(source
);
273 if (misNameRefFk
!= null){
274 //Taxon misappliedName = getMisappliedName(biblioRefMap, nomRefMap, misNameRefFk, taxon);
275 Taxon misappliedNameTaxon
= null;
276 if (misappliedTaxonId
!= null){
277 TaxonBase
<?
> misTaxonBase
= taxonMap
.get(String
.valueOf(misappliedTaxonId
));
278 if (misTaxonBase
== null){
279 logger
.warn("MisappliedName not found for misappliedTaxonId " + misappliedTaxonId
+ "; commonNameId: " + commonNameId
);
280 }else if (misTaxonBase
.isInstanceOf(Taxon
.class)){
281 misappliedNameTaxon
= CdmBase
.deproxy(misTaxonBase
, Taxon
.class);
283 logger
.warn("Misapplied name taxon is not of type Taxon but " + misTaxonBase
.getClass().getSimpleName());
287 Reference
<?
> sec
= refMap
.get(String
.valueOf(misNameRefFk
));
288 if (nameUsedInSource
== null || sec
== null){
289 logger
.warn("Taxon name or misapplied name reference is null for common name " + commonNameId
);
291 misappliedNameTaxon
= Taxon
.NewInstance(nameUsedInSource
, sec
);
292 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");
293 Marker marker
= Marker
.NewInstance(misCommonNameMarker
, true);
294 misappliedNameTaxon
.addMarker(marker
);
295 taxaToSave
.add(misappliedNameTaxon
);
296 logger
.warn("Misapplied name taxon could not be found in database but misapplied name reference exists for common name. " +
297 "New misapplied name for misapplied reference common name was added. CommonNameId: " + commonNameId
);
300 if (misappliedNameTaxon
!= null){
302 if (! taxon
.getMisappliedNames().contains(misappliedNameTaxon
)){
303 taxon
.addMisappliedName(misappliedNameTaxon
,state
.getTransactionalSourceReference(), null);
304 logger
.warn("Misapplied name for common name was not found related to the accepted taxon. Created new relationship. CommonNameId: " + commonNameId
);
307 TaxonDescription misappliedNameDescription
= getDescription(misappliedNameTaxon
);
308 for (CommonTaxonName commonTaxonName
: commonTaxonNames
){
309 CommonTaxonName commonNameClone
= (CommonTaxonName
)commonTaxonName
.clone();
310 misappliedNameDescription
.addElement(commonNameClone
);
313 logger
.warn("Misapplied name is null for common name " + commonNameId
);
319 //reference extensions
320 if (reference
!= null){
321 if (StringUtils
.isNotBlank(refLanguage
)){
322 ExtensionType refLanguageExtensionType
= getExtensionType( state
, REFERENCE_LANGUAGE_STRING_UUID
, "reference language","The language of the reference","ref. lang.");
323 Extension
.NewInstance(reference
, refLanguage
, refLanguageExtensionType
);
326 if (StringUtils
.isNotBlank(refLanguageIso639_2
)){
327 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");
328 Extension
.NewInstance(reference
, refLanguageIso639_2
, refLanguageIsoExtensionType
);
330 }else if (isNotBlank(refLanguage
) || isNotBlank(refLanguageIso639_2
)){
331 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
+")");
335 if (isNotBlank(status
)){
336 AnnotationType statusAnnotationType
= getAnnotationType( state
, STATUS_ANNOTATION_UUID
, "status","The status of this object","status", null);
337 for (CommonTaxonName commonTaxonName
: commonTaxonNames
){
338 Annotation annotation
= Annotation
.NewInstance(status
, statusAnnotationType
, Language
.DEFAULT());
339 commonTaxonName
.addAnnotation(annotation
);
344 for (CommonTaxonName commonTaxonName
: commonTaxonNames
){
345 doIdCreatedUpdatedNotes(state
, commonTaxonName
, rs
, String
.valueOf(commonNameId
), NAMESPACE
);
347 partitioner
.startDoSave();
348 taxaToSave
.add(taxon
);
351 } catch (SQLException e
) {
352 logger
.error("SQLException:" + e
);
354 } catch (ClassCastException e
) {
358 // logger.info( i + " names handled");
359 getTaxonService().save(taxaToSave
);
367 * @param languageString
368 * @param originalLanguageString
372 private Language
getAndHandleLanguage(Map
<String
, Language
> iso639Map
, String iso639_2
, String iso639_1
, String languageString
, String originalLanguageString
, BerlinModelImportState state
) {
374 if (isNotBlank(iso639_2
)|| isNotBlank(iso639_1
) ){
375 //TODO test performance, implement in state
376 language
= getLanguageFromIsoMap(iso639Map
, iso639_2
, iso639_1
);
378 if (language
== null){
379 language
= getTermService().getLanguageByIso(iso639_2
);
380 iso639Map
.put(iso639_2
, language
);
381 if (language
== null){
383 language
= getTermService().getLanguageByIso(iso639_1
);
384 } catch (Exception e
) {
385 // TODO Auto-generated catch block
386 // TODO remove if problem with duplicate DescElement_Annot id is solved
389 iso639Map
.put(iso639_1
, language
);
391 if (language
== null){
392 logger
.warn("Language for code ISO693-2 '" + iso639_2
+ "' and ISO693-1 '" + iso639_1
+ "' was not found");
395 } else if ("unknown".equals(languageString
)){
396 language
= Language
.UNKNOWN_LANGUAGE();
397 } else if ("Majorcan".equalsIgnoreCase(languageString
)){
398 language
= getLanguage(state
, BerlinModelTransformer
.uuidLangMajorcan
, "Majorcan", "Majorcan (original 'mallorqu\u00EDn')", null);
400 logger
.warn("language ISO 639_1 and ISO 639_2 were empty for " + languageString
);
403 addOriginalLanguage(language
, originalLanguageString
);
414 private Language
getLanguageFromIsoMap(Map
<String
, Language
> iso639Map
, String iso639_2
, String iso639_1
) {
416 language
= iso639Map
.get(iso639_2
);
417 if (language
== null){
418 language
= iso639Map
.get(iso639_1
);
425 * @param originalLanguageString
427 private void addOriginalLanguage(Language language
, String originalLanguageString
) {
428 if (isBlank(originalLanguageString
)){
430 }else if (language
== null){
431 logger
.warn("Language could not be defined, but originalLanguageString exists: " + originalLanguageString
);
433 Representation representation
= language
.getRepresentation(language
);
434 if (representation
== null){
435 language
.addRepresentation(Representation
.NewInstance(originalLanguageString
, originalLanguageString
, originalLanguageString
, language
));
436 getTermService().saveOrUpdate(language
);
445 * Fills the regionFks with all regionFks from emCommonName. Comma separated regionFks will be split.
450 * @throws SQLException
453 private void getRegionFks(BerlinModelImportState state
, SortedSet
<Integer
> regionFks
, Source source
) throws SQLException
{
454 String sql
= " SELECT DISTINCT RegionFks FROM emCommonName";
455 if (state
.getConfig().getCommonNameFilter() != null){
456 sql
+= " WHERE " + state
.getConfig().getCommonNameFilter();
459 ResultSet rs
= source
.getResultSet(sql
);
461 String strRegionFks
= rs
.getString("RegionFks");
462 if (isBlank(strRegionFks
)){
466 String
[] regionFkArray
= strRegionFks
.split(",");
467 for (String regionFk
: regionFkArray
){
468 regionFk
= regionFk
.trim();
469 if (! StringUtils
.isNumeric(regionFk
) || "".equals(regionFk
) ){
470 state
.setUnsuccessfull();
471 logger
.warn("RegionFk is not numeric: " + regionFk
+ " ( part of " + strRegionFks
+ ")");
473 regionFks
.add(Integer
.valueOf(regionFk
));
483 * Fills the {@link #regionMap} by all emLanguageRegion regions defined in the sql filter.
484 * {@link #regionMap} maps emLanguageRegion.RegionId to named areas.
488 * @throws SQLException
490 private void fillRegionMap(BerlinModelImportState state
, String sqlWhere
,
491 Map
<String
, String
> emTdwgMap
) throws SQLException
{
492 Source source
= state
.getConfig().getSource();
495 sql
= " SELECT RegionId, Region FROM emLanguageRegion WHERE RegionId IN ("+ sqlWhere
+ ") ";
496 rs
= source
.getResultSet(sql
);
498 Object regionId
= rs
.getObject("RegionId");
499 String region
= rs
.getString("Region");
500 String
[] splitRegion
= region
.split("-");
501 if (splitRegion
.length
<= 1){
502 NamedArea newArea
= getNamedArea(state
, null, region
, "Language region '" + region
+ "'", null, null, null);
503 // getTermService().save(newArea);
504 regionMap
.put(String
.valueOf(regionId
), newArea
);
505 logger
.warn("Found new area: " + region
);
506 }else if (splitRegion
.length
== 2){
507 String emCode
= splitRegion
[1].trim();
508 String tdwgCode
= emTdwgMap
.get(emCode
);
509 if (StringUtils
.isNotBlank(tdwgCode
) ){
510 NamedArea tdwgArea
= getNamedArea(state
, tdwgCode
);
511 regionMap
.put(String
.valueOf(regionId
), tdwgArea
);
513 NamedArea area
= getOtherAreas(state
, emCode
, tdwgCode
);
515 regionMap
.put(String
.valueOf(regionId
), area
);
517 logger
.warn("emCode did not map to valid tdwgCode: " + CdmUtils
.Nz(emCode
) + "->" + CdmUtils
.Nz(tdwgCode
));
526 * Returns the are for a given TDWG code. See {@link #getEmTdwgMap(Source)} for exceptions from
531 private NamedArea
getNamedArea(BerlinModelImportState state
, String tdwgCode
) {
533 if (tdwgCode
.equalsIgnoreCase("Ab")){
534 area
= getNamedArea(state
, BerlinModelTransformer
.uuidAzerbaijanNakhichevan
, "Azerbaijan & Nakhichevan", "Azerbaijan (including Nakhichevan)", "Ab", null, null);
535 getTermService().saveOrUpdate(area
);
536 }else if (tdwgCode
.equalsIgnoreCase("Uk")){
537 area
= getNamedArea(state
, BerlinModelTransformer
.uuidUkraineAndCrimea
, "Ukraine & Crimea", "Ukraine (including Crimea)", "Uk", null, null);
538 getTermService().saveOrUpdate(area
);
539 }else if (tdwgCode
.equalsIgnoreCase("Rf")){
540 area
= Country
.RUSSIANFEDERATION();
541 }else if (tdwgCode
.equalsIgnoreCase("Gg")){
542 area
= Country
.GEORGIA();
544 area
= TdwgAreaProvider
.getAreaByTdwgAbbreviation(tdwgCode
);
547 logger
.warn("Area is null for " + tdwgCode
);
556 private String
getSqlWhere(SortedSet
<Integer
> regionFks
) {
557 String sqlWhere
= "";
558 for (Integer regionFk
: regionFks
){
559 sqlWhere
+= regionFk
+ ",";
561 sqlWhere
= sqlWhere
.substring(0, sqlWhere
.length()-1);
566 * Returns a map which is filled by the emCode->TdwgCode mapping defined in emArea.
567 * Some exceptions are defined for emCode 'Ab','Rf','Uk' and some additional mapping is added
568 * for 'Ab / Ab(A)', 'Ga / Ga(F)', 'It / It(I)', 'Ar / Ar(A)','Hs / Hs(S)'
570 * @throws SQLException
572 private Map
<String
, String
> getEmTdwgMap(Source source
) throws SQLException
{
575 Map
<String
, String
> emTdwgMap
= new HashMap
<String
, String
>();
576 sql
= " SELECT EmCode, TDWGCode FROM emArea ";
577 rs
= source
.getResultSet(sql
);
579 String emCode
= rs
.getString("EMCode");
580 String TDWGCode
= rs
.getString("TDWGCode");
581 if (StringUtils
.isNotBlank(emCode
) ){
582 emCode
= emCode
.trim();
583 if (emCode
.equalsIgnoreCase("Ab") || emCode
.equalsIgnoreCase("Rf")||
584 emCode
.equalsIgnoreCase("Uk") || emCode
.equalsIgnoreCase("Gg")){
585 emTdwgMap
.put(emCode
, emCode
);
586 }else if (StringUtils
.isNotBlank(TDWGCode
)){
587 emTdwgMap
.put(emCode
, TDWGCode
.trim());
591 emTdwgMap
.put("Ab / Ab(A)", "Ab");
592 emTdwgMap
.put("Ga / Ga(F)", "FRA-FR");
593 emTdwgMap
.put("It / It(I)", "ITA");
594 emTdwgMap
.put("Uk / Uk(U)", "Uk");
595 emTdwgMap
.put("Ar / Ar(A)", "TCS-AR");
596 emTdwgMap
.put("Hs / Hs(S)", "SPA-SP");
603 * Returns the first non-image gallery description. Creates a new one if no description exists.
607 private TaxonDescription
getDescription(Taxon taxon
) {
608 TaxonDescription result
= null;
609 for (TaxonDescription taxonDescription
: taxon
.getDescriptions()){
610 if (! taxonDescription
.isImageGallery()){
611 result
= taxonDescription
;
615 result
= TaxonDescription
.NewInstance(taxon
);
621 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
) {
625 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
629 Set
<String
> taxonIdSet
= new HashSet
<String
>();
630 Set
<String
> nameIdSet
= new HashSet
<String
>();
631 Set
<String
> referenceIdSet
= new HashSet
<String
>();
633 handleForeignKey(rs
, taxonIdSet
, "taxonId");
634 handleForeignKey(rs
, taxonIdSet
, "misappliedTaxonId");
635 handleForeignKey(rs
, referenceIdSet
, "refId");
636 handleForeignKey(rs
, referenceIdSet
, "languageRefRefFk");
637 handleForeignKey(rs
, nameIdSet
, "NameInSourceFk");
638 handleForeignKey(rs
, nameIdSet
, "PTNameFk");
639 handleForeignKey(rs
, referenceIdSet
, "MisNameRefFk");
643 nameSpace
= BerlinModelTaxonNameImport
.NAMESPACE
;
644 cdmClass
= TaxonNameBase
.class;
646 Map
<String
, TaxonNameBase
<?
,?
>> nameMap
= (Map
<String
, TaxonNameBase
<?
,?
>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
647 result
.put(nameSpace
, nameMap
);
650 nameSpace
= BerlinModelTaxonImport
.NAMESPACE
;
651 cdmClass
= TaxonBase
.class;
653 Map
<String
, TaxonBase
<?
>> taxonMap
= (Map
<String
, TaxonBase
<?
>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
654 result
.put(nameSpace
, taxonMap
);
657 nameSpace
= BerlinModelReferenceImport
.REFERENCE_NAMESPACE
;
658 cdmClass
= Reference
.class;
659 idSet
= referenceIdSet
;
660 Map
<String
, Reference
> referenceMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
661 result
.put(nameSpace
, referenceMap
);
662 // TODO remove if problem with duplicate DescElement_Annot id is solved
663 } catch (SQLException e
) {
664 throw new RuntimeException("pos: " +pos
, e
);
665 } catch (NullPointerException nep
){
666 logger
.error("NullPointerException in getRelatedObjectsForPartition()");
674 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
677 protected boolean doCheck(BerlinModelImportState state
){
678 IOValidator
<BerlinModelImportState
> validator
= new BerlinModelCommonNamesImportValidator();
679 return validator
.validate(state
);
683 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
685 protected boolean isIgnore(BerlinModelImportState state
){
686 return ! state
.getConfig().isDoCommonNames();