Project

General

Profile

Download (15.5 KB) Statistics
| Branch: | Revision:
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 java.util.Map;
12
import java.util.Set;
13
import java.util.UUID;
14

    
15
import org.apache.commons.lang3.StringUtils;
16
import org.apache.logging.log4j.LogManager;
17
import org.apache.logging.log4j.Logger;
18
import org.springframework.stereotype.Component;
19

    
20
import eu.etaxonomy.cdm.api.service.geo.GeoServiceArea;
21
import eu.etaxonomy.cdm.api.service.geo.GeoServiceAreaAnnotatedMapping;
22
import eu.etaxonomy.cdm.common.URI;
23
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
24
import eu.etaxonomy.cdm.model.common.CdmBase;
25
import eu.etaxonomy.cdm.model.common.Language;
26
import eu.etaxonomy.cdm.model.description.Distribution;
27
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
28
import eu.etaxonomy.cdm.model.description.TaxonDescription;
29
import eu.etaxonomy.cdm.model.location.NamedArea;
30
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
31
import eu.etaxonomy.cdm.model.location.NamedAreaType;
32
import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
33
import eu.etaxonomy.cdm.model.reference.Reference;
34
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
35
import eu.etaxonomy.cdm.model.taxon.Taxon;
36
import eu.etaxonomy.cdm.model.term.OrderedTermVocabulary;
37
import eu.etaxonomy.cdm.model.term.Representation;
38
import eu.etaxonomy.cdm.model.term.TermType;
39

    
40
/**
41
 * @author a.mueller
42
 * @since 16.06.2016
43
 */
