0799ad78e70a35720e3e2c707e901abc4f273791
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / mexico / MexicoEfloraCommonNameImport.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 package eu.etaxonomy.cdm.io.mexico;
10
11 import java.sql.ResultSet;
12 import java.sql.SQLException;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
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.common.URI;
24 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
25 import eu.etaxonomy.cdm.model.common.CdmBase;
26 import eu.etaxonomy.cdm.model.common.Language;
27 import eu.etaxonomy.cdm.model.description.CommonTaxonName;
28 import eu.etaxonomy.cdm.model.description.TaxonDescription;
29 import eu.etaxonomy.cdm.model.location.NamedArea;
30 import eu.etaxonomy.cdm.model.reference.Reference;
31 import eu.etaxonomy.cdm.model.taxon.Taxon;
32 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
33 import eu.etaxonomy.cdm.model.term.TermType;
34 import eu.etaxonomy.cdm.model.term.TermVocabulary;
35
36 /**
37 * @author a.mueller
38 * @since 08.02.2022
39 */
40 @Component
41 public class MexicoEfloraCommonNameImport extends MexicoEfloraImportBase {
42
43 private static final long serialVersionUID = 8616047381536678637L;
44 private static final Logger logger = Logger.getLogger(MexicoEfloraCommonNameImport.class);
45
46 protected static final String NAMESPACE = "CommonNames";
47
48 private static final String pluralString = "common names";
49 private static final String dbTableName = "Eflora_NombresComunes4CDM";
50
51 private Map<String,Language> languageMap = new HashMap<>();
52
53 public MexicoEfloraCommonNameImport(){
54 super(dbTableName, pluralString);
55 }
56
57 @Override
58 protected String getIdQuery(MexicoEfloraImportState state) {
59 String sql = " SELECT IdCombinado "
60 + " FROM " + dbTableName
61 + " ORDER BY IdCat, IdCombinado ";
62 return sql;
63 }
64
65 @Override
66 protected String getRecordQuery(MexicoEfloraImportConfigurator config) {
67 String sqlSelect = " SELECT cn.*, t.uuid taxonUuid ";
68 String sqlFrom = " FROM " + dbTableName + " cn "
69 + " LEFT JOIN " + MexicoEfloraTaxonImport.dbTableName + " t ON cn.IdCAT = t.IdCAT ";
70 String sqlWhere = " WHERE ( IdCombinado IN (" + ID_LIST_TOKEN + ") )";
71
72 String strRecordQuery =sqlSelect + " " + sqlFrom + " " + sqlWhere ;
73 return strRecordQuery;
74 }
75
76 @Override
77 protected void doInvoke(MexicoEfloraImportState state) {
78 createLanguageMap(state);
79 super.doInvoke(state);
80 }
81
82 private void createLanguageMap(MexicoEfloraImportState state) {
83 TermVocabulary<Language> voc = createLanguagesVoc(state);
84
85 String sql = "SELECT * FROM cv4_Controlled_vocabulary_for_languages ";
86 ResultSet rs = state.getConfig().getSource().getResultSet(sql);
87 try {
88 while (rs.next()) {
89 String lang = rs.getString("Lengua");
90 Language language = Language.NewInstance(lang, lang, null, Language.SPANISH_CASTILIAN());
91 voc.addTerm(language);
92 getTermService().save(language); //not sure if necessary
93 languageMap.put(lang, language);
94 }
95 } catch (SQLException e) {
96 e.printStackTrace();
97 }
98 }
99
100 private TermVocabulary<Language> createLanguagesVoc(MexicoEfloraImportState state) {
101 URI termSourceUri = null;
102 String label = "Mexican Languages";
103 String description = "Mexican languages as used by the CONABIO database";
104 TermVocabulary<Language> languagesVoc = TermVocabulary.NewInstance(TermType.Language, Language.class,
105 description, label, null, termSourceUri);
106 languagesVoc.setUuid(MexicoConabioTransformer.uuidMexicanLanguagesVoc);
107 this.getVocabularyService().save(languagesVoc);
108
109 return languagesVoc;
110 }
111
112 @Override
113 public boolean doPartition(@SuppressWarnings("rawtypes") ResultSetPartitioner partitioner, MexicoEfloraImportState state) {
114
115 boolean success = true ;
116
117 @SuppressWarnings("rawtypes")
118 Set<TaxonBase> taxaToSave = new HashSet<>();
119
120 @SuppressWarnings("unchecked")
121 Map<String, TaxonBase<?>> taxonMap = partitioner.getObjectMap(MexicoEfloraTaxonImport.NAMESPACE);
122
123 ResultSet rs = partitioner.getResultSet();
124 try{
125 while (rs.next()){
126
127 // if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("PTaxa handled: " + (i-1));}
128
129 //create TaxonName element
130 String idCombi = rs.getString("IdCombinado");
131 // String idNomComun = rs.getString("IdNomComun");
132 String taxonUuid = rs.getString("taxonUuid");
133
134 String nomComunStr = rs.getString("NomComun");
135 String lenguaStr = rs.getString("Lengua");
136 //TODO handle country in
137 // String paisStr = rs.getString("Pais");
138 // String estadoStr = rs.getString("Estado");
139 int idRegion = rs.getInt("IdRegion");
140
141 try {
142 TaxonBase<?> taxonBase = taxonMap.get(taxonUuid);
143 Taxon taxon;
144 if (taxonBase.isInstanceOf(Taxon.class)) {
145 taxon = CdmBase.deproxy(taxonBase, Taxon.class);
146 }else {
147 logger.warn(idCombi + ": Taxon is not accepted: " + taxonUuid);
148 continue;
149 }
150
151 Language language = getLanguage(state, lenguaStr);
152 NamedArea area = getArea(state, idRegion);
153 CommonTaxonName commonName = CommonTaxonName.NewInstance(nomComunStr,
154 language, area);
155 //TODO
156 Reference ref = null;
157 TaxonDescription description = this.getTaxonDescription(taxon, ref,
158 false, true);
159 description.addElement(commonName);
160
161 state.getCommonNameMap().put(idCombi, commonName);
162
163 partitioner.startDoSave();
164 taxaToSave.add(taxonBase);
165 } catch (Exception e) {
166 logger.warn("An exception (" +e.getMessage()+") occurred when trying to create common name for id " + idCombi + ".");
167 success = false;
168 }
169 }
170 } catch (Exception e) {
171 logger.error("SQLException:" + e);
172 return false;
173 }
174
175 getTaxonService().save(taxaToSave);
176 return success;
177 }
178
179 private NamedArea getArea(MexicoEfloraImportState state, Integer idRegion) {
180 NamedArea area = state.getAreaMap().get(idRegion);
181 if (idRegion != null && area == null) {
182 logger.warn("Area not found: " + idRegion);
183 }
184 return area;
185 }
186
187 private Language getLanguage(MexicoEfloraImportState state, String lenguaStr) {
188 Language language = languageMap.get(lenguaStr);
189 if (isNotBlank(lenguaStr) && language == null) {
190 logger.warn("Language not found: " + lenguaStr);
191 }
192 return language;
193 }
194
195 @Override
196 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, MexicoEfloraImportState state) {
197
198 String nameSpace;
199 Set<String> idSet;
200 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
201
202 try{
203 Set<UUID> taxonIdSet = new HashSet<>();
204 Set<String> referenceIdSet = new HashSet<>();
205 while (rs.next()){
206 handleForeignUuidKey(rs, taxonIdSet, "taxonUuid");
207 // handleForeignKey(rs, referenceIdSet, "PTRefFk");
208 }
209
210 //taxon map
211 nameSpace = MexicoEfloraTaxonImport.NAMESPACE;
212 @SuppressWarnings("rawtypes")
213 Map<String, TaxonBase> taxonMap = new HashMap<>();
214 @SuppressWarnings("rawtypes")
215 List<TaxonBase> taxa = getTaxonService().find(taxonIdSet);
216 taxa.stream().forEach(t->taxonMap.put(t.getUuid().toString(), t));
217 result.put(nameSpace, taxonMap);
218
219 //reference map
220 nameSpace = MexicoEfloraRefArticlesImport.NAMESPACE;
221 idSet = referenceIdSet;
222 Map<String, Reference> referenceMap = getCommonService().getSourcedObjectsByIdInSourceC(Reference.class, idSet, nameSpace);
223 result.put(nameSpace, referenceMap);
224
225 } catch (SQLException e) {
226 throw new RuntimeException(e);
227 }
228 return result;
229 }
230
231 @Override
232 protected String getTableName() {
233 return dbTableName;
234 }
235
236 @Override
237 public String getPluralString() {
238 return pluralString;
239 }
240
241 @Override
242 protected boolean doCheck(MexicoEfloraImportState state){
243 return true;
244 }
245
246 @Override
247 protected boolean isIgnore(MexicoEfloraImportState state){
248 return ! state.getConfig().isDoTaxa();
249 }
250 }