Project

General

Profile

Download (29.9 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.io.csv.caryophyllales.out;
2

    
3
import java.io.ByteArrayOutputStream;
4
import java.io.FileOutputStream;
5
import java.io.OutputStream;
6
import java.io.OutputStreamWriter;
7
import java.io.PrintWriter;
8
import java.util.ArrayList;
9
import java.util.Collections;
10
import java.util.HashMap;
11
import java.util.HashSet;
12
import java.util.Iterator;
13
import java.util.List;
14
import java.util.Set;
15
import java.util.TreeMap;
16
import java.util.UUID;
17

    
18
import org.apache.log4j.Logger;
19
import org.springframework.beans.factory.annotation.Autowired;
20
import org.springframework.stereotype.Component;
21

    
22
import eu.etaxonomy.cdm.api.service.dto.CondensedDistribution;
23
import eu.etaxonomy.cdm.api.service.pager.Pager;
24
import eu.etaxonomy.cdm.ext.geo.CondensedDistributionRecipe;
25
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
26
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
27
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
28
import eu.etaxonomy.cdm.model.common.Language;
29
import eu.etaxonomy.cdm.model.description.DescriptionBase;
30
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
31
import eu.etaxonomy.cdm.model.description.Distribution;
32
import eu.etaxonomy.cdm.model.description.Feature;
33
import eu.etaxonomy.cdm.model.description.TextData;
34
import eu.etaxonomy.cdm.model.location.NamedArea;
35
import eu.etaxonomy.cdm.model.name.BotanicalName;
36
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
37
import eu.etaxonomy.cdm.model.name.HomotypicalGroupComparator;
38
import eu.etaxonomy.cdm.model.name.IBotanicalName;
39
import eu.etaxonomy.cdm.model.name.INonViralName;
40
import eu.etaxonomy.cdm.model.name.NameRelationship;
41
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
42
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
43
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
44
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
45
import eu.etaxonomy.cdm.model.name.Rank;
46
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
47
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
48
import eu.etaxonomy.cdm.model.reference.Reference;
49
import eu.etaxonomy.cdm.model.taxon.Classification;
50
import eu.etaxonomy.cdm.model.taxon.HomotypicGroupTaxonComparator;
51
import eu.etaxonomy.cdm.model.taxon.Synonym;
52
import eu.etaxonomy.cdm.model.taxon.Taxon;
53
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
54
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
55
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
56
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
57
import eu.etaxonomy.cdm.persistence.query.MatchMode;
58

    
59

    
60

    
61
@Component
62
public class CsvNameExport extends CsvNameExportBase {
63
    private static final long serialVersionUID = 7289805663701807425L;
64

    
65
    private static final Logger logger = Logger.getLogger(CsvNameExport.class);
66

    
67
    @Autowired
68
    IEditGeoService geoService;
69

    
70
    public CsvNameExport() {
71
        super();
72
        this.ioName = this.getClass().getSimpleName();
73

    
74
    }
75

    
76
    @Override
77
    protected void doInvoke(CsvNameExportState state) {
78
        CsvNameExportConfigurator config = state.getConfig();
79

    
80

    
81
        PrintWriter writer = null;
82

    
83
        try {
84

    
85
            switch(config.getTarget()) {
86
            case FILE :
87
                OutputStream os = new FileOutputStream(config.getDestination());
88
                os.write(239);
89
                os.write(187);
90
                os.write(191);
91
                writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
92
                break;
93
            case EXPORT_DATA :
94
                exportStream = new ByteArrayOutputStream();
95
                writer = new PrintWriter(exportStream);
96
                break;
97
            default:
98
                break;
99

    
100
            }
101

    
102
            List<HashMap<String, String>> result;
103
            if (config.getRank() == null){
104
                config.setRank(Rank.GENUS());
105
            }
106
            if (config.isNamesOnly()){
107
                txStatus = startTransaction();
108
                result = getNameService().getNameRecords();
109
            } else {
110
                result = getRecordsForPrintPub(state);
111
            }
112
            NameRecord nameRecord;
113
            int count = 0;
114
            boolean isFirst = true;
115
            for (HashMap<String,String> record:result){
116
                if (count > 0){
117
                    isFirst = false;
118
                }
119
                count++;
120
                nameRecord = new NameRecord(record, isFirst);
121
                nameRecord.print(writer, config);
122

    
123
            }
124
            writer.flush();
125

    
126
            writer.close();
127

    
128
        } catch (Exception e) {
129
            // TODO Auto-generated catch block
130
            e.printStackTrace();
131
        }
132
        if (txStatus != null  ){
133
            commitTransaction(txStatus);
134
        }
135
        return;
136

    
137

    
138
    }
139

    
140
    @Override
141
    protected boolean doCheck(CsvNameExportState state) {
142
        boolean result = true;
143
        logger.warn("No check implemented for " + this.ioName);
144
        return result;
145
    }
146

    
147
    @Override
148
    protected boolean isIgnore(CsvNameExportState state) {
149
        return false;
150
    }
151

    
152

    
153
    public List<HashMap<String,String>> getRecordsForPrintPub(CsvNameExportState state){
154
        List<String> propertyPaths = new ArrayList<String>();
155
        propertyPaths.add("childNodes");
156
        txStatus = startTransaction();
157
        Classification classification = getClassificationService().load(state.getConfig().getClassificationUUID());
158
        TaxonNode rootNode = classification.getRootNode();
159
        rootNode = getTaxonNodeService().load(rootNode.getUuid(), propertyPaths);
160
        Set<UUID> childrenUuids = new HashSet<UUID>();
161

    
162

    
163
        rootNode = HibernateProxyHelper.deproxy(rootNode, TaxonNode.class);
164
        rootNode.removeNullValueFromChildren();
165
        for (TaxonNode child: rootNode.getChildNodes()){
166
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
167
            childrenUuids.add(child.getUuid());
168
        }
169
        Set<UUID> parentsNodesUUID = new HashSet<UUID>(childrenUuids);
170
        childrenUuids.clear();
171
        List<TaxonNode> childrenNodes = new ArrayList<TaxonNode>();
172
        TaxonNameBase name;
173

    
174

    
175
        findChildren(state, childrenUuids, parentsNodesUUID);
176

    
177

    
178
        List<HashMap<String,String>> nameRecords = new ArrayList<HashMap<String,String>>();
179
        HashMap<String,String> nameRecord = new HashMap<String,String>();
180

    
181
        childrenNodes = getTaxonNodeService().find(childrenUuids);
182
        for(TaxonNode genusNode : childrenNodes)   {
183

    
184
            nameRecords.add(createNewRecord(genusNode, state));
185

    
186
            refreshTransaction();
187

    
188
        }
189

    
190
        return nameRecords;
191

    
192
    }
193

    
194
    /**
195
     * @param state
196
     * @param childrenUuids
197
     * @param parentsNodesUUID
198
     * @param familyNode
199
     */
200
    private void findChildren(CsvNameExportState state, Set<UUID> childrenUuids, Set<UUID> parentsNodesUUID) {
201
        TaxonNameBase name;
202
        List<TaxonNode> familyNodes = getTaxonNodeService().find(parentsNodesUUID);
203
        parentsNodesUUID =new HashSet<UUID>();
204
        for (TaxonNode familyNode: familyNodes){
205
            familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
206
            familyNode.removeNullValueFromChildren();
207
            for (TaxonNode child: familyNode.getChildNodes()){
208
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
209
                name = HibernateProxyHelper.deproxy(child.getTaxon().getName(), TaxonNameBase.class);
210
                if (child.getTaxon().getName().getRank().isLower(state.getConfig().getRank()) ) {
211
                    childrenUuids.add(child.getUuid());
212
                    if (child.hasChildNodes()){
213
                        parentsNodesUUID.add(child.getUuid());
214
                    }
215
                }else{
216
                    parentsNodesUUID.add(child.getUuid());
217
                }
218
            }
219
            //refreshTransaction();
220
            if (!parentsNodesUUID.isEmpty()){
221
                findChildren(state, childrenUuids, parentsNodesUUID);
222
            }
223
        }
224

    
225
    }
226

    
227

    
228

    
229

    
230
    private String createSynonymNameString(IBotanicalName synonymName, boolean isInvalid) {
231
        String synonymString = null;
232

    
233
        synonymString= createTaggedNameString(synonymName, isInvalid);
234
        Set<NameRelationship> nameRelations = synonymName.getNameRelations();
235

    
236
        INonViralName relatedName = null;
237
        String nameRelType = null;
238
        boolean first = true;
239
        boolean isInvalidRel = false;
240
        for (NameRelationship nameRel: nameRelations){
241
           // NameRelationship nameRel = nameRelations.iterator().next();
242
            BotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), BotanicalName.class);
243

    
244
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
245
            nameRelType = nameRel.getType().getTitleCache();
246
            String relatedNameString = "";
247
            if (fromName.equals(synonymName)){
248
                relatedName = nameRel.getToName();
249
            }else{
250
                relatedName = nameRel.getFromName();
251
            }
252
            if (!nameRel.getType().equals(NameRelationshipType.BASIONYM())){
253
                isInvalidRel = getStatus(relatedName);
254
                relatedNameString = createTaggedNameString(relatedName, isInvalidRel&&isInvalid);
255

    
256
                if (nameRel.getType().equals(NameRelationshipType.LATER_HOMONYM())){
257
                    if (synonymName.equals(nameRel.getFromName())){
258
                        if (first){
259
                            synonymString = synonymString + " [non " + relatedNameString ;
260
                            first = false;
261
                        } else{
262
                            synonymString = synonymString + " nec " + relatedNameString ;
263
                        }
264
                    }
265
                } else if (nameRel.getType().equals(NameRelationshipType.REPLACED_SYNONYM())){
266
                    //synonymString = synonymString + " [non " + relatedNameString + "]";
267
                } else if (nameRel.getType().equals(NameRelationshipType.BLOCKING_NAME_FOR())){
268
                    if (synonymName.equals(nameRel.getToName())){
269
                        if (first){
270
                            synonymString = synonymString + " [non " + relatedNameString ;
271
                            first = false;
272
                        } else{
273
                            synonymString = synonymString + " nec " + relatedNameString ;
274
                        }
275

    
276
                    }
277
                } else if (nameRel.getType().equals(NameRelationshipType.TREATED_AS_LATER_HOMONYM())){
278
                    if (first){
279
                        synonymString = synonymString + " [non " + relatedNameString ;
280
                        first = false;
281
                    } else{
282
                        synonymString = synonymString + " nec " + relatedNameString ;
283
                    }
284
                } else if (nameRel.getType().equals(NameRelationshipType.ALTERNATIVE_NAME())){
285
                    if (first){
286
                        synonymString = synonymString + " [non " + relatedNameString ;
287
                        first = false;
288
                    } else{
289
                        synonymString = synonymString + " nec " + relatedNameString ;
290
                    }
291
                } else if (nameRel.getType().equals(NameRelationshipType.CONSERVED_AGAINST())) {
292

    
293
                }else if (nameRel.getType().equals(NameRelationshipType.ORTHOGRAPHIC_VARIANT())){
294

    
295
                }
296

    
297

    
298
            }
299
        }
300
        if (!first){
301
            synonymString = synonymString + "]";
302
        }
303

    
304

    
305

    
306
        return synonymString;
307
    }