44
@Component
45
public class MexicoConabioDistributionImport<CONFIG extends MexicoConabioImportConfigurator>
46
            extends SimpleExcelTaxonImport<CONFIG> {
47

    
48
    private static final long serialVersionUID = -1733208053395372094L;
49
    private static final Logger logger = LogManager.getLogger();
50

    
51
    private OrderedTermVocabulary<NamedArea> stateAreasVoc;
52
    private NamedArea mexico;
53

    
54
    private Map<String, Taxon> taxonIdMap;
55

    
56

    
57
    @Override
58
    protected String getWorksheetName(CONFIG config) {
59
        return "DistribucionEstatal";
60
    }
61

    
62
    private void initTaxa() {
63
        if (taxonIdMap == null){
64
            Set<String> existingKeys = MexicoConabioTaxonImport.taxonIdMap.keySet();
65
            taxonIdMap = getCommonService().getSourcedObjectsByIdInSourceC(Taxon.class,
66
                    existingKeys, MexicoConabioTaxonImport.TAXON_NAMESPACE);
67
        }
68
    }
69

    
70
    @Override
71
    protected void firstPass(SimpleExcelTaxonImportState<CONFIG> state) {
72
        initAreaVocabulary(state);
73
        initTaxa();
74

    
75
        String line = state.getCurrentLine() + ": ";
76
        Map<String, String> record = state.getOriginalRecord();
77

    
78
        String idCat = getValue(record, "IdCAT");
79
        Taxon taxon = taxonIdMap.get(idCat);
80
        if (taxon == null){
81
            logger.warn(line + "Taxon could not be found: " + idCat);
82
        }else{
83
            TaxonDescription desc = getTaxonDescription(taxon);
84

    
85
            String distrStatusStr = getValue(record, "TipoDistribucion");
86
            try {
87
                if (distrStatusStr != null){
88
                    PresenceAbsenceTerm mexicanDistributionStatus = state.getTransformer().getPresenceTermByKey(distrStatusStr);
89
                    if (mexicanDistributionStatus == null){
90
                        UUID statusUuid = state.getTransformer().getPresenceTermUuid(distrStatusStr);
91
                        mexicanDistributionStatus = getPresenceTerm(state, statusUuid,
92
                                distrStatusStr, distrStatusStr, null, false);
93
                    }
94
                    if (mexicanDistributionStatus != null){
95
                        NamedArea mexicoCountry = getMexico();
96
                        Distribution mexicanDistribution = Distribution.NewInstance(mexicoCountry, mexicanDistributionStatus);
97
                        desc.addElement(mexicanDistribution);
98
                        String refStr = getValue(record, "ReferenciaTipoDistribucion");
99
                        Reference ref = getReference(state, refStr);
100
                        if (ref != null){
101
                            mexicanDistribution.addSource(OriginalSourceType.PrimaryTaxonomicSource,
102
                                    null, null, ref, null);
103
                        }
104
                    }
105
                }
106
            } catch (UndefinedTransformerMethodException e) {}
107

    
108
            handleDistribution(state, desc, "AGUASCALIENTES", MexicoConabioTransformer.uuidAguascalientes, line);
109
            handleDistribution(state, desc, "BAJA CALIFORNIA", MexicoConabioTransformer.uuidBaja_california, line);
110
            handleDistribution(state, desc, "BAJA CALIFORNIA SUR", MexicoConabioTransformer.uuidBaja_california_sur, line);
111
            handleDistribution(state, desc, "CAMPECHE", MexicoConabioTransformer.uuidCampeche, line);
112
            handleDistribution(state, desc, "COAHUILA DE ZARAGOZA", MexicoConabioTransformer.uuidCoahuila_de_zaragoza, line);
113
            handleDistribution(state, desc, "COLIMA", MexicoConabioTransformer.uuidColima, line);
114
            handleDistribution(state, desc, "CHIAPAS", MexicoConabioTransformer.uuidChiapas, line);
115
            handleDistribution(state, desc, "CHIHUAHUA", MexicoConabioTransformer.uuidChihuahua, line);
116
            handleDistribution(state, desc, "DISTRITO FEDERAL", MexicoConabioTransformer.uuidDistrito_federal, line);
117
            handleDistribution(state, desc, "DURANGO", MexicoConabioTransformer.uuidDurango, line);
118
            handleDistribution(state, desc, "GUANAJUATO", MexicoConabioTransformer.uuidGuanajuato, line);
119
            handleDistribution(state, desc, "GUERRERO", MexicoConabioTransformer.uuidGuerrero, line);
120
            handleDistribution(state, desc, "HIDALGO", MexicoConabioTransformer.uuidHidalgo, line);
121
            handleDistribution(state, desc, "JALISCO", MexicoConabioTransformer.uuidJalisco, line);
122
            handleDistribution(state, desc, "MEXICO", MexicoConabioTransformer.uuidMexico, line);
123
            handleDistribution(state, desc, "MICHOACAN DE OCAMPO", MexicoConabioTransformer.uuidMichoacan_de_ocampo, line);
124
            handleDistribution(state, desc, "MORELOS", MexicoConabioTransformer.uuidMorelos, line);
125
            handleDistribution(state, desc, "NAYARIT", MexicoConabioTransformer.uuidNayarit, line);
126
            handleDistribution(state, desc, "NUEVO LEON", MexicoConabioTransformer.uuidNuevo_leon, line);
127
            handleDistribution(state, desc, "OAXACA", MexicoConabioTransformer.uuidOaxaca, line);
128
            handleDistribution(state, desc, "PUEBLA", MexicoConabioTransformer.uuidPuebla, line);
129
            handleDistribution(state, desc, "QUERETARO DE ARTEAGA", MexicoConabioTransformer.uuidQueretaro_de_arteaga, line);
130
            handleDistribution(state, desc, "QUINTANA ROO", MexicoConabioTransformer.uuidQuintana_roo, line);
131
            handleDistribution(state, desc, "SAN LUIS POTOSI", MexicoConabioTransformer.uuidSan_luis_potosi, line);
132
            handleDistribution(state, desc, "SINALOA", MexicoConabioTransformer.uuidSinaloa, line);
133
            handleDistribution(state, desc, "SONORA", MexicoConabioTransformer.uuidSonora, line);
134
            handleDistribution(state, desc, "TABASCO", MexicoConabioTransformer.uuidTabasco, line);
135
            handleDistribution(state, desc, "TAMAULIPAS", MexicoConabioTransformer.uuidTamaulipas, line);
136
            handleDistribution(state, desc, "TLAXCALA", MexicoConabioTransformer.uuidTlaxcala, line);
137
            handleDistribution(state, desc, "VERACRUZ DE IGNACIO DE LA LLAVE", MexicoConabioTransformer.uuidVeracruz_de_ignacio_de_la_llave, line);
138
            handleDistribution(state, desc, "YUCATAN", MexicoConabioTransformer.uuidYucatan, line);
139
            handleDistribution(state, desc, "ZACATECAS", MexicoConabioTransformer.uuidZacatecas, line);
140

    
141
            getTaxonService().save(taxon);
142
        }
143
    }
144

    
145
    private NamedArea getMexico() {
146
        if (mexico == null){
147
            mexico = CdmBase.deproxy(getTermService().find(MexicoConabioTransformer.uuidMexicoCountry), NamedArea.class);
148
            if (mexico == null){
149
                logger.warn("Mexico country not found");
150
            }
151
        }
152
        return mexico;
153
    }
154

    
155
    private Reference getReference(SimpleExcelTaxonImportState<CONFIG> state, String refStr) {
156
        if (StringUtils.isBlank(refStr)){
157
            return null;
158
        }
159
        Reference ref = state.getReference(refStr);
160
        if (ref == null){
161
            ref = ReferenceFactory.newBook();
162
            ref.setTitleCache(refStr, true);
163
            state.putReference(refStr, ref);
164
        }
165
        return ref;
166
    }
167

    
168
    private void handleDistribution(SimpleExcelTaxonImportState<CONFIG> state, TaxonDescription desc, String key,
169
            UUID uuid, String line) {
170
        Map<String, String> record = state.getOriginalRecord();
171
        String value = getValue(record, key);
172
        if ("1".equals(value)){
173
            NamedArea area = getNamedArea(state, uuid, null, null, null, null, null);
174
            Distribution dist = Distribution.NewInstance(area, PresenceAbsenceTerm.PRESENT());
175
            desc.addElement(dist);
176
        }else if (value != null){
177
            logger.warn(line + "Unrecognized distribution status '" + value + "' for " + key);
178
        }
179
    }
180

    
181
    private TaxonDescription getTaxonDescription(Taxon taxon) {
182
        if (!taxon.getDescriptions().isEmpty()){
183
            return taxon.getDescriptions().iterator().next();
184
        }else{
185
            TaxonDescription desc = TaxonDescription.NewInstance(taxon);
186
            return desc;
187
        }
188
    }
189

    
190
    @SuppressWarnings("unchecked")
191
    private void initAreaVocabulary(SimpleExcelTaxonImportState<CONFIG> state) {
192
        if (stateAreasVoc == null){
193
            stateAreasVoc = (OrderedTermVocabulary<NamedArea>)this.getVocabularyService().find(MexicoConabioTransformer.uuidMexicanStatesVoc);
194
            if (stateAreasVoc == null){
195
                createStateAreasVoc(state);
196
            }
197
        }
198
    }
199

    
200
    private void createStateAreasVoc(SimpleExcelTaxonImportState<CONFIG> state) {
201
        //voc
202
        URI termSourceUri = null;
203
        String label = "Mexican States";
204
        String description = "Mexican States as used by the CONABIO Rubiaceae database";
205
        stateAreasVoc = OrderedTermVocabulary.NewOrderedInstance(TermType.NamedArea, NamedArea.class,
206
                description, label, null, termSourceUri);
207
        stateAreasVoc.setUuid(MexicoConabioTransformer.uuidMexicanStatesVoc);
208
        Representation rep = Representation.NewInstance("Estados Méxicanos", "Estados Méxicanos", null, Language.SPANISH_CASTILIAN());
209
        stateAreasVoc.addRepresentation(rep);
210

    
211
        //mexico country
212
        String mexicoLabel = "Mexico (Country)";
213
        mexico = NamedArea.NewInstance(
214
                mexicoLabel, mexicoLabel, null);
215
        mexico.setUuid(MexicoConabioTransformer.uuidMexicoCountry);
216
        stateAreasVoc.addTerm(mexico);
217
         addMapping(mexico, "mex_adm0", "iso", "MEX");
218

    
219
         //Example with almost all areas is Chiococca alba
220
         addArea(state, "Aguascalientes", MexicoConabioTransformer.uuidAguascalientes);
221
         addArea(state, "Baja California", MexicoConabioTransformer.uuidBaja_california);
222
         addArea(state, "Baja California Sur", MexicoConabioTransformer.uuidBaja_california_sur);
223
         addArea(state, "Campeche", MexicoConabioTransformer.uuidCampeche);
224
         addArea(state, "Coahuila de Zaragoza", MexicoConabioTransformer.uuidCoahuila_de_zaragoza, "Coahuila");
225
         addArea(state, "Colima", MexicoConabioTransformer.uuidColima);
226
         addArea(state, "Chiapas", MexicoConabioTransformer.uuidChiapas);
227
         addArea(state, "Chihuahua", MexicoConabioTransformer.uuidChihuahua);
228
         addArea(state, "Distrito Federal", MexicoConabioTransformer.uuidDistrito_federal);
229
         addArea(state, "Durango", MexicoConabioTransformer.uuidDurango);
230
         addArea(state, "Guanajuato", MexicoConabioTransformer.uuidGuanajuato);
231
         addArea(state, "Guerrero", MexicoConabioTransformer.uuidGuerrero);
232
         addArea(state, "Hidalgo", MexicoConabioTransformer.uuidHidalgo);
233
         addArea(state, "Jalisco", MexicoConabioTransformer.uuidJalisco);
234
        //id_1
235
        addArea(state, "México", MexicoConabioTransformer.uuidMexico, null, 15);
236
        //id_1
237
        addArea(state, "Michoacan de Ocampo", MexicoConabioTransformer.uuidMichoacan_de_ocampo, "Michoacán", 16);
238
         addArea(state, "Morelos", MexicoConabioTransformer.uuidMorelos);
239
         addArea(state, "Nayarit", MexicoConabioTransformer.uuidNayarit);
240
        //gibt beim mapping vielleicht Probleme wg. des Accents
241
        //id_1
242
        addArea(state, "Nuevo Leon", MexicoConabioTransformer.uuidNuevo_leon, "Nuevo León", 19);
243
         addArea(state, "Oaxaca", MexicoConabioTransformer.uuidOaxaca);
244
         addArea(state, "Puebla", MexicoConabioTransformer.uuidPuebla);
245
        //id_1
246
        addArea(state, "Queretaro de Arteaga", MexicoConabioTransformer.uuidQueretaro_de_arteaga, "Querétaro", 22);
247
         addArea(state, "Quintana Roo", MexicoConabioTransformer.uuidQuintana_roo);
248
        //id_1
249
        addArea(state, "San Luis Potosí", MexicoConabioTransformer.uuidSan_luis_potosi,null ,24);
250
         addArea(state, "Sinaloa", MexicoConabioTransformer.uuidSinaloa);
251
         addArea(state, "Sonora", MexicoConabioTransformer.uuidSonora);
252
         addArea(state, "Tabasco", MexicoConabioTransformer.uuidTabasco);
253
         addArea(state, "Tamaulipas", MexicoConabioTransformer.uuidTamaulipas);
254
         addArea(state, "Tlaxcala", MexicoConabioTransformer.uuidTlaxcala);
255
         addArea(state, "Veracruz de Ignacio de la Llave", MexicoConabioTransformer.uuidVeracruz_de_ignacio_de_la_llave, "Veracruz");
256
        //??
257
        addArea(state, "Yucatán", MexicoConabioTransformer.uuidYucatan, null, 31);
258
         addArea(state, "Zacatecas", MexicoConabioTransformer.uuidZacatecas);
259

    
260
        this.getVocabularyService().save(stateAreasVoc);
261

    
262
        return;
263
    }
264

    
265

    
266
    private void addArea(SimpleExcelTaxonImportState<CONFIG> state, String areaLabel, UUID uuid) {
267
        addArea(state, areaLabel, uuid, areaLabel);  //short cut if label and mapping label are equal
268
    }
269

    
270
    private void addArea(SimpleExcelTaxonImportState<CONFIG> state, String areaLabel, UUID uuid, String mappingLabel) {
271
        addArea(state, areaLabel, uuid, mappingLabel, null);  //short cut if label and mapping label are equal
272
    }
273

    
274
    private void addArea(SimpleExcelTaxonImportState<CONFIG> state, String areaLabel, UUID uuid, String mappingLabel, Integer id1) {
275
        String abbrev = null;
276
        NamedArea newArea = NamedArea.NewInstance(
277
                areaLabel, areaLabel, abbrev);
278
        newArea.setUuid(uuid);
279
        newArea.setPartOf(mexico);
280
        newArea.setLevel(NamedAreaLevel.STATE());
281
        newArea.setType(NamedAreaType.ADMINISTRATION_AREA());
282
        stateAreasVoc.addTerm(newArea);
283
        if (id1 != null){
284
            addMapping(newArea, "mex_adm1", "id_1", String.valueOf(id1));
285
        }else if (mappingLabel != null){
286
            addMapping(newArea, "mex_adm1", "name_1", mappingLabel);
287
        }
288
    }
289

    
290
    private void addMapping(NamedArea area, String mapping_layer, String mapping_field, String abbrev) {
291
        GeoServiceAreaAnnotatedMapping mapping = (GeoServiceAreaAnnotatedMapping)this.getBean("geoServiceAreaAnnotatedMapping");
292
        GeoServiceArea geoServiceArea = new GeoServiceArea();
293
        geoServiceArea.add(mapping_layer, mapping_field, abbrev);
294
        mapping.set(area, geoServiceArea);
295
    }
296

    
297
    @Override
298
    protected boolean isIgnore(SimpleExcelTaxonImportState<CONFIG> state) {
299
        return ! state.getConfig().isDoDistributions();
300
    }
301

    
302
}
(4-4/26)