Project

General

Profile

Download (15.3 KB) Statistics
| Branch: | Revision:
1
/**
2
* Copyright (C) 2015 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.edaphobase;
10

    
11
import java.sql.ResultSet;
12
import java.sql.SQLException;
13
import java.util.HashMap;
14
import java.util.HashSet;
15
import java.util.List;
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.codehaus.plexus.util.StringUtils;
22
import org.springframework.stereotype.Component;
23

    
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.TeamOrPersonBase;
29
import eu.etaxonomy.cdm.model.common.CdmBase;
30
import eu.etaxonomy.cdm.model.common.Language;
31
import eu.etaxonomy.cdm.model.common.Marker;
32
import eu.etaxonomy.cdm.model.common.MarkerType;
33
import eu.etaxonomy.cdm.model.common.Representation;
34
import eu.etaxonomy.cdm.model.name.IZoologicalName;
35
import eu.etaxonomy.cdm.model.name.Rank;
36
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
37
import eu.etaxonomy.cdm.model.reference.Reference;
38
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
39
import eu.etaxonomy.cdm.model.taxon.Synonym;
40
import eu.etaxonomy.cdm.model.taxon.Taxon;
41
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
42

    
43
/**
44
 * @author a.mueller
45
 * @date 18.12.2015
46
 *
47
 */