308

    
309
    /**
310
     * @param relatedName
311
     * @return
312
     */
313
    private boolean getStatus(INonViralName relatedName) {
314
        boolean result;
315
        if (!relatedName.getStatus().isEmpty()){
316
            NomenclaturalStatus status = HibernateProxyHelper.deproxy(relatedName.getStatus().iterator().next(),NomenclaturalStatus.class);
317
            if (status.getType().isInvalidType()){
318
                result = true;
319
            }else{
320
                result = false;
321
            }
322
        }else{
323
            result = false;
324
        }
325
        return result;
326
    }
327

    
328
    private String createTaggedNameString(INonViralName name, boolean isInvalid){
329
        String nameString = null;
330
        if (name == null){
331
            return nameString;
332
        }
333

    
334
        nameString = name.generateFullTitle();
335
        if (isInvalid){
336
            nameString = nameString.replace(name.getTitleCache(), "\""+name.getTitleCache()+"\"");
337
        }
338
        if (name.getGenusOrUninomial() != null){
339
            nameString = nameString.replaceAll(name.getGenusOrUninomial(), "<i>"+ name.getGenusOrUninomial() + "</i>");
340
        }
341
        if (name.getInfraGenericEpithet() != null){
342
            nameString = nameString.replaceAll(name.getInfraGenericEpithet(),  "<i>"+ name.getInfraGenericEpithet() + "</i>");
343
        }
344
        if (name.getSpecificEpithet() != null){
345
            nameString = nameString.replaceAll(name.getSpecificEpithet(),  "<i>"+ name.getSpecificEpithet() + "</i>");
346
        }
347
        if (name.getInfraSpecificEpithet() != null && !name.isAutonym()){
348
            nameString = nameString.replaceAll(name.getInfraSpecificEpithet(),  "<i>"+ name.getInfraSpecificEpithet() + "</i>");
349
        }
350

    
351
        return nameString;
352
    }
