Project

General

Profile

Download (15 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
        TaxonBase<?> parentBaseGL = state.getRelatedObject(RedListUtil.TAXON_GESAMTLISTE_NAMESPACE, parentId, TaxonBase.class);
136
        if(parentBaseGL!=null && !parentBaseGL.isInstanceOf(Taxon.class)){
137
            RedListUtil.logMessage(id, parentBaseGL+" is no taxon but is a parent of "+taxonBaseGL+" (Gesamtliste)", logger);
138
        }
139
        Taxon parentGL = (Taxon) state.getRelatedObject(RedListUtil.TAXON_GESAMTLISTE_NAMESPACE, parentId, TaxonBase.class);
140
        createParentChildNodes(gesamtListeClassification, id, gueltString, taxZusatzString, taxonBaseGL, parentGL);
141

    
142
        //Checkliste
143
        TaxonBase<?> taxonBaseCL = state.getRelatedObject(RedListUtil.TAXON_CHECKLISTE_NAMESPACE, String.valueOf(id), TaxonBase.class);
144
        TaxonBase<?> parentBaseCL = state.getRelatedObject(RedListUtil.TAXON_CHECKLISTE_NAMESPACE, parentId, TaxonBase.class);
145
        if(parentBaseCL!=null && !parentBaseCL.isInstanceOf(Taxon.class)){
146
            RedListUtil.logMessage(id, parentBaseCL+" is no taxon but is a parent of "+taxonBaseCL+" (Checkliste)", logger);
147
        }
148
        Taxon parentCL = (Taxon) state.getRelatedObject(RedListUtil.TAXON_CHECKLISTE_NAMESPACE, parentId, TaxonBase.class);
149
        if(taxonBaseCL!=null){//null check necessary because not all taxa exist in the checklist
150
            createParentChildNodes(checklistClassification, id, gueltString, taxZusatzString, taxonBaseCL, parentCL);
151
        }
152

    
153
        if(taxonBaseGL!= null && taxonBaseCL!=null
154
                && taxonBaseGL.getUuid().equals(taxonBaseCL.getUuid())){
155
            RedListUtil.logMessage(id, "Same UUID for "+taxonBaseGL+ " (Gesamtliste) and "+taxonBaseCL+" (Checkliste)", logger);
156
        }
157
        if(parentGL!=null && parentCL!=null && parentGL.getUuid().equals(parentCL.getUuid())){
158
            RedListUtil.logMessage(id, "Same UUID for "+parentGL+ " (Gesamtliste) and "+parentCL+" (Checkliste)", logger);
159
        }
160

    
161
        //add taxa for concept relationships to E, W, K, AW, AO, R, O, S
162
        addTaxonToClassification(classificationE, RedListUtil.CLASSIFICATION_NAMESPACE_E, id, state);
163
        addTaxonToClassification(classificationW, RedListUtil.CLASSIFICATION_NAMESPACE_W, id, state);
164
        addTaxonToClassification(classificationK, RedListUtil.CLASSIFICATION_NAMESPACE_K, id, state);
165
        addTaxonToClassification(classificationAW, RedListUtil.CLASSIFICATION_NAMESPACE_AW, id, state);
166
        addTaxonToClassification(classificationAO, RedListUtil.CLASSIFICATION_NAMESPACE_AO, id, state);
167
        addTaxonToClassification(classificationR, RedListUtil.CLASSIFICATION_NAMESPACE_R, id, state);
168
        addTaxonToClassification(classificationO, RedListUtil.CLASSIFICATION_NAMESPACE_O, id, state);
169
        addTaxonToClassification(classificationS, RedListUtil.CLASSIFICATION_NAMESPACE_S, id, state);
170
    }
171

    
172
    private void addTaxonToClassification(Classification classification, String classificationNamespace, long id, RedListGefaesspflanzenImportState state){
173
        Taxon taxon = HibernateProxyHelper.deproxy(state.getRelatedObject(classificationNamespace, String.valueOf(id), TaxonBase.class), Taxon.class);
174
        taxon.setSec(classification.getReference());
175
        classification.addChildTaxon(taxon, null, null);
176
    }
