Project

General

Profile

Download (26.4 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.Person;
29
import eu.etaxonomy.cdm.model.agent.Team;
30
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
31
import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
32
import eu.etaxonomy.cdm.model.common.Annotation;
33
import eu.etaxonomy.cdm.model.common.AnnotationType;
34
import eu.etaxonomy.cdm.model.common.CdmBase;
35
import eu.etaxonomy.cdm.model.common.Language;
36
import eu.etaxonomy.cdm.model.common.Marker;
37
import eu.etaxonomy.cdm.model.common.MarkerType;
38
import eu.etaxonomy.cdm.model.name.IZoologicalName;
39
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
40
import eu.etaxonomy.cdm.model.name.Rank;
41
import eu.etaxonomy.cdm.model.name.RankClass;
42
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
43
import eu.etaxonomy.cdm.model.reference.Reference;
44
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
45
import eu.etaxonomy.cdm.model.taxon.Synonym;
46
import eu.etaxonomy.cdm.model.taxon.Taxon;
47
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
48
import eu.etaxonomy.cdm.model.term.OrderedTermVocabulary;
49
import eu.etaxonomy.cdm.model.term.Representation;
50
import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImplRegExBase;
51

    
52
/**
53
 * @author a.mueller
54
 * @since 18.12.2015
55
 *
56
 */
57
@Component
58
public class EdaphobaseTaxonImport extends EdaphobaseImportBase {
59
    private static final long serialVersionUID = -9138378836474086070L;
60
    private static final Logger logger = Logger.getLogger(EdaphobaseTaxonImport.class);
61

    
62
    private static final String tableName = "tax_taxon";
63

    
64
    private static final String pluralString = "taxa";
65

    
66
    private static final Object AUTHOR_NAMESPACE = "tax_author_name";
67

    
68
    /**
69
     * @param tableName
70
     * @param pluralString
71
     */
72
    public EdaphobaseTaxonImport() {
73
        super(tableName, pluralString);
74
    }
75

    
76
    @Override
77
    protected String getIdQuery(EdaphobaseImportState state) {
78
        return "SELECT DISTINCT taxon_id FROM tax_taxon t "
79
                + " ORDER BY taxon_id";
80
    }
81

    
82
    @Override
83
    protected String getRecordQuery(EdaphobaseImportConfigurator config) {
84
        String result = " SELECT DISTINCT t.*, r.value_summary as rankStr, pr.value_summary as parentRankStr, ppr.value_summary as grandParentRankStr, pppr.value_summary as grandGrandParentRankStr, "
85
                    + " pt.name as parentName, ppt.name as grandParentName, pppt.name as grandGrandParentName "
86
                + " FROM tax_taxon t "
87
                    + " LEFT JOIN tax_taxon pt ON t.parent_taxon_fk = pt.taxon_id "
88
                    + " LEFT JOIN tax_taxon ppt ON pt.parent_taxon_fk = ppt.taxon_id "
89
                    + " LEFT JOIN tax_taxon pppt ON ppt.parent_taxon_fk = pppt.taxon_id "
90
                    + " LEFT OUTER JOIN selective_list.element r ON r.element_id = t.tax_rank_fk "
91
                    + " LEFT OUTER JOIN selective_list.element pr ON pr.element_id = pt.tax_rank_fk "
92
                    + " LEFT OUTER JOIN selective_list.element ppr ON ppr.element_id = ppt.tax_rank_fk "
93
                    + " LEFT OUTER JOIN selective_list.element pppr ON pppr.element_id = pppt.tax_rank_fk "
94
                + " WHERE t.taxon_id IN (@IDSET)";
95
        result = result.replace("@IDSET", IPartitionedIO.ID_LIST_TOKEN);
96
        return result;
97
    }
98

    
99
    @Override
100
    protected void doInvoke(EdaphobaseImportState state) {
101
        makeIncludedInList(state);
102
        super.doInvoke(state);
103
    }
104

    
105
    private Set<Integer> includedInTaxa = new HashSet<>();
106

    
107
    /**
108
     * @param state
109
     */
110
    private void makeIncludedInList(EdaphobaseImportState state) {
111
        String sql = "SELECT sr.a_taxon_fk_taxon_id "
112
                + " FROM tax_synonym sr "
113
                + " WHERE sr.synonym_role <> 11614 ";
114
        ResultSet rs = state.getConfig().getSource().getResultSet(sql);
115
        try {
116
            while (rs.next()){
117
                Integer synId = rs.getInt("a_taxon_fk_taxon_id");
118
                includedInTaxa.add(synId);
119
            }
120
        } catch (SQLException e) {
121
            // TODO Auto-generated catch block
122
            e.printStackTrace();
123
        }
124
    }
125

    
126
    @Override
127
    public boolean doPartition(@SuppressWarnings("rawtypes") ResultSetPartitioner partitioner, EdaphobaseImportState state) {
128
        ResultSet rs = partitioner.getResultSet();
129
        @SuppressWarnings("rawtypes")
130
        Set<TaxonBase> taxaToSave = new HashSet<>();
131
        try {
132
            while (rs.next()){
133
                makeSingleTaxon(state, rs, taxaToSave);
134
            }
135
        } catch (SQLException | UndefinedTransformerMethodException e) {
136
             e.printStackTrace();
137
        }
138

    
139
        getTaxonService().saveOrUpdate(taxaToSave);
140
        return true;
141
    }
142

    
143
    /**
144
     * @param state
145
     * @param rs
146
     * @param taxaToSave
147
     * @throws SQLException
148
     * @throws UndefinedTransformerMethodException
149
     */
150
    private void makeSingleTaxon(EdaphobaseImportState state, ResultSet rs, Set<TaxonBase> taxaToSave)
151
            throws SQLException, UndefinedTransformerMethodException {
152
        Integer id = nullSafeInt(rs, "taxon_id");
153
        Integer year = nullSafeInt(rs, "tax_year");
154
        boolean isBrackets = rs.getBoolean("tax_brackets");
155
        String remark = rs.getString("remark");
156
        String nameStr = rs.getString("name");
157
        String authorName = rs.getString("tax_author_name");
158
        //parentTaxonFk
159
        //rankFk
160
        Integer nomRefId = nullSafeInt(rs, "tax_document");
161
        boolean isValid = rs.getBoolean("valid");
162
        boolean isDeleted = rs.getBoolean("deleted");
163
        String displayString = rs.getString("display_string");
164
        Integer version = nullSafeInt(rs, "versionfield");
165
        String pages = rs.getString("pages");
166
        String treeIndex = rs.getString("path_to_root");
167
//      Integer rankFk = nullSafeInt(rs, "tax_rank_fk");
168
        String nameAddition = rs.getString("name_addition");
169
        String officialRemark = rs.getString("official_remark");
170
        boolean isGroup = rs.getBoolean("taxonomic_group");
171
        String rankStr = rs.getString("rankStr");
172
        String parentRankStr = rs.getString("parentRankStr");
173
        String grandParentRankStr = rs.getString("grandParentRankStr");
174
        String grandGrandParentRankStr = rs.getString("grandGrandParentRankStr");
175
        String parentNameStr = rs.getString("parentName");
176
        String grandParentNameStr = rs.getString("grandParentName");
177
        String grandGrandParentNameStr = rs.getString("grandGrandParentName");
178
        String editUuid = rs.getString("edit_uuid");
179

    
180

    
181
        if (isDeleted){
182
            logger.warn("Deleted not handled according to mail Stephan 2018-03-07. ID: " + id );
183
            return;
184
        }
185
        boolean nameAdditionUsed =  isBlank(nameAddition);
186
        if (!nameAdditionUsed){
187
            nameAddition = nameAddition.trim();
188
        }
189

    
190
        isValid = checkValid(state, id, isValid);
191

    
192
        //for debug only
193
        if (id.equals(979370000) ){
194
            logger.debug("now");
195
        }
196

    
197
        TaxonBase<?> taxonBase;
198

    
199
        rankStr= extractEnglish(rankStr);
200
        parentRankStr= extractEnglish(parentRankStr);
201
        grandParentRankStr= extractEnglish(grandParentRankStr);
202
        grandGrandParentRankStr= extractEnglish(grandGrandParentRankStr);
203

    
204
        //Name etc.
205
        Rank rank = makeRank(state, rankStr);
206
        checkRankMarker(state, rank);
207
        IZoologicalName name = TaxonNameFactory.NewZoologicalInstance(rank);
208
        if (rank == null){
209
            name.setNameCache(nameStr, true);
210
        }else{
211
            setNamePart(nameStr, rank, name);
212
            Rank parentRank = makeRank(state, parentRankStr);
213
            setNamePart(parentNameStr, parentRank, name);
214
            Rank parentParentRank = makeRank(state, grandParentRankStr);
215
            setNamePart(grandParentNameStr, parentParentRank, name);
216
            Rank grandParentParentRank = makeRank(state, grandGrandParentRankStr);
217
            setNamePart(grandGrandParentNameStr, grandParentParentRank, name);
218
            if (grandParentParentRank != null && grandParentParentRank.isLower(Rank.GENUS()) || isBlank(name.getGenusOrUninomial()) && !name.isProtectedNameCache()){
219
                logger.warn("Grand-Grandparent rank is lower than genus for " +
220
                        name.getTitleCache() + " (edapho-id: " + id + "; cdm-id: " + name.getId() + ")");
221
            }
222
        }
223

    
224
        //Authors
225
        if (isNotBlank(authorName)){
226
            authorName = authorName.replace(" et ", " & ");
227
            TeamOrPersonBase<?> author = state.getRelatedObject(AUTHOR_NAMESPACE, authorName, TeamOrPersonBase.class);
228
            if (author == null){
229
                logger.warn("Author not found in state: "  + authorName);
230
            }else{
231
                if (isBrackets){
232
                    name.setBasionymAuthorship(author);
233
                    name.setOriginalPublicationYear(year);
234
                }else{
235
                    name.setCombinationAuthorship(author);
236
                    name.setPublicationYear(year);
237
                }
238
            }
239
        }
240

    
241
        String capitalWord = NonViralNameParserImplRegExBase.capitalWord;
242
        String autNam = "(" + capitalWord + "( in "+capitalWord+")?|Schuurmans Stekhoven|Winiszewska-Ślipińska|Fürst von Lieven|de Coninck|de Man|de Ley|de Grisse|"
243
                + "van der Linde|Pschorn-Walcher|van der Berg|J. Goddey)";
244
        if (isNotBlank(nameAddition) && nameAddition.matches("(\\[|\\()?nomen.*")){
245
            if ("(nomen oblitum)".equals(nameAddition) ){
246
                name.addStatus(NomenclaturalStatusType.ZOO_OBLITUM(), null, null);
247
            }else if ("nomen dubium".equals(nameAddition) || "[nomen dubium]".equals(nameAddition)){
248
                name.addStatus(NomenclaturalStatusType.DOUBTFUL(), null, null);
249
            }else if ("nomen nudum".equals(nameAddition)){
250
                name.addStatus(NomenclaturalStatusType.NUDUM(), null, null);
251
            }else if (nameAddition.matches("nomen nudum \\["+autNam+"\\, 19\\d{2}]")){
252
                name.addStatus(NomenclaturalStatusType.NUDUM(), null, null);
253
                Person nomNudAuthor = parseNomenNudumAuthor(state, name, nameAddition);
254
                if (name.getCombinationAuthorship()!= null || name.getBasionymAuthorship() != null){
255
                    logger.warn("Author already exists for nomen nudum name with author. ID: " + id);
256
                }
257
                name.setCombinationAuthorship(nomNudAuthor);
258
            }else{
259
                logger.warn("'nomen xxx' name addition not recognized: " + nameAddition + ". ID: " + id);
260
            }
261
            nameAdditionUsed = true;
262
        }
263
        if (isNotBlank(nameAddition) && nameAddition.matches(autNam + "((, "+autNam+")? & " + autNam + ")?" +    ", \\d{4}")){
264
            nameAddition = nameAddition.replace(" et ", " & ");
265
            int pos = nameAddition.length()-6;
266
            String authorStr = nameAddition.substring(0, pos);
267
            Integer naYear = Integer.valueOf(nameAddition.substring(pos +  2));
268
            if (name.getPublicationYear() != null){
269
                logger.warn("Publication year already exists. ID=" +  id);
270
            }
271
            name.setPublicationYear(naYear);
272
            TeamOrPersonBase<?> author = getNameAdditionAuthor(authorStr);
273
            if (name.getCombinationAuthorship() != null){
274
                logger.warn("Combination author already exists. ID=" +  id);
275
            }
276
            name.setCombinationAuthorship(author);
277
            nameAdditionUsed = true;
278
        }
279
        if (isNotBlank(nameAddition) && nameAddition.matches("(nec|non) " + capitalWord +  ", \\d{4}")){
280
            String str = nameAddition.substring(4);
281
            String[] split = str.split(",");
282
            IZoologicalName homonym = (IZoologicalName)name.clone();
283
            homonym.setCombinationAuthorship(null);
284
            homonym.setBasionymAuthorship(null);
285
            homonym.setPublicationYear(null);
286
            homonym.setOriginalPublicationYear(null);
287
            TeamOrPersonBase<?> author = getNameAdditionAuthor(split[0]);
288
            homonym.setCombinationAuthorship(author);
289
            homonym.setPublicationYear(Integer.valueOf(split[1].trim()));
290
            nameAdditionUsed = true;
291
        }
292

    
293
        //nomRef
294
        if (nomRefId != null){
295
            Reference nomRef = state.getRelatedObject(REFERENCE_NAMESPACE, String.valueOf(nomRefId), Reference.class);
296
            if (nomRef == null){
297
                logger.warn("Reference " + nomRefId + " could not be found");
298
            }
299
            name.setNomenclaturalReference(nomRef);
300
        }
301
        name.setNomenclaturalMicroReference(isBlank(pages)? null : pages);
302

    
303
        //taxon
304
        Reference secRef = state.getRelatedObject(REFERENCE_NAMESPACE, state.getConfig().getSecUuid().toString(), Reference.class);
305
        if (secRef == null){
306
            secRef = makeSecRef(state);
307
        }
308
        if (isValid){
309
            taxonBase = Taxon.NewInstance(name, secRef);
310
        }else{
311
            taxonBase = Synonym.NewInstance(name, secRef);
312
        }
313
        handleTaxonomicGroupMarker(state, taxonBase, isGroup);
314
        taxaToSave.add(taxonBase);
315

    
316
        //sensu, auct.
317
        if (isNotBlank(nameAddition) && (nameAddition.startsWith("sensu ") || "auct.".equals(nameAddition))){
318
            nameAddition = nameAddition.replace(" et ", " & ");
319
            taxonBase.setSec(null);
320
            taxonBase.setAppendedPhrase(nameAddition);
321
            //TODO
322
            nameAdditionUsed = true;
323
        }
324

    
325
        //remarks
326
        doNotes(taxonBase, remark, AnnotationType.TECHNICAL());
327
        doNotes(taxonBase, officialRemark, AnnotationType.EDITORIAL());
328

    
329
        //id
330
        ImportHelper.setOriginalSource(taxonBase, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
331
        ImportHelper.setOriginalSource(name, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
332
        taxonBase.setUuid(UUID.fromString(editUuid));
333
        handleExampleIdentifiers(taxonBase, id);
334

    
335
        if (!nameAdditionUsed){
336
            logger.warn("name_addition not recognized: " +  nameAddition + ". ID="+id);
337
            name.setAppendedPhrase(nameAddition);
338
        }
339

    
340
        if (titleCacheDiffers(state, displayString, name, taxonBase)){
341
            String titleCache = taxonBase.getAppendedPhrase() != null ? taxonBase.getTitleCache() : name.getTitleCache();
342
            logger.warn("Displaystring differs from titleCache. ID=" + id + ".\n   " + displayString + "\n   " + titleCache);
343
        }
344
    }
345

    
346

    
347
    /**
348
     * @param state
349
     * @param displayString
350
     * @param name
351
     * @param taxonBase
352
     * @return
353
     */
354
    private boolean titleCacheDiffers(EdaphobaseImportState state, String displayString, IZoologicalName name, TaxonBase<?> taxonBase) {
355
        String orig = displayString.replace("nomen nudum [Hirschmann, 1951]", "Hirschmann, 1951")
356
                .replace("  ", " ");
357
        String nameTitleCache = name.getTitleCache().replace("species group", "group");
358
        String taxonTitleCache = taxonBase.getTitleCache().replace("species group", "group");
359

    
360
//        if (state.getConfig().isIgnore4nomial() && orig.matches(".* subsp"))
361
        boolean result =
362
                !orig.equals(nameTitleCache)
363
                && !orig.equals(name.getFullTitleCache())
364
                && !orig.equals(taxonTitleCache);
365
        return result;
366
    }
367

    
368
    /**
369
     * @param authorStr
370
     * @return
371
     */
372
    private TeamOrPersonBase<?> getNameAdditionAuthor(String authorStr) {
373
        TeamOrPersonBase<?> result;
374
        String[] splits = authorStr.split("(, | & )");
375
        if (splits.length == 1){
376
            Person person = Person.NewInstance();
377
            person.setNomenclaturalTitle(splits[0]);
378
            result = person;
379
        }else{
380
            Team team = Team.NewInstance();
381
            for (String split: splits){
382
                Person person = Person.NewInstance();
383
                person.setNomenclaturalTitle(split);
384
                team.addTeamMember(person);
385
            }
386
            result = team;
387
        }
388
        //TODO deduplicate
389
        return result;
390
    }
391

    
392
    /**
393
     * @param state
394
     * @param nameAddition
395
     * @return
396
     */
397
    private Person parseNomenNudumAuthor(EdaphobaseImportState state, IZoologicalName name, String nameAddition) {
398
        nameAddition = nameAddition.replace("nomen nudum [", "").replace("tz, 195]", "tz, 1952]")
399
                .replace("]", "");
400
        String[] split = nameAddition.split(", ");
401
        Integer year = Integer.valueOf(split[1]);
402
        name.setPublicationYear(year);
403
        //TODO deduplicate
404
        Person author = Person.NewInstance();
405
        author.setNomenclaturalTitle(split[0].trim());
406
        return author;
407
    }
408

    
409
    /**
410
     * @param state
411
     * @param id
412
     * @param isValid
413
     * @return
414
     */
415
    private boolean checkValid(EdaphobaseImportState state, Integer id, boolean isValid) {
416
        if (isValid){
417
            return isValid;
418
        }else if (includedInTaxa.contains(id)){
419
            return true;
420
        }else{
421
            return isValid;
422
        }
423
    }
424

    
425
    /**
426
     * @param rankStr
427
     * @return
428
     */
429
    private String extractEnglish(String rankStr) {
430
        if (rankStr == null){
431
            return null;
432
        }
433
        String[] splits = rankStr.split(", ");
434
        if (splits.length != 3){
435
            String message = "Wrong rank format: "+  rankStr;
436
            logger.error(message);
437
            return null;
438
        }
439
        return splits[1].trim();
440
    }
441

    
442

    
443
    static Map<Integer,UUID> idMap = new HashMap<>();
444
    static{
445
        logger.warn("Loading example UUIDs. Switch off once examples are adapted!");
446
        idMap.put(86594, UUID.fromString("715c2370-45a4-450c-99f7-e196758979ca"));  //Aporrectodea caliginosa
447
        idMap.put(86593, UUID.fromString("230f1a69-5dcd-4829-a01c-17490a2fdf34"));  //Aporrectodea
448
        idMap.put(86684, UUID.fromString("0982dc0e-1a79-45a0-8abc-8166625b94b8"));  //Achaeta
449
        idMap.put(104328, UUID.fromString("15f0b5f8-44e4-4ae1-8b40-f36f0a049b27")); //Chamaedrilus
450
        idMap.put(97537, UUID.fromString("899c62e3-a116-4c5b-b22a-c76e761cc32e"));  //Araeolaimoides caecus
451
    }
452

    
453
    /**
454
     * @param taxonBase
455
     * @param id
456
     */
457
    private void handleExampleIdentifiers(TaxonBase<?> taxonBase, Integer id) {
458
        if (idMap.get(id) != null){
459
            taxonBase.setUuid(idMap.get(id));
460
            logger.warn("Override UUID for specific taxa. ID="+ id +  "; uuid="+idMap.get(id) + "; name="+ taxonBase.getName().getTitleCache());
461
        }
462
    }
463

    
464
    /**
465
     * @param state
466
     * @param rank
467
     * @throws UndefinedTransformerMethodException
468
     */
469
    private void checkRankMarker(EdaphobaseImportState state, Rank rank) throws UndefinedTransformerMethodException {
470

    
471
        if (rank != null){
472
            Set<Marker> markers = rank.getMarkers();
473
            if ( markers.size() == 0){  //we assume that no markers exist, at least not for markers of unused ranks
474
                UUID edaphoRankMarkerTypeUuid = state.getTransformer().getMarkerTypeUuid("EdaphoRankMarker");
475
                MarkerType marker = getMarkerType(state, edaphoRankMarkerTypeUuid, "Edaphobase rank", "Rank used in Edaphobase", "EdaRk" );
476
                Representation rep = Representation.NewInstance("Rang, verwendet in Edaphobase", "Edaphobase Rang", "EdaRg", Language.GERMAN());
477
                marker.addRepresentation(rep);
478
                rank.addMarker(Marker.NewInstance(marker, true));
479
                getTermService().saveOrUpdate(rank);
480
            }
481
        }else{
482
            logger.info("Rank is null and marker can not be set");
483
        }
484
    }
485

    
486
    /**
487
     * @param state
488
     * @param isGroup
489
     * @param taxonBase
490
     */
491
    private void handleTaxonomicGroupMarker(EdaphobaseImportState state, TaxonBase<?> taxonBase, boolean isGroup) {
492
        if (! isGroup){
493
            return;
494
        }else{
495
            try {
496
                MarkerType markerType = getMarkerType(state, state.getTransformer().getMarkerTypeUuid("TaxGrossgruppe"), "Tax. Gruppe", "Taxonomische Grossgruppe", "TGG", null, Language.GERMAN());
497
                if (taxonBase.isInstanceOf(Synonym.class)){
498
                    logger.warn("Syonym is marked as 'taxonomische Grossgruppe'");
499
                }
500
                taxonBase.addMarker(Marker.NewInstance(markerType, true));
501
            } catch (UndefinedTransformerMethodException e) {
502
            }
503
        }
504
    }
505

    
506
    /**
507
     * @param state
508
     * @return
509
     */
510
    private Reference makeSecRef(EdaphobaseImportState state) {
511
        Reference ref = ReferenceFactory.newDatabase();
512
        ref.setTitle(state.getConfig().getEdaphobaseSecundumTitle());
513
        ref.setUuid(state.getConfig().getSecUuid());
514
        state.addRelatedObject(REFERENCE_NAMESPACE, ref.getUuid().toString(), ref);
515
        getReferenceService().save(ref);
516
        return ref;
517
    }
518

    
519
    @Override
520
    public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
521
            EdaphobaseImportState state) {
522

    
523
        Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
524
        Map<String, TeamOrPersonBase<?>> authorMap = new HashMap<>();
525
        Set<String> authorSet = new HashSet<>();
526
        Set<String> referenceIdSet = new HashSet<>();
527

    
528
        try {
529
            while (rs.next()){
530
                String authorStr = rs.getString("tax_author_name");
531
                if (authorStr != null){
532
                    authorStr = authorStr.replace(" et ", " & ");
533
                    authorSet.add(authorStr);
534
                }
535
                handleForeignKey(rs, referenceIdSet, "tax_document");
536
            }
537
        } catch (SQLException e) {
538
            e.printStackTrace();
539
        }
540

    
541
        //Authors
542
        Set<UUID> uuidSet = new HashSet<>();
543
        for (String authorStr : authorSet){
544
            UUID uuid = state.getAuthorUuid(authorStr);
545
            uuidSet.add(uuid);
546
        }
547
        @SuppressWarnings("unchecked")
548
        List<TeamOrPersonBase<?>> authors = (List)getAgentService().find(uuidSet);
549
        Map<UUID, TeamOrPersonBase<?>> authorUuidMap = new HashMap<>();
550
        for (TeamOrPersonBase<?> author : authors){
551
            authorUuidMap.put(author.getUuid(), author);
552
        }
553

    
554
        for (String authorStr : authorSet){
555
            UUID uuid = state.getAuthorUuid(authorStr);
556
            TeamOrPersonBase<?> author = authorUuidMap.get(uuid);
557
            authorMap.put(authorStr, author);
558
        }
559
        result.put(AUTHOR_NAMESPACE, authorMap);
560

    
561
        //reference map
562
        String nameSpace = REFERENCE_NAMESPACE;
563
        Set<String> idSet = referenceIdSet;
564
        Map<String, Reference> referenceMap = getCommonService().getSourcedObjectsByIdInSourceC(Reference.class, idSet, nameSpace);
565
        result.put(nameSpace, referenceMap);
566

    
567
        //secundum
568
        UUID secUuid = state.getConfig().getSecUuid();
569
        Reference secRef = getReferenceService().find(secUuid);
570
        referenceMap.put(secUuid.toString(), secRef);
571

    
572
        return result;
573
    }
574

    
575
    private void setNamePart(String nameStr, Rank rank, IZoologicalName name) {
576
        if (rank != null){
577
            if (rank.isSupraGeneric() || rank.isGenus()){
578
                if (isBlank(name.getGenusOrUninomial())){
579
                    name.setGenusOrUninomial(nameStr);
580
                }
581
            }else if (rank.isInfraGenericButNotSpeciesGroup()){
582
                if (isBlank(name.getInfraGenericEpithet())){
583
                    name.setInfraGenericEpithet(nameStr);
584
                }
585
            }else if (rank.isSpeciesAggregate() || rank.isSpecies()){
586
                if (isBlank(name.getSpecificEpithet())){
587
                    name.setSpecificEpithet(nameStr);
588
                }
589
            }else if (rank.isInfraSpecific()){
590
                if (isBlank(name.getInfraSpecificEpithet())){
591
                    name.setInfraSpecificEpithet(nameStr);
592
                }
593
            }
594
        }
595
    }
596

    
597
    private Rank makeRank(EdaphobaseImportState state, String rankStr) {
598
        Rank rank = null;
599
        try {
600
            rank = state.getTransformer().getRankByKey(rankStr);
601
            if (rank == null && rankStr != null){
602
                if (rankStr.equals("Cohort")){
603
                    //position not really clear #7285
604
                    Rank lowerRank = Rank.SUPERORDER();
605
                    rank = this.getRank(state, Rank.uuidCohort, "Cohort", "Cohort", null,
606
                            (OrderedTermVocabulary<Rank>)Rank.GENUS().getVocabulary(),
607
                            lowerRank, RankClass.Suprageneric);
608
                }else if (rankStr.equals("Hyporder")){
609
                    rank = this.getRank(state, Rank.uuidHyporder, "Hyporder", "Hyporder", null,
610
                            (OrderedTermVocabulary<Rank>)Rank.GENUS().getVocabulary(),
611
                            Rank.SUBORDER(), RankClass.Suprageneric);
612
                }
613
            }
614
        } catch (UndefinedTransformerMethodException e) {
615
            e.printStackTrace();
616
        }
617
        return rank;
618
    }
619

    
620
    protected void doNotes(AnnotatableEntity annotatableEntity, String notes, AnnotationType type) {
621
        if (StringUtils.isNotBlank(notes) && annotatableEntity != null ){
622
            String notesString = String.valueOf(notes);
623
            if (notesString.length() > 65530 ){
624
                notesString = notesString.substring(0, 65530) + "...";
625
                logger.warn("Notes string is longer than 65530 and was truncated: " + annotatableEntity);
626
            }
627
            Annotation notesAnnotation = Annotation.NewInstance(notesString, Language.UNDETERMINED());
628
            //notesAnnotation.setAnnotationType(AnnotationType.EDITORIAL());
629
            //notes.setCommentator(bmiConfig.getCommentator());
630
            annotatableEntity.addAnnotation(notesAnnotation);
631
        }
632
    }
633

    
634
    @Override
635
    protected boolean doCheck(EdaphobaseImportState state) {
636
        return true;
637
    }
638

    
639
    @Override
640
    protected boolean isIgnore(EdaphobaseImportState state) {
641
        return ! state.getConfig().isDoTaxa();
642
    }
643

    
644
}
(12-12/12)