353

    
354

    
355

    
356
    private List<TaxonNode> getGenusNodes (UUID classificationUUID){
357
        Classification classification = getClassificationService().load(classificationUUID);
358
        TaxonNode rootNode = classification.getRootNode();
359
        rootNode = getTaxonNodeService().load(rootNode.getUuid());
360
        Set<UUID> childrenUuids = new HashSet<UUID>();
361

    
362
        for (TaxonNode child: rootNode.getChildNodes()){
363
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
364
            childrenUuids.add(child.getUuid());
365
        }
366

    
367
        List<TaxonNode> familyNodes = getTaxonNodeService().find(childrenUuids);
368
        childrenUuids.clear();
369
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
370
        for (TaxonNode familyNode: familyNodes){
371
            for (TaxonNode child: familyNode.getChildNodes()){
372
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
373
                childrenUuids.add(child.getUuid());
374
            }
375

    
376
            genusNodes = getTaxonNodeService().find(childrenUuids);
377
        }
378
        return genusNodes;
379
    }
380

    
381
    private TaxonNode getHigherNode(TaxonNode node, Rank rank){
382

    
383
        Rank nodeRank = node.getTaxon().getName().getRank();
384
        if (nodeRank.isKindOf(rank)){
385
            return null;
386

    
387
        }else if (nodeRank.isHigher(rank)){
388
            return null;
389
        } else {
390
            return node.getAncestorOfRank(rank);
391
        }
392
    }
