ref #9752 adapt mexico import for flora-of-mexico import
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / mexico / MexicoConabioCommonNamesImport.java
1 /**
2 * Copyright (C) 2016 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 eu.etaxonomy.cdm.common.URI;
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.Set;
15 import java.util.UUID;
16
17 import org.apache.commons.lang3.StringUtils;
18 import org.apache.log4j.Logger;
19 import org.springframework.stereotype.Component;
20
21 import eu.etaxonomy.cdm.model.common.Language;
22 import eu.etaxonomy.cdm.model.description.CommonTaxonName;
23 import eu.etaxonomy.cdm.model.description.TaxonDescription;
24 import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
25 import eu.etaxonomy.cdm.model.reference.Reference;
26 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
27 import eu.etaxonomy.cdm.model.taxon.Taxon;
28 import eu.etaxonomy.cdm.model.term.TermType;
29 import eu.etaxonomy.cdm.model.term.TermVocabulary;
30
31 /**
32 * @author a.mueller
33 * @since 16.06.2016
34 *
35 */
36 @Component
37 public class MexicoConabioCommonNamesImport<CONFIG extends MexicoConabioImportConfigurator>
38 extends SimpleExcelTaxonImport<CONFIG>{
39
40 private static final long serialVersionUID = 3579868489510261569L;
41
42 private static final Logger logger = Logger.getLogger(MexicoConabioCommonNamesImport.class);
43
44 private TermVocabulary<Language> languagesVoc;
45 private Map<String, Language> languagesMap = new HashMap<>();
46
47 private Map<String, Taxon> taxonIdMap;
48
49
50 @Override
51 protected String getWorksheetName(CONFIG config) {
52 return "NombresComunes";
53 }
54
55 @Override
56 protected void firstPass(SimpleExcelTaxonImportState<CONFIG> state) {
57 initLanguageVocabulary(state);
58 initTaxa();
59
60 String line = state.getCurrentLine() + ": ";
61 Map<String, String> record = state.getOriginalRecord();
62
63 String idCat = getValue(record, "IdCAT");
64 Taxon taxon = taxonIdMap.get(idCat);
65 if (taxon == null){
66 logger.warn(line + "Taxon could not be found: " + idCat);
67 }else{
68 TaxonDescription desc = getTaxonDescription(taxon);
69 String nomComunStr = getValue(record, "NomComun");
70 String langStr = getValueNd(record, "Lengua");
71 Language language = languagesMap.get(langStr);
72 if (language == null && langStr != null){
73 addNewLanguage(state, langStr);
74 }
75 logger.warn("Common names for the same taxon using the same common name but differing in source are currently not yet deduplicated. Needs to be fixed for next import");
76
77 String refStr = getValue(record, "ReferenciasNombreComun");
78 CommonTaxonName commonName = CommonTaxonName.NewInstance(nomComunStr,
79 language, null);
80 desc.addElement(commonName);
81
82 Reference ref = getReference(state, refStr);
83 if (ref != null){
84 commonName.addSource(OriginalSourceType.PrimaryTaxonomicSource,
85 null, null, ref, null);
86 }
87
88
89 getTaxonService().save(taxon);
90 }
91 }
92
93 private Language addNewLanguage(SimpleExcelTaxonImportState<CONFIG> state, String langStr) {
94 UUID uuid = getNewLanguageUuid(langStr);
95 if (uuid != null){
96 Language newLanguage = addLanguage(state, langStr, uuid);
97 getTermService().saveOrUpdate(newLanguage);
98 logger.warn("New language added: " + langStr + "("+ uuid + ")");
99 return newLanguage;
100 }else{
101 logger.warn("Language not recognized: " + langStr);
102 return null;
103 }
104 }
105
106 private UUID getNewLanguageUuid(String langStr) {
107 if (langStr.equals("Mixteco")){return MexicoConabioTransformer.uuidMixteco;}
108 else if (langStr.equals("Náhuatl-Español")){return MexicoConabioTransformer.uuidNahuatlEspanol;}
109 else if (langStr.equals("Español-Náhuatl")){return MexicoConabioTransformer.uuidEspanolNahuatl;}
110 else if (langStr.equals("Tzotzil")){return MexicoConabioTransformer.uuidTzotzil;}
111 else if (langStr.equals("Tetzal")){return MexicoConabioTransformer.uuidTetzal;}
112 else if (langStr.equals("Tzeltal")){return MexicoConabioTransformer.uuidTzeltal;}
113 else if (langStr.equals("Mazateco")){return MexicoConabioTransformer.uuidMazateco;}
114 else if (langStr.equals("Tepehua")){return MexicoConabioTransformer.uuidTepehua;}
115
116 else if (langStr.equals("Cuicateco")){return MexicoConabioTransformer.uuidCuicateco;}
117 else if (langStr.equals("Zoque")){return MexicoConabioTransformer.uuidZoque;}
118 else if (langStr.equals("Tepehuano")){return MexicoConabioTransformer.uuidTepehuano;}
119 else if (langStr.equals("Popoloca")){return MexicoConabioTransformer.uuidPopoloca;}
120 else if (langStr.equals("Tojolabal")){return MexicoConabioTransformer.uuidTojolabal;}
121
122 else if (langStr.equals("Mayo")){return MexicoConabioTransformer.uuidMayo;}
123 else if (langStr.equals("Huichol")){return MexicoConabioTransformer.uuidHuichol;}
124 else if (langStr.equals("Cora")){return MexicoConabioTransformer.uuidCora;}
125 else if (langStr.equals("Seri")){return MexicoConabioTransformer.uuidSeri;}
126
127
128
129
130 return null;
131 }
132
133 private void initTaxa() {
134 if (taxonIdMap == null){
135 Set<String> existingKeys = MexicoConabioTaxonImport.taxonIdMap.keySet();
136 taxonIdMap = getCommonService().getSourcedObjectsByIdInSourceC(Taxon.class,
137 existingKeys, MexicoConabioTaxonImport.TAXON_NAMESPACE);
138 }
139 }
140
141 /**
142 * @param state
143 */
144 @SuppressWarnings("unchecked")
145 private void initLanguageVocabulary(SimpleExcelTaxonImportState<CONFIG> state) {
146 if (languagesVoc == null){
147 languagesVoc = this.getVocabularyService().find(MexicoConabioTransformer.uuidMexicanLanguagesVoc);
148 if (languagesVoc == null){
149 createLanguagesVoc(state);
150 }else{
151 fillLanguageMap();
152 }
153 }
154 }
155
156 private void fillLanguageMap() {
157 for (Language language: languagesVoc.getTerms()){
158 String label = language.getLabel();
159 languagesMap.put(label, language);
160 }
161 }
162
163 private void createLanguagesVoc(SimpleExcelTaxonImportState<CONFIG> state) {
164 URI termSourceUri = null;
165 String label = "Mexican States";
166 String description = "Mexican languages as used by the CONABIO Rubiaceae database";
167 languagesVoc = TermVocabulary.NewInstance(TermType.Language, Language.class,
168 description, label, null, termSourceUri);
169 languagesVoc.setUuid(MexicoConabioTransformer.uuidMexicanLanguagesVoc);
170
171 addLanguage(state, "Chontal", MexicoConabioTransformer.uuidChontal);
172 addLanguage(state, "Chinanteco", MexicoConabioTransformer.uuidChinanteco);
173 addLanguage(state, "Chiapaneca", MexicoConabioTransformer.uuidChiapaneca);
174 addLanguage(state, "Huasteco", MexicoConabioTransformer.uuidHuasteco);
175 addLanguage(state, "Español-Maya", MexicoConabioTransformer.uuidEspanol_Maya);
176 addLanguage(state, "Guarijío", MexicoConabioTransformer.uuidGuarijio);
177 addLanguage(state, "Huave", MexicoConabioTransformer.uuidHuave);
178 addLanguage(state, "Español", MexicoConabioTransformer.uuidEspanol);
179 addLanguage(state, "Maya", MexicoConabioTransformer.uuidMaya);
180 addLanguage(state, "Lacandón", MexicoConabioTransformer.uuidLacandon);
181 addLanguage(state, "Inglés", MexicoConabioTransformer.uuidIngles);
182 addLanguage(state, "Itzmal", MexicoConabioTransformer.uuidItzmal);
183 addLanguage(state, "Náhuatl", MexicoConabioTransformer.uuidNahuatl);
184 addLanguage(state, "Tarahumara", MexicoConabioTransformer.uuidTarahumara);
185 addLanguage(state, "Otomí", MexicoConabioTransformer.uuidOtomi);
186 addLanguage(state, "Mixe", MexicoConabioTransformer.uuidMixe);
187 addLanguage(state, "Tseltal", MexicoConabioTransformer.uuidTseltal);
188 addLanguage(state, "Zapoteco", MexicoConabioTransformer.uuidZapoteco);
189 addLanguage(state, "Totonaco", MexicoConabioTransformer.uuidTotonaco);
190 addLanguage(state, "Tarasco", MexicoConabioTransformer.uuidTarasco);
191
192 this.getVocabularyService().save(languagesVoc);
193
194 return;
195 }
196
197 private Language addLanguage(SimpleExcelTaxonImportState<CONFIG> state, String label, UUID uuid) {
198 String abbrev = null;
199 Language language = Language.NewInstance(
200 label, label, abbrev);
201 language.setUuid(uuid);
202 languagesVoc.addTerm(language);
203 languagesMap.put(label, language);
204 return language;
205 }
206
207 private Reference getReference(SimpleExcelTaxonImportState<CONFIG> state, String refStr) {
208 if (StringUtils.isBlank(refStr)){
209 return null;
210 }
211 Reference ref = state.getReference(refStr);
212 if (ref == null){
213 ref = ReferenceFactory.newBook();
214 ref.setTitleCache(refStr, true);
215 state.putReference(refStr, ref);
216 }
217 return ref;
218 }
219
220 /**
221 * @param taxon
222 * @return
223 */
224 private TaxonDescription getTaxonDescription(Taxon taxon) {
225 if (!taxon.getDescriptions().isEmpty()){
226 return taxon.getDescriptions().iterator().next();
227 }else{
228 TaxonDescription desc = TaxonDescription.NewInstance(taxon);
229 return desc;
230 }
231 }
232
233 private String getValueNd(Map<String, String> record, String string) {
234 String value = getValue(record, string);
235 if ("ND".equals(value)){
236 return null;
237 }else{
238 return value;
239 }
240 }
241
242 @Override
243 protected boolean isIgnore(SimpleExcelTaxonImportState<CONFIG> state) {
244 return ! state.getConfig().isDoCommonNames();
245 }
246
247 }