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.log4j.Logger;
17
import org.springframework.stereotype.Component;
18

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

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

    
47
    private static final long serialVersionUID = -1733208053395372094L;
48

    
49
    private static final Logger logger = Logger.getLogger(MexicoConabioDistributionImport.class);
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
    @SuppressWarnings("unchecked")
201
    private void createStateAreasVoc(SimpleExcelTaxonImportState<CONFIG> state) {
202
        //voc
203
        URI termSourceUri = null;
204
        String label = "Mexican States";
205
        String description = "Mexican States as used by the CONABIO Rubiaceae database";
206
        stateAreasVoc = OrderedTermVocabulary.NewInstance(TermType.NamedArea,
207
                description, label, null, termSourceUri);
208
        stateAreasVoc.setUuid(MexicoConabioTransformer.uuidMexicanStatesVoc);
209
        Representation rep = Representation.NewInstance("Estados Méxicanos", "Estados Méxicanos", null, Language.SPANISH_CASTILIAN());
210
        stateAreasVoc.addRepresentation(rep);
211

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

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

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

    
263
        return;
264
    }
265

    
266

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

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

    
275

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

    
297
    private void addMapping(NamedArea area, String mapping_layer, String mapping_field, String abbrev) {
298
        GeoServiceAreaAnnotatedMapping mapping = (GeoServiceAreaAnnotatedMapping)this.getBean("geoServiceAreaAnnotatedMapping");
299
        GeoServiceArea geoServiceArea = new GeoServiceArea();
300
        geoServiceArea.add(mapping_layer, mapping_field, abbrev);
301
        mapping.set(area, geoServiceArea);
302
    }
303

    
304
    @Override
305
    protected boolean isIgnore(SimpleExcelTaxonImportState<CONFIG> state) {
306
        return ! state.getConfig().isDoDistributions();
307
    }
308

    
309
}
(4-4/9)