Project

General

Profile

Download (14.3 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
import java.util.UUID;
19

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

    
23
import eu.etaxonomy.cdm.common.CdmUtils;
24
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
25
import eu.etaxonomy.cdm.io.common.DbImportBase;
26
import eu.etaxonomy.cdm.io.common.IPartitionedIO;
27
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28
import eu.etaxonomy.cdm.model.common.CdmBase;
29
import eu.etaxonomy.cdm.model.common.Language;
30
import eu.etaxonomy.cdm.model.reference.Reference;
31
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
32
import eu.etaxonomy.cdm.model.taxon.Classification;
33
import eu.etaxonomy.cdm.model.taxon.Synonym;
34
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
35
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
36
import eu.etaxonomy.cdm.model.taxon.Taxon;
37
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
38

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

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

    
50
    private static final Logger logger = Logger.getLogger(RedListGefaesspflanzenImportClassification.class);
51

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

    
54
    private static final String pluralString = "classifications";
55

    
56
    public RedListGefaesspflanzenImportClassification() {
57
        super(tableName, pluralString);
58
    }
59

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

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

    
76
    @Override
77
    protected void doInvoke(RedListGefaesspflanzenImportState state) {
78
        makeClassification("Gesamtliste", state.getConfig().getClassificationUuid(), "Gesamtliste_ref", RedListUtil.gesamtListeReferenceUuid, state);
79
        makeClassification("Checkliste", RedListUtil.checkListClassificationUuid, "Checkliste_ref", RedListUtil.checkListReferenceUuid, state);
80
        makeClassification("E", RedListUtil.uuidClassificationE, "E_ref", RedListUtil.uuidClassificationReferenceE, state);
81
        makeClassification("W", RedListUtil.uuidClassificationW, "W_ref", RedListUtil.uuidClassificationReferenceW, state);
82
        makeClassification("K", RedListUtil.uuidClassificationK, "K_ref", RedListUtil.uuidClassificationReferenceK, state);
83
        makeClassification("AW", RedListUtil.uuidClassificationAW, "AW_ref", RedListUtil.uuidClassificationReferenceAW, state);
84
        makeClassification("AO", RedListUtil.uuidClassificationAO, "AO_ref", RedListUtil.uuidClassificationReferenceAO, state);
85
        makeClassification("R", RedListUtil.uuidClassificationR, "R_ref", RedListUtil.uuidClassificationReferenceR, state);
86
        makeClassification("O", RedListUtil.uuidClassificationO, "O_ref", RedListUtil.uuidClassificationReferenceO, state);
87
        makeClassification("S", RedListUtil.uuidClassificationS, "S_ref", RedListUtil.uuidClassificationReferenceS, state);
88
        super.doInvoke(state);
89
    }
90

    
91

    
92
    @Override
93
    public boolean doPartition(ResultSetPartitioner partitioner, RedListGefaesspflanzenImportState state) {
94
        ResultSet rs = partitioner.getResultSet();
95
        Classification gesamtListeClassification = getClassificationService().load(state.getConfig().getClassificationUuid());
96
        Classification checklistClassification = getClassificationService().load(RedListUtil.checkListClassificationUuid);
97
        Classification classificationE = getClassificationService().load(RedListUtil.uuidClassificationE);
98
        Classification classificationW = getClassificationService().load(RedListUtil.uuidClassificationW);
99
        Classification classificationK = getClassificationService().load(RedListUtil.uuidClassificationK);
100
        Classification classificationAW = getClassificationService().load(RedListUtil.uuidClassificationAW);
101
        Classification classificationAO = getClassificationService().load(RedListUtil.uuidClassificationAO);
102
        Classification classificationR = getClassificationService().load(RedListUtil.uuidClassificationR);
103
        Classification classificationO = getClassificationService().load(RedListUtil.uuidClassificationO);
104
        Classification classificationS = getClassificationService().load(RedListUtil.uuidClassificationS);
105
        try {
106
            while (rs.next()){
107
                makeSingleTaxonNode(state, rs, gesamtListeClassification, checklistClassification,
108
                        classificationE, classificationW, classificationK, classificationAW
109
                        , classificationAO, classificationR, classificationO, classificationS);
110

    
111
            }
112
        } catch (SQLException e) {
113
            e.printStackTrace();
114
        }
115

    
116
        logger.info("Update classification (1000 nodes)");
117
        getClassificationService().saveOrUpdate(gesamtListeClassification);
118
        getClassificationService().saveOrUpdate(checklistClassification);
119
        return true;
120
    }
121

    
122
    private void makeSingleTaxonNode(RedListGefaesspflanzenImportState state, ResultSet rs,
123
            Classification gesamtListeClassification, Classification checklistClassification,
124
            Classification classificationE, Classification classificationW, Classification classificationK,
125
            Classification classificationAW, Classification classificationAO, Classification classificationR,
126
            Classification classificationO, Classification classificationS)
127
            throws SQLException {
128
        long id = rs.getLong(RedListUtil.NAMNR);
129
        String parentId = String.valueOf(rs.getLong(RedListUtil.LOWER));
130
        String gueltString = rs.getString(RedListUtil.GUELT);
131
        String taxZusatzString = rs.getString(RedListUtil.TAX_ZUSATZ);
132

    
133
        //Gesamtliste
134
        TaxonBase taxonBaseGL = state.getRelatedObject(RedListUtil.TAXON_GESAMTLISTE_NAMESPACE, String.valueOf(id), TaxonBase.class);
135
        Taxon parentGL = (Taxon) state.getRelatedObject(RedListUtil.TAXON_GESAMTLISTE_NAMESPACE, parentId, TaxonBase.class);
136
        createParentChildNodes(gesamtListeClassification, id, gueltString, taxZusatzString, taxonBaseGL, parentGL);
137

    
138
        //Checkliste
139
        TaxonBase taxonBaseCL = state.getRelatedObject(RedListUtil.TAXON_CHECKLISTE_NAMESPACE, String.valueOf(id), TaxonBase.class);
140
        Taxon parentCL = (Taxon) state.getRelatedObject(RedListUtil.TAXON_CHECKLISTE_NAMESPACE, parentId, TaxonBase.class);
141
        if(taxonBaseCL!=null){//null check necessary because not all taxa exist in the checklist
142
            createParentChildNodes(checklistClassification, id, gueltString, taxZusatzString, taxonBaseCL, parentCL);
143
        }
144

    
145
        if(taxonBaseGL!= null && taxonBaseCL!=null
146
                && taxonBaseGL.getUuid().equals(taxonBaseCL.getUuid())){
147
            RedListUtil.logMessage(id, "Same UUID for "+taxonBaseGL+ " (Gesamtliste) and "+taxonBaseCL+" (Checkliste)", logger);
148
        }
149
        if(parentGL!=null && parentCL!=null && parentGL.getUuid().equals(parentCL.getUuid())){
150
            RedListUtil.logMessage(id, "Same UUID for "+parentGL+ " (Gesamtliste) and "+parentCL+" (Checkliste)", logger);
151
        }
152

    
153
        //add taxa for concept relationships to E, W, K, AW, AO, R, O, S
154
        addTaxonToClassification(classificationE, RedListUtil.CLASSIFICATION_NAMESPACE_E, id, state);
155
        addTaxonToClassification(classificationW, RedListUtil.CLASSIFICATION_NAMESPACE_W, id, state);
156
        addTaxonToClassification(classificationK, RedListUtil.CLASSIFICATION_NAMESPACE_K, id, state);
157
        addTaxonToClassification(classificationAW, RedListUtil.CLASSIFICATION_NAMESPACE_AW, id, state);
158
        addTaxonToClassification(classificationAO, RedListUtil.CLASSIFICATION_NAMESPACE_AO, id, state);
159
        addTaxonToClassification(classificationR, RedListUtil.CLASSIFICATION_NAMESPACE_R, id, state);
160
        addTaxonToClassification(classificationO, RedListUtil.CLASSIFICATION_NAMESPACE_O, id, state);
161
        addTaxonToClassification(classificationS, RedListUtil.CLASSIFICATION_NAMESPACE_S, id, state);
162
    }
163

    
164
    private void addTaxonToClassification(Classification classification, String classificationNamespace, long id, RedListGefaesspflanzenImportState state){
165
        Taxon taxon = HibernateProxyHelper.deproxy(state.getRelatedObject(classificationNamespace, String.valueOf(id), TaxonBase.class), Taxon.class);
166
        classification.addChildTaxon(taxon, null, null);
167
    }
168

    
169
    private void createParentChildNodes(Classification classification, long id, String gueltString,
170
            String taxZusatzString, TaxonBase taxonBase, Taxon parent) {
171
        if(taxonBase==null){
172
            RedListUtil.logMessage(id, "child taxon/synonym of "+parent+"  is null. ("+classification.getTitleCache()+")" , logger);
173
            return;
174
        }
175
        //taxon
176
        if(taxonBase.isInstanceOf(Taxon.class)){
177
            //misapplied name
178
            String appendedPhrase = taxonBase.getAppendedPhrase();
179
            if(appendedPhrase!=null && appendedPhrase.equals(RedListUtil.AUCT)){
180
                if(parent==null){
181
                    RedListUtil.logMessage(id, "parent taxon of misapplied name "+taxonBase+"  is null. ("+classification.getTitleCache()+")" , logger);
182
                    return;
183
                }
184
                parent.addMisappliedName((Taxon) taxonBase, null, null);
185
            }
186
            else{
187
                classification.addParentChild(parent, (Taxon)taxonBase, null, null);
188
            }
189

    
190
            if(CdmUtils.isNotBlank(taxZusatzString)){
191
                if(taxZusatzString.trim().equals("p. p.")){
192
                    RedListUtil.logMessage(id, "pro parte for accepted taxon "+taxonBase, logger);
193
                }
194
            }
195
        }
196
        //synonym
197
        else if(taxonBase.isInstanceOf(Synonym.class)){
198
            if(parent==null){
199
                RedListUtil.logMessage(id, "parent taxon of synonym "+taxonBase+"  is null. ("+classification.getTitleCache()+")" , logger);
200
                return;
201
            }
202
            //basionym
203
            if(gueltString.equals(RedListUtil.GUELT_BASIONYM)){
204
                parent.addHomotypicSynonym((Synonym) taxonBase, null, null);
205
                parent.getName().addBasionym(taxonBase.getName());
206
            }
207
            //regular synonym
208
            else{
209
                SynonymRelationship synonymRelationship = parent.addSynonym((Synonym) taxonBase, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF(), null, null);
210

    
211
                //TAX_ZUSATZ
212
                if(CdmUtils.isNotBlank(taxZusatzString)){
213
                    if(taxZusatzString.trim().equals("p. p.")){
214
                        synonymRelationship.setProParte(true);
215
                    }
216
                    else if(taxZusatzString.trim().equals("s. l. p. p.")){
217
                        synonymRelationship.setProParte(true);
218
                        taxonBase.setAppendedPhrase("s. l.");
219
                    }
220
                    else if(taxZusatzString.trim().equals("s. str. p. p.")){
221
                        synonymRelationship.setProParte(true);
222
                        taxonBase.setAppendedPhrase("s. str.");
223
                    }
224
                    else if(taxZusatzString.trim().equals("s. l.")
225
                            || taxZusatzString.trim().equals("s. str.")){
226
                        taxonBase.setAppendedPhrase(taxZusatzString);
227
                    }
228
                    else{
229
                        RedListUtil.logMessage(id, "unknown value "+taxZusatzString+" for column "+RedListUtil.TAX_ZUSATZ, logger);
230
                    }
231
                }
232
            }
233
        }
234
        //set sec reference
235
        taxonBase.setSec(classification.getReference());
236
        taxonBase.setTitleCache(null, false);//refresh title cache
237
    }
238

    
239
    @Override
240
    public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
241
            RedListGefaesspflanzenImportState state) {
242
        Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
243

    
244
        Set<String> idSet = new HashSet<String>();
245
        try {
246
            while (rs.next()){
247
                idSet.add(String.valueOf(rs.getLong(RedListUtil.NAMNR)));
248
                idSet.add(String.valueOf(rs.getLong(RedListUtil.LOWER)));
249
            }
250
        } catch (SQLException e) {
251
            e.printStackTrace();
252
        }
253
        Map<String, TaxonBase> taxonMapGesamtListe = (Map<String, TaxonBase>) getCommonService().getSourcedObjectsByIdInSource(TaxonBase.class, idSet, RedListUtil.TAXON_GESAMTLISTE_NAMESPACE);
254
        result.put(RedListUtil.TAXON_GESAMTLISTE_NAMESPACE, taxonMapGesamtListe);
255
        Map<String, TaxonBase> taxonMapCheckliste = (Map<String, TaxonBase>) getCommonService().getSourcedObjectsByIdInSource(TaxonBase.class, idSet, RedListUtil.TAXON_CHECKLISTE_NAMESPACE);
256
        result.put(RedListUtil.TAXON_CHECKLISTE_NAMESPACE, taxonMapCheckliste);
257
        return result;
258
    }
259

    
260
    private void makeClassification(String classificationName, UUID classificationUuid, String referenceName, UUID referenceUuid, RedListGefaesspflanzenImportState state) {
261
        Classification classification = Classification.NewInstance(classificationName, Language.DEFAULT());
262
        classification.setUuid(classificationUuid);
263
        Reference gesamtListeReference = ReferenceFactory.newGeneric();
264
        gesamtListeReference.setTitle(referenceName);
265
        gesamtListeReference.setUuid(referenceUuid);
266
        classification.setReference(gesamtListeReference);
267
        getClassificationService().save(classification);
268
    }
269

    
270
    @Override
271
    protected boolean doCheck(RedListGefaesspflanzenImportState state) {
272
        return false;
273
    }
274

    
275
    @Override
276
    protected boolean isIgnore(RedListGefaesspflanzenImportState state) {
277
        return false;
278
    }
279

    
280
}
(2-2/7)