adapt some classes to new CommonService.getSourcedObjectSByIdInSource and cleanup
[cdmlib-apps.git] / cdm-pesi / src / main / java / eu / etaxonomy / cdm / io / pesi / erms / ErmsVernacularImport.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.pesi.erms;
11
12 import java.sql.ResultSet;
13 import java.sql.SQLException;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.apache.log4j.Logger;
21 import org.springframework.stereotype.Component;
22
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;
39
40 /**
41 * @author a.mueller
42 * @since 20.02.2010
43 */
44 @Component
45 public class ErmsVernacularImport extends ErmsImportBase<CommonTaxonName> {
46
47 private static final long serialVersionUID = -5928250782824234181L;
48
49 private static final Logger logger = Logger.getLogger(ErmsVernacularImport.class);
50
51 private DbImportMapping<ErmsImportState, ErmsImportConfigurator> mapping;
52 // private ErmsImportState state; //import instance is never used more than once for Erms ; dirty
53
54 private static final String pluralString = "vernaculars";
55 private static final String dbTableName = "vernaculars";
56 private static final Class<?> cdmTargetClass = CommonTaxonName.class;
57
58 public ErmsVernacularImport(){
59 super(pluralString, dbTableName, cdmTargetClass);
60 }
61
62 @Override
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;
75 }
76
77 @Override
78 protected DbImportMapping<ErmsImportState, ErmsImportConfigurator> getMapping() {
79 if (mapping == null){
80 mapping = new DbImportMapping<>();
81
82 mapping.addMapper(DbImportCommonNameCreationMapper.NewInstance("id", VERNACULAR_NAMESPACE, "tu_id", ErmsImportBase.TAXON_NAMESPACE));
83
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()));
87 //last action+expert
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));
95 }
96 return mapping;
97 }
98
99 Integer lastVernacularId = null;
100 @Override
101 protected boolean ignoreRecord(ResultSet rs) throws SQLException {
102 Integer id = rs.getInt("id");
103 boolean result = id.equals(lastVernacularId);
104 lastVernacularId = id;
105 return result;
106 }
107
108 @Override
109 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, ErmsImportState state) {
110
111 String nameSpace;
112 Set<String> idSet;
113 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
114
115 Map<String, Language> languageMap = new HashMap<>();
116 try{
117 Set<String> taxonIdSet = new HashSet<>();
118 while (rs.next()){
119 handleForeignKey(rs, taxonIdSet, "tu_id");
120 addLanguage(rs, languageMap, state);
121 }
122
123 //taxon map
124 nameSpace = ErmsImportBase.TAXON_NAMESPACE;
125 idSet = taxonIdSet;
126 @SuppressWarnings("rawtypes")
127 Map<String, TaxonBase> taxonMap = getCommonService().getSourcedObjectsByIdInSourceC(TaxonBase.class, idSet, nameSpace);
128 result.put(nameSpace, taxonMap);
129
130 //language map
131 nameSpace = LANGUAGE_NAMESPACE;
132 result.put(nameSpace, languageMap);
133
134 } catch (SQLException e) {
135 throw new RuntimeException(e);
136 }
137 return result;
138 }
139
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");
145
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));
150 }else{
151 try {
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");
158 }
159 if (language == null || language.equals(Language.UNDETERMINED() )){
160 logger.warn("Language undefined: " + lanId);
161 }
162 }if (language != null){
163 languageMap.put(lanId, language);
164 }
165 } catch (IllegalArgumentException | UndefinedTransformerMethodException e) {
166 e.printStackTrace();
167 logger.error("Error when retrieving language", e);
168 }
169 }
170 }
171
172 private void persistLanguage(Language language) {
173 if(!language.isPersited()){
174 getTermService().saveOrUpdate(language);
175 }
176 if (!language.getVocabulary().isPersited()){
177 getVocabularyService().saveOrUpdate(language.getVocabulary());
178 }
179 }
180
181 @Override
182 protected boolean doCheck(ErmsImportState state){
183 IOValidator<ErmsImportState> validator = new ErmsVernacularImportValidator();
184 return validator.validate(state);
185 }
186
187 @Override
188 protected boolean isIgnore(ErmsImportState state){
189 return ! state.getConfig().isDoVernaculars();
190 }
191 }