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
.pesi
.erms
;
12 import java
.sql
.ResultSet
;
13 import java
.sql
.SQLException
;
14 import java
.util
.HashMap
;
15 import java
.util
.HashSet
;
18 import java
.util
.UUID
;
20 import org
.apache
.log4j
.Logger
;
21 import org
.springframework
.stereotype
.Component
;
23 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
24 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.DbImportAnnotationMapper
;
25 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.DbImportCommonNameCreationMapper
;
26 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.DbImportMapping
;
27 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.DbImportObjectMapper
;
28 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.DbImportStringMapper
;
29 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.IInputTransformer
;
30 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.UndefinedTransformerMethodException
;
31 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.out
.DbLastActionMapper
;
32 import eu
.etaxonomy
.cdm
.io
.pesi
.erms
.validation
.ErmsVernacularImportValidator
;
33 import eu
.etaxonomy
.cdm
.model
.common
.AnnotationType
;
34 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
35 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
36 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
37 import eu
.etaxonomy
.cdm
.model
.description
.CommonTaxonName
;
38 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
45 public class ErmsVernacularImport
extends ErmsImportBase
<CommonTaxonName
> {
47 private static final long serialVersionUID
= -5928250782824234181L;
49 private static final Logger logger
= Logger
.getLogger(ErmsVernacularImport
.class);
51 private DbImportMapping
<ErmsImportState
, ErmsImportConfigurator
> mapping
;
52 // private ErmsImportState state; //import instance is never used more than once for Erms ; dirty
54 private static final String pluralString
= "vernaculars";
55 private static final String dbTableName
= "vernaculars";
56 private static final Class
<?
> cdmTargetClass
= CommonTaxonName
.class;
58 public ErmsVernacularImport(){
59 super(pluralString
, dbTableName
, cdmTargetClass
);
63 protected String
getRecordQuery(ErmsImportConfigurator config
) {
64 String strRecordQuery
=
65 " SELECT v.*, tu.tu_acctaxon, tu.id, l.*, " +
66 " s.sessiondate lastActionDate, a.action_name lastAction, s.ExpertName " +
67 " FROM vernaculars v INNER JOIN tu ON v.tu_id = tu.id " +
68 " LEFT OUTER JOIN languages l ON l.LanID = v.lan_id " +
69 " LEFT OUTER JOIN vernaculars_sessions MN ON MN.vernacular_id = v.id " +
70 " LEFT OUTER JOIN [sessions] s ON s.id = MN.session_id " +
71 " LEFT OUTER JOIN actions a ON a.id = MN.action_id " +
72 " WHERE ( v.id IN (" + ID_LIST_TOKEN
+ ") )" +
73 " ORDER BY v.id, s.sessiondate DESC, a.id DESC ";
74 return strRecordQuery
;
78 protected DbImportMapping
<ErmsImportState
, ErmsImportConfigurator
> getMapping() {
80 mapping
= new DbImportMapping
<>();
82 mapping
.addMapper(DbImportCommonNameCreationMapper
.NewInstance("id", VERNACULAR_NAMESPACE
, "tu_id", ErmsImportBase
.TAXON_NAMESPACE
));
84 mapping
.addMapper(DbImportObjectMapper
.NewInstance("lan_id", "language", LANGUAGE_NAMESPACE
));
85 mapping
.addMapper(DbImportStringMapper
.NewInstance("vername", "name"));
86 mapping
.addMapper(DbImportAnnotationMapper
.NewInstance("note", AnnotationType
.EDITORIAL(), Language
.DEFAULT()));
88 AnnotationType speciesExpertNameAnnType
= getAnnotationType(ErmsTransformer
.uuidAnnSpeciesExpertName
, "species expert name", "species expert name", "species expert name");
89 mapping
.addMapper(DbImportAnnotationMapper
.NewInstance("ExpertName", speciesExpertNameAnnType
)); //according to sql script ExpertName maps to SpeciesExpertName in ERMS
90 AnnotationType lastActionDateType
= getAnnotationType(DbLastActionMapper
.uuidAnnotationTypeLastActionDate
, "Last action date", "Last action date", null);
91 mapping
.addMapper(DbImportAnnotationMapper
.NewInstance("lastActionDate", lastActionDateType
));
92 AnnotationType lastActionType
= getAnnotationType(DbLastActionMapper
.uuidAnnotationTypeLastAction
, "Last action", "Last action", null);
93 MarkerType hasNoLastActionMarkerType
= getMarkerType(DbLastActionMapper
.uuidMarkerTypeHasNoLastAction
, "has no last action", "No last action information available", "no last action");
94 mapping
.addMapper(DbImportAnnotationMapper
.NewInstance("lastAction", lastActionType
, hasNoLastActionMarkerType
));
99 Integer lastVernacularId
= null;
101 protected boolean ignoreRecord(ResultSet rs
) throws SQLException
{
102 Integer id
= rs
.getInt("id");
103 boolean result
= id
.equals(lastVernacularId
);
104 lastVernacularId
= id
;
109 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
, ErmsImportState state
) {
113 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<>();
115 Map
<String
, Language
> languageMap
= new HashMap
<>();
117 Set
<String
> taxonIdSet
= new HashSet
<>();
119 handleForeignKey(rs
, taxonIdSet
, "tu_id");
120 addLanguage(rs
, languageMap
, state
);
124 nameSpace
= ErmsImportBase
.TAXON_NAMESPACE
;
126 @SuppressWarnings("rawtypes")
127 Map
<String
, TaxonBase
> taxonMap
= getCommonService().getSourcedObjectsByIdInSourceC(TaxonBase
.class, idSet
, nameSpace
);
128 result
.put(nameSpace
, taxonMap
);
131 nameSpace
= LANGUAGE_NAMESPACE
;
132 result
.put(nameSpace
, languageMap
);
134 } catch (SQLException e
) {
135 throw new RuntimeException(e
);
140 private void addLanguage(ResultSet rs
, Map
<String
, Language
> languageMap
, ErmsImportState state
) throws SQLException
{
141 IInputTransformer transformer
= state
.getTransformer();
142 String id639_1
= rs
.getString("639_1");
143 String id639_2
= rs
.getString("639_2");
144 String lanId
= rs
.getString("LanID");
146 if (isNotBlank(id639_1
) && Language
.getLanguageByIsoCode(id639_1
)!= null){
147 languageMap
.put(lanId
, Language
.getLanguageByIsoCode(id639_1
));
148 }else if (isNotBlank(id639_2
) && Language
.getLanguageByIsoCode(id639_2
)!= null){
149 languageMap
.put(lanId
, Language
.getLanguageByIsoCode(id639_2
));
152 Language language
= transformer
.getLanguageByKey(lanId
);
153 persistLanguage(language
);
154 if (language
== null || language
.equals(Language
.UNDETERMINED())){
155 UUID uuidLang
= transformer
.getLanguageUuid(lanId
);
156 if (uuidLang
!= null){
157 language
= getLanguage(state
, uuidLang
, rs
.getString("LanName"), "LanName", "639_3");
159 if (language
== null || language
.equals(Language
.UNDETERMINED() )){
160 logger
.warn("Language undefined: " + lanId
);
162 }if (language
!= null){
163 languageMap
.put(lanId
, language
);
165 } catch (IllegalArgumentException
| UndefinedTransformerMethodException e
) {
167 logger
.error("Error when retrieving language", e
);
172 private void persistLanguage(Language language
) {
173 if(!language
.isPersited()){
174 getTermService().saveOrUpdate(language
);
176 if (!language
.getVocabulary().isPersited()){
177 getVocabularyService().saveOrUpdate(language
.getVocabulary());
182 protected boolean doCheck(ErmsImportState state
){
183 IOValidator
<ErmsImportState
> validator
= new ErmsVernacularImportValidator();
184 return validator
.validate(state
);
188 protected boolean isIgnore(ErmsImportState state
){
189 return ! state
.getConfig().isDoVernaculars();