393

    
394
    private void extractDescriptions(HashMap<String, String> nameRecord, Taxon taxon, Feature feature, String columnName, CsvNameExportState state){
395
        StringBuffer descriptionsString = new StringBuffer();
396
        TextData textElement;
397
        Set<Distribution> distributions = new HashSet<Distribution>();
398
        if (taxon.getDescriptions().isEmpty()){
399
            nameRecord.put(columnName, null);
400
                return;
401
        }
402
        for (DescriptionBase<?> descriptionBase: taxon.getDescriptions()){
403
            if (!descriptionBase.isImageGallery()){
404
                Set<DescriptionElementBase> elements = descriptionBase.getElements();
405
                for (DescriptionElementBase element: elements){
406
                    if (element.getFeature().equals(feature)){
407
                        if (element instanceof TextData){
408
                            textElement = HibernateProxyHelper.deproxy(element, TextData.class);
409
                            descriptionsString.append(textElement.getText(Language.ENGLISH()));
410

    
411
                        }else if (element instanceof Distribution ){
412

    
413
                            Distribution distribution = HibernateProxyHelper.deproxy(element, Distribution.class);
414
                            distributions.add(distribution);
415

    
416

    
417
                        }
418

    
419
                    }
420
                }
421
            }
422

    
423

    
424

    
425
        }
426
        if (state.getConfig().isCondensedDistribution()){
427
            List<Language> langs = new ArrayList<Language>();
428
            langs.add(Language.ENGLISH());
429

    
430

    
431
            CondensedDistribution conDis = geoService.getCondensedDistribution(distributions, true, null,null,CondensedDistributionRecipe.FloraCuba, langs );
432

    
433
            nameRecord.put(columnName, conDis.toString());
434

    
435
        } else{
436
            NamedArea area ;
437
            for (Distribution distribution:distributions){
438

    
439
                if (descriptionsString.length()> 0 ){
440
                    descriptionsString.append(", ");
441
                }
442
                area = HibernateProxyHelper.deproxy(distribution.getArea(), NamedArea.class);
443
                if (area.getIdInVocabulary() != null){
444
                    descriptionsString.append(area.getIdInVocabulary());
445
                }else if (area.getSymbol() != null){
446
                    descriptionsString.append(area.getSymbol());
447
                }else{
448
                    descriptionsString.append(area.getLabel());
449
                }
450

    
451
            }
452
            nameRecord.put(columnName, descriptionsString.toString());
453
        }
454

    
455
    }