177

    
178
    private void createParentChildNodes(Classification classification, long id, String gueltString,
179
            String taxZusatzString, TaxonBase<?> taxonBase, Taxon parent) {
180
        if(taxonBase==null){
181
            RedListUtil.logMessage(id, "child taxon/synonym of "+parent+"  is null. ("+classification.generateTitle()+")" , logger);
182
            return;
183
        }
184
        //taxon
185
        if(taxonBase.isInstanceOf(Taxon.class)){
186
            //misapplied name
187
            String appendedPhrase = taxonBase.getAppendedPhrase();
188
            if(appendedPhrase!=null && appendedPhrase.equals(RedListUtil.AUCT)){
189
                if(parent==null){
190
                    RedListUtil.logMessage(id, "parent taxon of misapplied name "+taxonBase+"  is null. ("+classification.getTitleCache()+")" , logger);
191
                    return;
192
                }
193
                parent.addMisappliedName((Taxon) taxonBase, null, null);
194
            }
195
            else{
196
                classification.addParentChild(parent, (Taxon)taxonBase, null, null);
197
            }
198

    
199
            if(CdmUtils.isNotBlank(taxZusatzString)){
200
                if(taxZusatzString.trim().equals("p. p.")){
201
                    RedListUtil.logMessage(id, "pro parte for accepted taxon "+taxonBase, logger);
202
                }
203
            }
204
        }
205
        //synonym
206
        else if(taxonBase.isInstanceOf(Synonym.class)){
207
            if(parent==null){
208
                RedListUtil.logMessage(id, "parent taxon of synonym "+taxonBase+"  is null. ("+classification.getTitleCache()+")" , logger);
209
                return;
210
            }
211
            //basionym
212
            if(gueltString.equals(RedListUtil.GUELT_BASIONYM)){
213
                parent.addHomotypicSynonym((Synonym) taxonBase, null, null);
214
                parent.getName().addBasionym(taxonBase.getName());
215
            }
216
            //regular synonym
217
            else{
218
                SynonymRelationship synonymRelationship = parent.addSynonym((Synonym) taxonBase, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF(), null, null);
219

    
220
                //TAX_ZUSATZ
221
                if(CdmUtils.isNotBlank(taxZusatzString)){
222
                    if(taxZusatzString.trim().equals("p. p.")){
223
                        synonymRelationship.setProParte(true);
224
                    }
225
                    else if(taxZusatzString.trim().equals("s. l. p. p.")){
226
                        synonymRelationship.setProParte(true);
227
                        taxonBase.setAppendedPhrase("s. l.");
228
                    }
229
                    else if(taxZusatzString.trim().equals("s. str. p. p.")){
230
                        synonymRelationship.setProParte(true);
231
                        taxonBase.setAppendedPhrase("s. str.");
232
                    }
233
                    else if(taxZusatzString.trim().equals("s. l.")
234
                            || taxZusatzString.trim().equals("s. str.")){
235
                        taxonBase.setAppendedPhrase(taxZusatzString);
236
                    }
237
                    else{
238
                        RedListUtil.logMessage(id, "unknown value "+taxZusatzString+" for column "+RedListUtil.TAX_ZUSATZ, logger);
239
                    }
240
                }
241
            }
242
        }
243
        //set sec reference
244
        taxonBase.setSec(classification.getReference());
245
        taxonBase.setTitleCache(null, false);//refresh title cache
246
    }
247

    
248
    @Override
249
    public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
250
            RedListGefaesspflanzenImportState state) {
251
        Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
252

    
253
        Set<String> idSet = new HashSet<String>();
254
        try {
255
            while (rs.next()){
256
                idSet.add(String.valueOf(rs.getLong(RedListUtil.NAMNR)));
257
                idSet.add(String.valueOf(rs.getLong(RedListUtil.LOWER)));
258
            }
259
        } catch (SQLException e) {
260
            e.printStackTrace();
261
        }
262
        Map<String, TaxonBase> taxonMapGesamtListe = (Map<String, TaxonBase>) getCommonService().getSourcedObjectsByIdInSource(TaxonBase.class, idSet, RedListUtil.TAXON_GESAMTLISTE_NAMESPACE);
263
        result.put(RedListUtil.TAXON_GESAMTLISTE_NAMESPACE, taxonMapGesamtListe);
264
        Map<String, TaxonBase> taxonMapCheckliste = (Map<String, TaxonBase>) getCommonService().getSourcedObjectsByIdInSource(TaxonBase.class, idSet, RedListUtil.TAXON_CHECKLISTE_NAMESPACE);
265
        result.put(RedListUtil.TAXON_CHECKLISTE_NAMESPACE, taxonMapCheckliste);
266
        return result;
267
    }
268

    
269
    private void makeClassification(String classificationName, UUID classificationUuid, String referenceName, UUID referenceUuid, RedListGefaesspflanzenImportState state) {
270
        Classification classification = Classification.NewInstance(classificationName, Language.DEFAULT());
271
        classification.setUuid(classificationUuid);
272
        Reference gesamtListeReference = ReferenceFactory.newGeneric();
273
        gesamtListeReference.setTitle(referenceName);
274
        gesamtListeReference.setUuid(referenceUuid);
275
        classification.setReference(gesamtListeReference);
276
        getClassificationService().save(classification);
277
    }
278

    
279
    @Override
280
    protected boolean doCheck(RedListGefaesspflanzenImportState state) {
281
        return false;
282
    }
283

    
284
    @Override
285
    protected boolean isIgnore(RedListGefaesspflanzenImportState state) {
286
        return false;
287
    }
288

    
289
}
(2-2/7)