48
@Component
49
public class EdaphobaseTaxonImport extends EdaphobaseImportBase {
50
    private static final long serialVersionUID = -9138378836474086070L;
51
    private static final Logger logger = Logger.getLogger(EdaphobaseTaxonImport.class);
52

    
53
    private static final String tableName = "tax_taxon";
54

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

    
57
    private static final Object AUTHOR_NAMESPACE = "tax_author_name";
58

    
59
    /**
60
     * @param tableName
61
     * @param pluralString
62
     */
63
    public EdaphobaseTaxonImport() {
64
        super(tableName, pluralString);
65
    }
66

    
67
    @Override
68
    protected String getIdQuery(EdaphobaseImportState state) {
69
        return "SELECT DISTINCT taxon_id FROM tax_taxon t "
70
                + " ORDER BY taxon_id";
71
    }
72

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

    
88
    @Override
89
    protected void doInvoke(EdaphobaseImportState state) {
90
        super.doInvoke(state);
91
    }
92

    
93

    
94
    @Override
95
    public boolean doPartition(ResultSetPartitioner partitioner, EdaphobaseImportState state) {
96
        ResultSet rs = partitioner.getResultSet();
97
        Set<TaxonBase> taxaToSave = new HashSet<>();
98
        try {
99
            while (rs.next()){
100
                makeSingleTaxon(state, rs, taxaToSave);
101
            }
102
        } catch (SQLException | UndefinedTransformerMethodException e) {
103
             e.printStackTrace();
104
        }
105

    
106
        getTaxonService().saveOrUpdate(taxaToSave);
107
        return true;
108
    }
109

    
110
    /**
111
     * @param state
112
     * @param rs
113
     * @param taxaToSave
114
     * @throws SQLException
115
     * @throws UndefinedTransformerMethodException
116
     */
117
    private void makeSingleTaxon(EdaphobaseImportState state, ResultSet rs, Set<TaxonBase> taxaToSave)
118
            throws SQLException, UndefinedTransformerMethodException {
119
        Integer id = nullSafeInt(rs, "taxon_id");
120
        Integer year = nullSafeInt(rs, "tax_year");
121
        boolean isBrackets = rs.getBoolean("tax_brackets");
122
        String remark = rs.getString("remark");
123
        String nameStr = rs.getString("name");
124
        String authorName = rs.getString("tax_author_name");
125
        //parentTaxonFk
126
        //rankFk
127
        Integer nomRefId = nullSafeInt(rs, "tax_document");
128
        boolean isValid = rs.getBoolean("valid");
129
        boolean idDeleted = rs.getBoolean("deleted");
130
        String displayString = rs.getString("display_string");
131
        Integer version = nullSafeInt(rs, "versionfield");
132
        String pages = rs.getString("pages");
133
        String treeIndex = rs.getString("path_to_root");
134
//      Integer rankFk = nullSafeInt(rs, "tax_rank_fk");
135
        String nameAddition = rs.getString("name_addition");
136
        String officialRemark = rs.getString("official_remark");
137
        boolean isGroup = rs.getBoolean("taxonomic_group");
138
        String rankStr = rs.getString("rankStr");
139
        String parentRankStr = rs.getString("parentRankStr");
140
        String grandParentRankStr = rs.getString("grandParentRankStr");
141
        String parentNameStr = rs.getString("parentName");
142
        String grandParentNameStr = rs.getString("grandParentName");
143

    
144
        TaxonBase<?> taxonBase;
145

    
146
        rankStr= extractEnglish(rankStr);
147
        parentRankStr= extractEnglish(parentRankStr);
148
        grandParentRankStr= extractEnglish(grandParentRankStr);
149

    
150
        //Name etc.
151
        Rank rank = makeRank(state, rankStr);
152
        checkRankMarker(state, rank);
153
        IZoologicalName name = TaxonNameFactory.NewZoologicalInstance(rank);
154
        setNamePart(nameStr, rank, name);
155
        Rank parentRank = makeRank(state, parentRankStr);
156
        setNamePart(parentNameStr, parentRank, name);
157
        Rank parentParentRank = makeRank(state, grandParentRankStr);
158
        setNamePart(grandParentNameStr, parentParentRank, name);
159
        if (parentParentRank != null && parentParentRank.isLower(Rank.GENUS()) || isBlank(name.getGenusOrUninomial()) ){
160
            logger.warn("Grandparent rank is lower than genus for " + name.getTitleCache() + " (edapho-id: " + id + "; cdm-id: " + name.getId());
161
        }
162

    
163
        //Authors
164
        if (StringUtils.isNotBlank(authorName)){
165
            TeamOrPersonBase<?> author = state.getRelatedObject(AUTHOR_NAMESPACE, authorName, TeamOrPersonBase.class);
166
            if (author == null){
167
                logger.warn("Author not found in state: "  + authorName);
168
            }else{
169
                if (isBrackets){
170
                    name.setBasionymAuthorship(author);
171
                    name.setOriginalPublicationYear(year);
172
                }else{
173
                    name.setCombinationAuthorship(author);
174
                    name.setPublicationYear(year);
175
                }
176
            }
177
        }
178

    
179
        //nomRef
180
        if (nomRefId != null){
181
            Reference nomRef = state.getRelatedObject(REFERENCE_NAMESPACE, String.valueOf(nomRefId), Reference.class);
182
            if (nomRef == null){
183
                logger.warn("Reference " + nomRefId + " could not be found");
184
            }
185
            name.setNomenclaturalReference(nomRef);
186
        }
187
        name.setNomenclaturalMicroReference(StringUtils.isBlank(pages)? null : pages);
188

    
189
        //taxon
190
        Reference secRef = state.getRelatedObject(REFERENCE_NAMESPACE, state.getConfig().getSecUuid().toString(), Reference.class);
191
        if (secRef == null){
192
            secRef = makeSecRef(state);
193
        }
194
        if (isValid){
195
            taxonBase = Taxon.NewInstance(name, secRef);
196
        }else{
197
            taxonBase = Synonym.NewInstance(name, secRef);
198
        }
199
        handleTaxonomicGroupMarker(state, taxonBase, isGroup);
200
        taxaToSave.add(taxonBase);
201

    
202
        //remarks
203
        doNotes(taxonBase, remark);
204

    
205
        //id
206
        ImportHelper.setOriginalSource(taxonBase, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
207
        ImportHelper.setOriginalSource(name, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
208
        handleExampleIdentifiers(taxonBase, id);
209
    }
210

    
211

    
212
    /**
213
     * @param rankStr
214
     * @return
215
     */
216
    private String extractEnglish(String rankStr) {
217
        if (rankStr == null){
218
            return null;
219
        }
220
        String[] splits = rankStr.split(", ");
221
        if (splits.length != 3){
222
            String message = "Wrong rank format: "+  rankStr;
223
            logger.error(message);
224
            return null;
225
        }
226
        return splits[1].trim();
227
    }
228

    
229

    
230
    static Map<Integer,UUID> idMap = new HashMap<>();
231
    static{
232
        idMap.put(86594, UUID.fromString("715c2370-45a4-450c-99f7-e196758979ca"));  //Aporrectodea caliginosa
233
        idMap.put(86593, UUID.fromString("230f1a69-5dcd-4829-a01c-17490a2fdf34"));  //Aporrectodea
234
        idMap.put(86684, UUID.fromString("0982dc0e-1a79-45a0-8abc-8166625b94b8"));  //Achaeta
235
        idMap.put(104328, UUID.fromString("15f0b5f8-44e4-4ae1-8b40-f36f0a049b27")); //Chamaedrilus
236
        idMap.put(97537, UUID.fromString("899c62e3-a116-4c5b-b22a-c76e761cc32e"));  //Araeolaimoides caecus
237
    }
238

    
239
    /**
240
     * @param taxonBase
241
     * @param id
242
     */
243
    private void handleExampleIdentifiers(TaxonBase<?> taxonBase, Integer id) {
244
        if (idMap.get(id) != null){
245
            taxonBase.setUuid(idMap.get(id));
246
        }
247
    }
248

    
249
    /**
250
     * @param state
251
     * @param rank
252
     * @throws UndefinedTransformerMethodException
253
     */
254
    private void checkRankMarker(EdaphobaseImportState state, Rank rank) throws UndefinedTransformerMethodException {
255

    
256
        if (rank != null){
257
            Set<Marker> markers = rank.getMarkers();
258
            if ( markers.size() == 0){  //we assume that no markers exist. at least not for markers of unused ranks
259
                UUID edaphoRankMarkerTypeUuid = state.getTransformer().getMarkerTypeUuid("EdaphoRankMarker");
260
                MarkerType marker = getMarkerType(state, edaphoRankMarkerTypeUuid, "Edaphobase rank", "Rank used in Edaphobase", "EdaRk" );
261
                Representation rep = Representation.NewInstance("Rang, verwendet in Edaphobase", "Edaphobase Rang", "EdaRg", Language.GERMAN());
262
                marker.addRepresentation(rep);
263
                rank.addMarker(Marker.NewInstance(marker, true));
264
                getTermService().saveOrUpdate(rank);
265
            }
266
        }else{
267
            logger.warn("Rank is null and marker can not be set");
268
        }
269
    }
270

    
271
    /**
272
     * @param state
273
     * @param isGroup
274
     * @param taxonBase
275
     */
276
    private void handleTaxonomicGroupMarker(EdaphobaseImportState state, TaxonBase<?> taxonBase, boolean isGroup) {
277
        if (! isGroup){
278
            return;
279
        }else{
280
            try {
281
                MarkerType markerType = getMarkerType(state, state.getTransformer().getMarkerTypeUuid("TaxGrossgruppe"), "Tax. Gruppe", "Taxonomische Grossgruppe", "TGG", null, Language.GERMAN());
282
                if (taxonBase.isInstanceOf(Synonym.class)){
283
                    logger.warn("Syonym is marked as 'taxonomische Grossgruppe'");
284
                }
285
                taxonBase.addMarker(Marker.NewInstance(markerType, true));
286
            } catch (UndefinedTransformerMethodException e) {
287
            }
288
        }
289
    }
290

    
291
    /**
292
     * @param state
293
     * @return
294
     */
295
    private Reference makeSecRef(EdaphobaseImportState state) {
296
        Reference ref = ReferenceFactory.newDatabase();
297
        ref.setTitle(state.getConfig().getEdaphobaseSecundumTitle());
298
        ref.setUuid(state.getConfig().getSecUuid());
299
        state.addRelatedObject(REFERENCE_NAMESPACE, ref.getUuid().toString(), ref);
300
        getReferenceService().save(ref);
301
        return ref;
302
    }
303

    
304
    @Override
305
    public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
306
            EdaphobaseImportState state) {
307
        Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
308
        Map<String, TeamOrPersonBase<?>> authorMap = new HashMap<>();
309
        Set<String> authorSet = new HashSet<>();
310
        Set<String> referenceIdSet = new HashSet<>();
311

    
312
        try {
313
            while (rs.next()){
314
                String authorStr = rs.getString("tax_author_name");
315
                authorSet.add(authorStr);
316
                handleForeignKey(rs, referenceIdSet, "tax_document");
317
            }
318
        } catch (SQLException e) {
319
            e.printStackTrace();
320
        }
321

    
322
        //Authors
323
        Set<UUID> uuidSet = new HashSet<>();
324
        for (String authorStr : authorSet){
325
            UUID uuid = state.getAuthorUuid(authorStr);
326
            uuidSet.add(uuid);
327
        }
328
        List<TeamOrPersonBase<?>> authors = (List)getAgentService().find(uuidSet);
329
        Map<UUID, TeamOrPersonBase<?>> authorUuidMap = new HashMap<>();
330
        for (TeamOrPersonBase<?> author : authors){
331
            authorUuidMap.put(author.getUuid(), author);
332
        }
333

    
334
        for (String authorStr : authorSet){
335
            UUID uuid = state.getAuthorUuid(authorStr);
336
            TeamOrPersonBase<?> author = authorUuidMap.get(uuid);
337
            authorMap.put(authorStr, author);
338
        }
339
        result.put(AUTHOR_NAMESPACE, authorMap);
340

    
341
        //reference map
342
        String nameSpace = REFERENCE_NAMESPACE;
343
        Class<?> cdmClass = Reference.class;
344
        Set<String> idSet = referenceIdSet;
345
        Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
346
        result.put(nameSpace, referenceMap);
347

    
348
        //secundum
349
        UUID secUuid = state.getConfig().getSecUuid();
350
        Reference secRef = getReferenceService().find(secUuid);
351
        referenceMap.put(secUuid.toString(), secRef);
352

    
353
        return result;
354
    }
355

    
356
    private void setNamePart(String nameStr, Rank rank, IZoologicalName name) {
357
        if (rank != null){
358
            if (rank.isSupraGeneric() || rank.isGenus()){
359
                if (StringUtils.isBlank(name.getGenusOrUninomial())){
360
                    name.setGenusOrUninomial(nameStr);
361
                }
362
            }else if (rank.isInfraGenericButNotSpeciesGroup()){
363
                if (StringUtils.isBlank(name.getInfraGenericEpithet())){
364
                    name.setInfraGenericEpithet(nameStr);
365
                }
366
            }else if (rank.isSpeciesAggregate() || rank.isSpecies()){
367
                if (StringUtils.isBlank(name.getSpecificEpithet())){
368
                    name.setSpecificEpithet(nameStr);
369
                }
370
            }else if (rank.isInfraSpecific()){
371
                if (StringUtils.isBlank(name.getInfraSpecificEpithet())){
372
                    name.setInfraSpecificEpithet(nameStr);
373
                }
374
            }
375
        }
376
    }
377

    
378
    private Rank makeRank(EdaphobaseImportState state, String rankStr) {
379
        Rank rank = null;
380
        try {
381
            rank = state.getTransformer().getRankByKey(rankStr);
382
        } catch (UndefinedTransformerMethodException e) {
383
            e.printStackTrace();
384
        }
385
        return rank;
386
    }
387

    
388
    @Override
389
    protected boolean doCheck(EdaphobaseImportState state) {
390
        return true;
391
    }
392

    
393
    @Override
394
    protected boolean isIgnore(EdaphobaseImportState state) {
395
        return ! state.getConfig().isDoTaxa();
396
    }
397

    
398
}
(12-12/12)