456

    
457
    private Feature getNotesFeature(CsvNameExportState state){
458
        if (state.getNotesFeature() != null){
459
            return state.getNotesFeature();
460
        } else{
461
            Pager<DefinedTermBase> notesFeature = getTermService().findByTitle(Feature.class, "Notes" ,MatchMode.EXACT, null, null, null, null, null);
462
            if (notesFeature.getRecords().size() == 0){
463
                return null;
464
            }else{
465
                DefinedTermBase feature=  notesFeature.getRecords().iterator().next();
466
                if (feature instanceof Feature){
467
                    state.setNotesFeature((Feature)feature);
468
                    return (Feature) feature;
469
                } else{
470
                    return null;
471
                }
472
            }
473
        }
474

    
475
    }
476

    
477
    private HashMap<String, String> createNewRecord(TaxonNode childNode, CsvNameExportState state){
478
        HashMap<String, String> nameRecord = new HashMap<String,String>();
479
        nameRecord.put("classification", childNode.getClassification().getTitleCache());
480
        TaxonNode familyNode = getHigherNode(childNode, Rank.FAMILY());
481
        Taxon taxon;
482
        String nameString;
483
        BotanicalName name;
484
        if (familyNode == null){
485
            nameRecord.put("familyTaxon", null);
486
            nameRecord.put("familyName", null);
487
            nameRecord.put("descriptionsFam", null);
488
        }else{
489
            familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
490
            familyNode.getTaxon().setProtectedTitleCache(true);
491
            nameRecord.put("familyTaxon", familyNode.getTaxon().getTitleCache());
492

    
493
            taxon = (Taxon)getTaxonService().load(familyNode.getTaxon().getUuid());
494
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
495
            //if publish flag is set
496

    
497
            //  if (taxon.isPublish()){
498
            name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
499
            nameRecord.put("familyName", name.getNameCache());
500
            extractDescriptions(nameRecord, taxon, Feature.INTRODUCTION(), "descriptionsFam", state);
501
        }
502
        TaxonNode genusNode = getHigherNode(childNode, Rank.GENUS());
503
        if (genusNode!= null){
504
            genusNode = HibernateProxyHelper.deproxy(genusNode, TaxonNode.class);
505
            genusNode.getTaxon().setProtectedTitleCache(true);
506
            nameRecord.put("genusTaxon", genusNode.getTaxon().getTitleCache());
507

    
508
            taxon = (Taxon)getTaxonService().load(genusNode.getTaxon().getUuid());
509
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
510
            //if publish flag is set
511

    
512
            //  if (taxon.isPublish()){
513
            name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
514
            if (name.getNameCache() != null){
515
                nameRecord.put("genusName", name.getNameCache());
516
            }else{
517
                nameRecord.put("genusName", name.getGenusOrUninomial());
518
            }
519
            extractDescriptions(nameRecord, taxon,getNotesFeature(state), "descriptionsGen", state);
520
        }else{
521
            nameRecord.put("genusTaxon", null);
522
            nameRecord.put("genusName", null);
523
            nameRecord.put("descriptionsGen", null);
524
        }
525

    
526
        taxon = (Taxon) getTaxonService().load(childNode.getTaxon().getUuid());
527
        taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
528
        //  if (taxon.isPublish()){
529

    
530
        INonViralName nonViralName = taxon.getName();
531

    
532
        nameString = createTaggedNameString(nonViralName, false);
533
        nameRecord.put("childTaxon", taxon.getTitleCache());
534
        if (taxon.getSec()!= null){
535
            nameRecord.put("secRef", taxon.getSec().getTitleCache());
536
        }else{
537
            nameRecord.put("secRef", null);
538
        }
539

    
540
        getTaxonRelations(nameRecord, taxon);
541

    
542
        name = HibernateProxyHelper.deproxy(getNameService().load(taxon.getName().getUuid()), BotanicalName.class);
543
        nameRecord.put("childName",nameString);
544
        nameRecord.put("nameId", String.valueOf(name.getId()));
545
        nameRecord.put("nameCache", name.getNameCache());
546
        nameRecord.put("titleName", name.getTitleCache());
547
        if (name.getNomenclaturalReference() != null){
548
            nameRecord.put("NomRefTitleCache", name.getNomenclaturalReference().getTitleCache());
549
        } else{
550
            nameRecord.put("NomRefTitleCache",null);
551
        }
552
        nameRecord.put("fullName", name.getNameCache());
553
        nameRecord.put("fullTitleCache",  name.getFullTitleCache());
554
        Set<TypeDesignationBase> typeDesSet =  name.getTypeDesignations();
555
        Iterator<TypeDesignationBase> it = typeDesSet.iterator();
556
        String typeNameString = NOT_DESIGNATED;
557
        String statusString = null;
558
        if (it.hasNext()){
559

    
560
            TypeDesignationBase typeDes = HibernateProxyHelper.deproxy(it.next(), TypeDesignationBase.class);
561

    
562
            if (typeDes instanceof NameTypeDesignation){
563
                NameTypeDesignation nameTypeDes = HibernateProxyHelper.deproxy(typeDes, NameTypeDesignation.class);
564

    
565
                BotanicalName typeName =  HibernateProxyHelper.deproxy(nameTypeDes.getTypeName(), BotanicalName.class);
566
                if (typeName != null){
567

    
568
                    typeNameString = "<i>" + typeName.getNameCache() +"</i> "  + typeName.getAuthorshipCache();
569
                    if (nameTypeDes.getTypeStatus() != null){
570
                        NameTypeDesignationStatus status = HibernateProxyHelper.deproxy(nameTypeDes.getTypeStatus(), NameTypeDesignationStatus.class);
571
                        statusString = status.getTitleCache();
572
                    }
573
                }
574
            }
575
        }
576
        nameRecord.put("typeName", typeNameString);
577
        StringBuffer homotypicalSynonyms = new StringBuffer();
578
        TreeMap<HomotypicalGroup,List<Synonym>> heterotypicSynonymsList = new TreeMap<HomotypicalGroup,List<Synonym>>(new HomotypicalGroupComparator());
579

    
580
        List<Synonym> homotypicSynonymsList = new ArrayList<Synonym>();
581
        StringBuffer heterotypicalSynonyms = new StringBuffer();
582
        List<Synonym> homotypicSynonyms;
583

    
584
        HomotypicalGroup group;
585
        BotanicalName synonymName;
586
        String doubtfulTitleCache;
587
        for (Synonym synonym: taxon.getSynonyms()){
588
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
589
            group = HibernateProxyHelper.deproxy(synonymName.getHomotypicalGroup(), HomotypicalGroup.class);
590
            synonymName.generateFullTitle();
591
            if (synonym.isDoubtful()){
592
                if (!synonymName.getFullTitleCache().startsWith("?")){
593
                    doubtfulTitleCache = "?" + synonymName.getFullTitleCache();
594
                    synonymName = (BotanicalName) synonymName.clone();
595
                    synonymName.setFullTitleCache(doubtfulTitleCache, true);
596
                }
597
            }
598
            if (!group.equals(name.getHomotypicalGroup())){
599
                if (heterotypicSynonymsList.containsKey(group)){
600
                    heterotypicSynonymsList.get(group).add(synonym);
601
                }else{
602
                    homotypicSynonyms = new ArrayList<Synonym>();
603
                    homotypicSynonyms.add(synonym);
604
                    heterotypicSynonymsList.put(group, homotypicSynonyms);
605
                    homotypicSynonyms= null;
606
                }
607
            } else{
608
                synonymName.generateFullTitle();
609
                homotypicSynonymsList.add(synonym);
610
            }
611
        }
612

    
613

    
614

    
615
        String synonymString;
616
        boolean first = true;
617

    
618
        for (List<Synonym> list: heterotypicSynonymsList.values()){
619
            Collections.sort(list, new HomotypicGroupTaxonComparator(null));
620
            first = true;
621
            for (TaxonBase<?> synonym : list){
622
                NomenclaturalStatus status = null;
623
                if (!synonym.getName().getStatus().isEmpty()){
624
                    status = HibernateProxyHelper.deproxy(synonym.getName().getStatus().iterator().next(),NomenclaturalStatus.class);
625
                    if (status.getType().isInvalidType()){
626
                        heterotypicalSynonyms.append(" <invalid> ");
627
                        synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
628

    
629
                        synonymString = createSynonymNameString(synonymName, state.getConfig().isInvalidNamesQuoted()) ;
630
                        heterotypicalSynonyms.append(synonymString);
631
                        continue;
632
                    }
633
                }
634
                if (first){
635
                    heterotypicalSynonyms.append(" <heterotypic> ");
636
                }else{
637
                    heterotypicalSynonyms.append(" <homonym> ");
638
                }
639
                first = false;
640
                synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
641
                synonymString = createSynonymNameString(synonymName, false);
642
                heterotypicalSynonyms.append(synonymString);
643
            }
644
        }
645

    
646
        first = true;
647
        Collections.sort(homotypicSynonymsList, new HomotypicGroupTaxonComparator(null)  );
648
        NomenclaturalStatus status = null;
649
        for (TaxonBase<?> synonym : homotypicSynonymsList){
650

    
651
            if (!synonym.getName().getStatus().isEmpty()){
652
                status = HibernateProxyHelper.deproxy(synonym.getName().getStatus().iterator().next(),NomenclaturalStatus.class);
653
                if (status.getType().isInvalidType()){
654
                    homotypicalSynonyms.append(" <invalid> ");
655
                    synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
656
                    synonymString = createSynonymNameString(synonymName, true);
657
                    homotypicalSynonyms.append(synonymString);
658
                    continue;
659
                }else if (!first){
660
                    homotypicalSynonyms.append(" <homonym> ");
661
                }
662

    
663
            }else if (!first){
664
                homotypicalSynonyms.append(" <homonym> ");
665
            }
666
            first = false;
667
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
668

    
669
            synonymString = createSynonymNameString(synonymName, false);
670

    
671
            homotypicalSynonyms.append(synonymString);
672

    
673
        }
674

    
675
        nameRecord.put("synonyms_homotypic", homotypicalSynonyms.toString());
676
        nameRecord.put("synonyms_heterotypic", heterotypicalSynonyms.toString());
677
        nameRecord.put("status", statusString);
678

    
679
        Set<NameRelationship> nameRelations = name.getNameRelations();
680

    
681
        INonViralName relatedName = null;
682
        String nameRelType = null;
683
        String relNameString = null;
684
        if (nameRelations.size()>0){
685
            NameRelationship nameRel = nameRelations.iterator().next();
686
            BotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), BotanicalName.class);
