Project

General

Profile

Download (13.7 KB) Statistics
| Branch: | Revision:
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.redlist.gefaesspflanzen;
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

    
19
import org.apache.log4j.Logger;
20
import org.springframework.stereotype.Component;
21

    
22
import eu.etaxonomy.cdm.common.CdmUtils;
23
import eu.etaxonomy.cdm.io.common.DbImportBase;
24
import eu.etaxonomy.cdm.io.common.IPartitionedIO;
25
import eu.etaxonomy.cdm.io.common.ImportHelper;
26
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
27
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
28
import eu.etaxonomy.cdm.model.agent.AgentBase;
29
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
30
import eu.etaxonomy.cdm.model.common.CdmBase;
31
import eu.etaxonomy.cdm.model.name.BotanicalName;
32
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
33
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
34
import eu.etaxonomy.cdm.model.name.Rank;
35
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
36
import eu.etaxonomy.cdm.model.taxon.Synonym;
37
import eu.etaxonomy.cdm.model.taxon.Taxon;
38
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
39

    
40
/**
41
 *
42
 * @author pplitzner
43
 * @date Mar 1, 2016
44
 *
45
 */
46

    
47
@Component
48
@SuppressWarnings("serial")
49
public class RedListGefaesspflanzenImportNames extends DbImportBase<RedListGefaesspflanzenImportState, RedListGefaesspflanzenImportConfigurator> {
50

    
51
    private static final Logger logger = Logger.getLogger(RedListGefaesspflanzenImportNames.class);
52

    
53
    private static final String tableName = "Rote Liste Gefäßpflanzen";
54

    
55
    private static final String pluralString = "names";
56

    
57
    public RedListGefaesspflanzenImportNames() {
58
        super(tableName, pluralString);
59
    }
60

    
61
    @Override
62
    protected String getIdQuery(RedListGefaesspflanzenImportState state) {
63
        return "SELECT NAMNR "
64
                + "FROM V_TAXATLAS_D20_EXPORT t "
65
                + " ORDER BY NAMNR";
66
    }
67

    
68
    @Override
69
    protected String getRecordQuery(RedListGefaesspflanzenImportConfigurator config) {
70
        String result = " SELECT * "
71
                + " FROM V_TAXATLAS_D20_EXPORT t "
72
                + " WHERE t.NAMNR IN (@IDSET)";
73
        result = result.replace("@IDSET", IPartitionedIO.ID_LIST_TOKEN);
74
        return result;
75
    }
76

    
77
    @Override
78
    protected void doInvoke(RedListGefaesspflanzenImportState state) {
79
        super.doInvoke(state);
80
    }
81

    
82

    
83
    @Override
84
    public boolean doPartition(ResultSetPartitioner partitioner, RedListGefaesspflanzenImportState state) {
85
        ResultSet rs = partitioner.getResultSet();
86
        Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
87
        Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();
88
        try {
89
            while (rs.next()){
90
                makeSingleNameAndTaxon(state, rs, namesToSave, taxaToSave);
91

    
92
            }
93
        } catch (SQLException e) {
94
            e.printStackTrace();
95
        }
96

    
97
        getNameService().saveOrUpdate(namesToSave);
98
        getTaxonService().saveOrUpdate(taxaToSave);
99
        return true;
100
    }
101

    
102
    private void makeSingleNameAndTaxon(RedListGefaesspflanzenImportState state, ResultSet rs, Set<TaxonNameBase> namesToSave, Set<TaxonBase> taxaToSave)
103
            throws SQLException {
104
        long id = rs.getLong(RedListUtil.NAMNR);
105
        String taxNameString = rs.getString(RedListUtil.TAXNAME);
106
        String gueltString = rs.getString(RedListUtil.GUELT);
107
        String rangString = rs.getString(RedListUtil.RANG);
108
        String ep1String = rs.getString(RedListUtil.EPI1);
109
        String ep2String = rs.getString(RedListUtil.EPI2);
110
        String ep3String = rs.getString(RedListUtil.EPI3);
111
        String nomZusatzString = rs.getString(RedListUtil.NOM_ZUSATZ);
112
        String zusatzString = rs.getString(RedListUtil.ZUSATZ);
113
        String authorKombString = rs.getString(RedListUtil.AUTOR_KOMB);
114
        String authorBasiString = rs.getString(RedListUtil.AUTOR_BASI);
115

    
116
        //---NAME---
117
        if(CdmUtils.isBlank(taxNameString) && CdmUtils.isBlank(ep1String)){
118
            RedListUtil.logMessage(id, "No name found!", logger);
119
        }
120

    
121
        Rank rank = makeRank(id, state, rangString);
122
        if(rank==null){
123
            RedListUtil.logMessage(id, "Rank could not be resolved.", logger);
124
        }
125
        BotanicalName name = BotanicalName.NewInstance(rank);
126

    
127
        //ep1 should always be present
128
        if(CdmUtils.isBlank(ep1String)){
129
            RedListUtil.logMessage(id, RedListUtil.EPI1+" is empty!", logger);
130
        }
131
        name.setGenusOrUninomial(ep1String);
132
        if(!CdmUtils.isBlank(ep2String)){
133
            name.setSpecificEpithet(ep2String);
134
        }
135
        if(!CdmUtils.isBlank(ep3String)){
136
            if(rank==Rank.SUBSPECIES() ||
137
                    rank==Rank.VARIETY()){
138
                name.setInfraSpecificEpithet(ep3String);
139
            }
140
        }
141
        //nomenclatural status
142
        NomenclaturalStatusType status = makeNomenclaturalStatus(id, state, nomZusatzString);
143
        if(status!=null){
144
            name.addStatus(NomenclaturalStatus.NewInstance(status));
145
        }
146

    
147

    
148
        //--- AUTHORS ---
149
        //combination author
150
        if(authorKombString.contains(RedListUtil.EX)){
151
            //TODO: what happens with multiple ex authors??
152
            String[] kombSplit = authorKombString.split(RedListUtil.EX);
153
            if(kombSplit.length!=2){
154
                RedListUtil.logMessage(id, "Multiple ex combination authors found", logger);
155
            }
156
            for (int i = 0; i < kombSplit.length; i++) {
157
                if(i==0){
158
                    //first author is ex author
159
                    TeamOrPersonBase authorKomb = (TeamOrPersonBase) state.getRelatedObject(RedListUtil.AUTHOR_NAMESPACE, kombSplit[i]);
160
                    name.setExCombinationAuthorship(authorKomb);
161
                }
162
                else{
163
                    TeamOrPersonBase authorKomb = (TeamOrPersonBase) state.getRelatedObject(RedListUtil.AUTHOR_NAMESPACE, kombSplit[i]);
164
                    name.setCombinationAuthorship(authorKomb);
165
                }
166
            }
167
        }
168
        else if(authorKombString.trim().equals(RedListUtil.AUCT)){
169
            RedListUtil.logMessage(id, "AUCT information in "+RedListUtil.AUTOR_KOMB+" column", logger);
170
        }
171
        else if(!CdmUtils.isBlank(authorKombString)){
172
            TeamOrPersonBase authorKomb = (TeamOrPersonBase) state.getRelatedObject(RedListUtil.AUTHOR_NAMESPACE, authorKombString);
173
            name.setCombinationAuthorship(authorKomb);
174
        }
175
        //basionym author
176
        if(authorBasiString.contains(RedListUtil.EX)){
177
            String[] basiSplit = authorBasiString.split(RedListUtil.EX);
178
            for (int i = 0; i < basiSplit.length; i++) {
179
                if(basiSplit.length!=2){
180
                    RedListUtil.logMessage(id, "Multiple ex basionymn authors found", logger);
181
                }
182
                if(i==0){
183
                    TeamOrPersonBase authorBasi= (TeamOrPersonBase) state.getRelatedObject(RedListUtil.AUTHOR_NAMESPACE, basiSplit[i]);
184
                    if(CdmUtils.isBlank(authorKombString)){
185
                        name.setExCombinationAuthorship(authorBasi);
186
                    }
187
                    else{
188
                        name.setExBasionymAuthorship(authorBasi);
189
                    }
190
                }
191
                else{
192
                    TeamOrPersonBase authorBasi= (TeamOrPersonBase) state.getRelatedObject(RedListUtil.AUTHOR_NAMESPACE, basiSplit[i]);
193
                    if(CdmUtils.isBlank(authorKombString)){
194
                        name.setCombinationAuthorship(authorBasi);
195
                    }
196
                    else{
197
                        name.setBasionymAuthorship(authorBasi);
198
                    }
199
                }
200
            }
201
        }
202
        else if(authorBasiString.trim().equals(RedListUtil.AUCT)){
203
            name.setAppendedPhrase(authorBasiString);
204
        }
205
        else if(!CdmUtils.isBlank(authorBasiString)){
206
            //this seems to be a convention in the source database: When there is only a single author then only the "AUTOR_BASI" column is used
207
            TeamOrPersonBase authorBasi= (TeamOrPersonBase) state.getRelatedObject(RedListUtil.AUTHOR_NAMESPACE, authorBasiString);
208
            if(CdmUtils.isBlank(authorKombString)){
209
                name.setCombinationAuthorship(authorBasi);
210
            }
211
            else{
212
                name.setBasionymAuthorship(authorBasi);
213
            }
214
        }
215

    
216
        //check authorship consistency
217
        String authorString = rs.getString(RedListUtil.AUTOR);
218
        String authorshipCache = name.getAuthorshipCache();
219

    
220
        if(!CdmUtils.isBlank(zusatzString)){
221
            authorString = authorString.replace(", "+zusatzString, "");
222
        }
223
//        if(CdmUtils.isBlank(authorKombString) && !CdmUtils.isBlank(authorBasiString)){
224
//            authorString = "("+authorString+")";
225
//        }
226
        if(authorString.equals(RedListUtil.AUCT)){
227
            authorString = "";
228
        }
229
        if(!authorString.equals(authorshipCache)){
230
            RedListUtil.logMessage(id, "Authorship inconsistent! name.authorhshipCache <-> Column "+RedListUtil.AUTOR+": "+authorshipCache+" <-> "+authorString, logger);
231
        }
232

    
233
        //id
234
        ImportHelper.setOriginalSource(name, state.getTransactionalSourceReference(), id, RedListUtil.NAME_NAMESPACE);
235
        state.getNameMap().put(id, name.getUuid());
236

    
237
        namesToSave.add(name);
238

    
239
        //---TAXON---
240
        TaxonBase taxonBase = null;
241
        if(gueltString.equals(RedListUtil.GUELT_ACCEPTED_TAXON) || (name.getAppendedPhrase()!=null && name.getAppendedPhrase().equals(RedListUtil.AUCT))){
242
            taxonBase = Taxon.NewInstance(name, null);
243
        }
244
        else if(gueltString.equals(RedListUtil.GUELT_SYNONYM) || gueltString.equals(RedListUtil.GUELT_BASIONYM)){
245
            taxonBase = Synonym.NewInstance(name, null);
246
        }
247
        if(taxonBase==null){
248
            RedListUtil.logMessage(id, "Taxon for name "+name+" could not be created.", logger);
249
            return;
250
        }
251

    
252
        taxaToSave.add(taxonBase);
253

    
254
        //id
255
        ImportHelper.setOriginalSource(taxonBase, state.getTransactionalSourceReference(), id, RedListUtil.TAXON_NAMESPACE);
256
        state.getTaxonMap().put(id, taxonBase.getUuid());
257
    }
258

    
259
    private Rank makeRank(long id, RedListGefaesspflanzenImportState state, String rankStr) {
260
        Rank rank = null;
261
        try {
262
            rank = state.getTransformer().getRankByKey(rankStr);
263
        } catch (UndefinedTransformerMethodException e) {
264
            e.printStackTrace();
265
        }
266
        if(rank==null){
267
            RedListUtil.logMessage(id, rankStr+" could not be associated to a known rank.", logger);
268
        }
269
        return rank;
270
    }
271

    
272
    private NomenclaturalStatusType makeNomenclaturalStatus(long id, RedListGefaesspflanzenImportState state, String nomZusatzString) {
273
        NomenclaturalStatusType status = null;
274
        try {
275
            status = state.getTransformer().getNomenclaturalStatusByKey(nomZusatzString);
276
        } catch (UndefinedTransformerMethodException e) {
277
            e.printStackTrace();
278
        }
279
        if(status==null){
280
            RedListUtil.logMessage(id, nomZusatzString+" could not be associated to a known nomenclatural status.", logger);
281
        }
282
        return status;
283
    }
284

    
285

    
286

    
287
    @Override
288
    public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
289
            RedListGefaesspflanzenImportState state) {
290
        Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
291
        Map<String, AgentBase<?>> authorMap = new HashMap<String, AgentBase<?>>();
292

    
293
        try {
294
            while (rs.next()){
295
                String authorKombString = rs.getString(RedListUtil.AUTOR_KOMB);
296

    
297
                if(authorKombString.contains(RedListUtil.EX)){
298
                    String[] kombSplit = authorKombString.split(RedListUtil.EX);
299
                    for (int i = 0; i < kombSplit.length; i++) {
300
                        if(!authorMap.containsKey(kombSplit[i])){
301
                            authorMap.put(kombSplit[i], getAgentService().load(state.getAuthorMap().get(kombSplit[i])));
302
                        }
303
                    }
304
                }
305
                else if(!CdmUtils.isBlank(authorKombString) && !authorMap.containsKey(authorKombString)){
306
                    authorMap.put(authorKombString, getAgentService().load(state.getAuthorMap().get(authorKombString)));
307
                }
308

    
309
                String authorBasiString = rs.getString(RedListUtil.AUTOR_BASI);
310
                //basionym author
311
                if(authorBasiString.contains(RedListUtil.EX)){
312
                    String[] basiSplit = authorBasiString.split(RedListUtil.EX);
313
                    for (int i = 0; i < basiSplit.length; i++) {
314
                        if(!authorMap.containsKey(basiSplit[i])){
315
                            authorMap.put(basiSplit[i], getAgentService().load(state.getAuthorMap().get(basiSplit[i])));
316
                        }
317
                    }
318
                }
319
                else if(!CdmUtils.isBlank(authorBasiString) && !authorMap.containsKey(authorBasiString)){
320
                    authorMap.put(authorBasiString, getAgentService().load(state.getAuthorMap().get(authorBasiString)));
321
                }
322
            }
323
        } catch (SQLException e) {
324
            e.printStackTrace();
325
        }
326
        result.put(RedListUtil.AUTHOR_NAMESPACE, authorMap);
327

    
328
        return result;
329
    }
330

    
331
    @Override
332
    protected boolean doCheck(RedListGefaesspflanzenImportState state) {
333
        return false;
334
    }
335

    
336
    @Override
337
    protected boolean isIgnore(RedListGefaesspflanzenImportState state) {
338
        return false;
339
    }
340

    
341
}
(4-4/7)