Project

General

Profile

Download (9.58 KB) Statistics
| Branch: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2015 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10
package eu.etaxonomy.cdm.io.edaphobase;
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.List;
17
import java.util.Map;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.apache.log4j.Logger;
22
import org.codehaus.plexus.util.StringUtils;
23
import org.springframework.stereotype.Component;
24

    
25
import eu.etaxonomy.cdm.io.common.IPartitionedIO;
26
import eu.etaxonomy.cdm.io.common.ImportHelper;
27
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
29
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
30
import eu.etaxonomy.cdm.model.common.CdmBase;
31
import eu.etaxonomy.cdm.model.name.Rank;
32
import eu.etaxonomy.cdm.model.name.ZoologicalName;
33
import eu.etaxonomy.cdm.model.reference.Reference;
34
import eu.etaxonomy.cdm.model.taxon.Synonym;
35
import eu.etaxonomy.cdm.model.taxon.Taxon;
36
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
37

    
38
/**
39
 * @author a.mueller
40
 * @date 18.12.2015
41
 *
42
 */
43
@Component
44
public class EdaphobaseTaxonImport extends EdaphobaseImportBase {
45
    private static final long serialVersionUID = -9138378836474086070L;
46
    private static final Logger logger = Logger.getLogger(EdaphobaseTaxonImport.class);
47

    
48
    private static final String tableName = "tax_taxon";
49

    
50
    private static final String pluralString = "taxa";
51

    
52
    private static final Object AUTHOR_NAMESPACE = "tax_author_name";
53

    
54
    /**
55
     * @param tableName
56
     * @param pluralString
57
     */
58
    public EdaphobaseTaxonImport() {
59
        super(tableName, pluralString);
60
    }
61

    
62
    @Override
63
    protected String getIdQuery(EdaphobaseImportState state) {
64
        return "SELECT DISTINCT taxon_id FROM tax_taxon t "
65
                + " ORDER BY taxon_id";
66
    }
67

    
68
    @Override
69
    protected String getRecordQuery(EdaphobaseImportConfigurator config) {
70
        String result = " SELECT DISTINCT t.*, r.value as rankStr, pr.value as parentRankStr, ppr.value as grandParentRankStr, "
71
                    + " pt.name as parentName, ppt.name as grandParentName "
72
                + " FROM tax_taxon t "
73
                    + " LEFT JOIN tax_taxon pt ON t.parent_taxon_fk = pt.taxon_id "
74
                    + " LEFT JOIN tax_taxon ppt ON pt.parent_taxon_fk = ppt.taxon_id"
75
                    + " LEFT OUTER JOIN tax_rank_en r ON r.element_id = t.tax_rank_fk "
76
                    + " LEFT OUTER JOIN tax_rank_en pr ON pr.element_id = pt.tax_rank_fk "
77
                    + " LEFT OUTER JOIN tax_rank_en ppr ON pr.element_id = ppt.tax_rank_fk "
78
                + " WHERE t.taxon_id IN (@IDSET)";
79
        result = result.replace("@IDSET", IPartitionedIO.ID_LIST_TOKEN);
80
        return result;
81
    }
82

    
83
    @Override
84
    protected void doInvoke(EdaphobaseImportState state) {
85
        super.doInvoke(state);
86
    }
87

    
88

    
89
    @Override
90
    public boolean doPartition(ResultSetPartitioner partitioner, EdaphobaseImportState state) {
91
        ResultSet rs = partitioner.getResultSet();
92
        Set<TaxonBase> taxaToSave = new HashSet<>();
93
        try {
94
            while (rs.next()){
95
                Integer id = nullSafeInt(rs, "taxon_id");
96
                Integer year = nullSafeInt(rs, "tax_year");
97
                boolean isBrackets = rs.getBoolean("tax_brackets");
98
                String remark = rs.getString("remark");
99
                String nameStr = rs.getString("name");
100
                String authorName = rs.getString("tax_author_name");
101
                //parentTaxonFk
102
                //rankFk
103
                //document
104
                boolean isValid = rs.getBoolean("valid");
105
                boolean idDeleted = rs.getBoolean("deleted");
106
                String displayString = rs.getString("display_string");
107
                Integer version = nullSafeInt(rs, "versionfield");
108
                String pages = rs.getString("pages");
109
                String treeIndex = rs.getString("path_to_root");
110
//                Integer rankFk = nullSafeInt(rs, "tax_rank_fk");
111
                String nameAddition = rs.getString("name_addition");
112
                String officialRemark = rs.getString("official_remark");
113
                boolean isGroup = rs.getBoolean("taxonomic_group");
114
                String rankStr = rs.getString("rankStr");
115
                String parentRankStr = rs.getString("parentRankStr");
116
                String grandParentRankStr = rs.getString("grandParentRankStr");
117
                String parentNameStr = rs.getString("parentName");
118
                String grandParentNameStr = rs.getString("grandParentName");
119

    
120

    
121
                TaxonBase<?> taxonBase;
122
                Reference<?> sec = null; //TODO
123

    
124
                //Name etc.
125
                Rank rank = makeRank(state, rankStr);
126
                ZoologicalName name = ZoologicalName.NewInstance(rank);
127
                setNamePart(nameStr, rank, name);
128
                Rank parentRank = makeRank(state, parentRankStr);
129
                setNamePart(parentNameStr, parentRank, name);
130
                Rank parentParentRank = makeRank(state, grandParentRankStr);
131
                setNamePart(grandParentNameStr, parentParentRank, name);
132

    
133
                //Authors
134
                if (StringUtils.isNotBlank(authorName)){
135
                    TeamOrPersonBase<?> author = state.getRelatedObject(AUTHOR_NAMESPACE, authorName, TeamOrPersonBase.class);
136
                    if (author == null){
137
                        logger.warn("Author not found in state: "  + authorName);
138
                    }else{
139
                        if (isBrackets){
140
                            name.setBasionymAuthorship(author);
141
                            name.setOriginalPublicationYear(year);
142
                        }else{
143
                            name.setCombinationAuthorship(author);
144
                            name.setPublicationYear(year);
145
                        }
146
                    }
147
                }
148

    
149

    
150
                if (isValid){
151
                    taxonBase = Taxon.NewInstance(name, sec);
152
                }else{
153
                    taxonBase = Synonym.NewInstance(name, sec);
154
                }
155
                taxaToSave.add(taxonBase);
156

    
157
                //remarks
158
                doNotes(taxonBase, remark);
159

    
160
                //id
161
                ImportHelper.setOriginalSource(taxonBase, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
162
                ImportHelper.setOriginalSource(name, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
163

    
164
            }
165
        } catch (SQLException e) {
166
            // TODO Auto-generated catch block
167
            e.printStackTrace();
168
        }
169

    
170
        getTaxonService().saveOrUpdate(taxaToSave);
171
        return true;
172
    }
173

    
174

    
175
    @Override
176
    public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
177
            EdaphobaseImportState state) {
178
        Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
179
        Map<String, TeamOrPersonBase<?>> authorMap = new HashMap<>();
180
        Set<String> authorSet = new HashSet<>();
181
        try {
182
            while (rs.next()){
183
                String authorStr = rs.getString("tax_author_name");
184
                authorSet.add(authorStr);
185
            }
186
        } catch (SQLException e) {
187
            e.printStackTrace();
188
        }
189

    
190
        //Authors
191
        Set<UUID> uuidSet = new HashSet<>();
192
        for (String authorStr : authorSet){
193
            UUID uuid = state.getAuthorUuid(authorStr);
194
            uuidSet.add(uuid);
195
        }
196
        List<TeamOrPersonBase<?>> authors = (List)getAgentService().find(uuidSet);
197
        Map<UUID, TeamOrPersonBase<?>> authorUuidMap = new HashMap<>();
198
        for (TeamOrPersonBase<?> author : authors){
199
            authorUuidMap.put(author.getUuid(), author);
200
        }
201

    
202
        for (String authorStr : authorSet){
203
            UUID uuid = state.getAuthorUuid(authorStr);
204
            TeamOrPersonBase<?> author = authorUuidMap.get(uuid);
205
            authorMap.put(authorStr, author);
206
        }
207
        result.put(AUTHOR_NAMESPACE, authorMap);
208

    
209
        return result;
210
    }
211

    
212
    private void setNamePart(String nameStr, Rank rank, ZoologicalName name) {
213
        if (rank != null){
214
            if (rank.isSupraGeneric() || rank.isGenus()){
215
                if (StringUtils.isBlank(name.getGenusOrUninomial())){
216
                    name.setGenusOrUninomial(nameStr);
217
                }
218
            }else if (rank.isInfraGeneric()){
219
                if (StringUtils.isBlank(name.getInfraGenericEpithet())){
220
                    name.setInfraGenericEpithet(nameStr);
221
                }
222
            }else if (rank.isSpeciesAggregate() || rank.isSpecies()){
223
                if (StringUtils.isBlank(name.getSpecificEpithet())){
224
                    name.setSpecificEpithet(nameStr);
225
                }
226
            }else if (rank.isInfraSpecific()){
227
                if (StringUtils.isBlank(name.getInfraSpecificEpithet())){
228
                    name.setInfraSpecificEpithet(nameStr);
229
                }
230
            }
231
        }
232
    }
233

    
234
    private Rank makeRank(EdaphobaseImportState state, String rankStr) {
235
        Rank rank = null;
236
        try {
237
            rank = state.getTransformer().getRankByKey(rankStr);
238
        } catch (UndefinedTransformerMethodException e) {
239
            e.printStackTrace();
240
        }
241
        return rank;
242
    }
243

    
244
    @Override
245
    protected boolean doCheck(EdaphobaseImportState state) {
246
        return false;
247
    }
248

    
249
    @Override
250
    protected boolean isIgnore(EdaphobaseImportState state) {
251
        return ! state.getConfig().isDoTaxa();
252
    }
253

    
254
}
(8-8/8)