687
            if (fromName.equals(taxon.getName())){
688
                relatedName = nameRel.getToName();
689

    
690
            }else{
691
                relatedName = nameRel.getFromName();
692
            }
693
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
694
            nameRelType = nameRel.getType().getTitleCache();
695
            relNameString  = createTaggedNameString(relatedName, getStatus(relatedName));
696
        }
697

    
698

    
699
        nameRecord.put("relatedName", relNameString);
700
        nameRecord.put("nameRelType", nameRelType);
701

    
702
        extractDescriptions(nameRecord, taxon, Feature.DISTRIBUTION(), "descriptions", state);
703
        return nameRecord;
704
    }
705

    
706
    /**
707
     * @param nameRecord
708
     * @param taxon
709
     */
710
    private void getTaxonRelations(HashMap<String, String> nameRecord, Taxon taxon) {
711
        Set<TaxonRelationship> relations = new HashSet<TaxonRelationship>();
712
        relations =taxon.getTaxonRelations();
713
        if (relations.isEmpty()){
714
            nameRecord.put("missappliedNames", null);
715
        }else{
716
            Taxon relatedTaxon = null;
717
            StringBuffer nameString = new StringBuffer();
718
            for (TaxonRelationship rel : relations){
719
                if (rel.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())){
720
                    relatedTaxon = rel.getFromTaxon();
721
                    Reference secRef = relatedTaxon.getSec();
722
                    String appendedPhrase = "";
723
                    if (relatedTaxon.getAppendedPhrase() != null){
724
                        appendedPhrase = relatedTaxon.getAppendedPhrase();
725
                    }
726
                    if (secRef == null){
727
                        nameString.append("<misapplied>\"" + createTaggedNameString(relatedTaxon.getName(), false) + "\" " + appendedPhrase);
728
                    } else if (secRef.getAuthorship() == null){
729
                        nameString.append("<misapplied>\"" + createTaggedNameString(relatedTaxon.getName(), false) + "\" " + appendedPhrase + " sensu " + secRef.getTitleCache());
730
                    } else {
731
                        nameString.append("<misapplied>\"" + createTaggedNameString(relatedTaxon.getName(), false) + "\" " + appendedPhrase + " sensu " + secRef.getAuthorship().getNomenclaturalTitle());
732
                    }
733

    
734
                }
735
            }
736
            nameRecord.put("missappliedNames", nameString.toString());
737
        }
738

    
739
    }
740

    
741

    
742
}
743

    
(1-1/5)