Project

General

Profile

Download (30.8 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.io.common.ExportDataWrapper;
28
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
29
import eu.etaxonomy.cdm.model.common.Language;
30
import eu.etaxonomy.cdm.model.description.DescriptionBase;
31
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
32
import eu.etaxonomy.cdm.model.description.Distribution;
33
import eu.etaxonomy.cdm.model.description.Feature;
34
import eu.etaxonomy.cdm.model.description.TextData;
35
import eu.etaxonomy.cdm.model.location.NamedArea;
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
        this.exportData = ExportDataWrapper.NewByteArrayInstance();
74

    
75
    }
76

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

    
81

    
82
        PrintWriter writer = null;
83

    
84
        try {
85

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

    
101
            }
102

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

    
124
            }
125
            if (exportStream != null){
126
                state.getResult().addExportData(getByteArray());
127
                //this.exportData.addExportData(exportStream.toByteArray());
128
            }
129
            writer.flush();
130

    
131
            writer.close();
132

    
133
        } catch (Exception e) {
134
            // TODO Auto-generated catch block
135
            e.printStackTrace();
136
        }
137
        if (txStatus != null  ){
138
            commitTransaction(txStatus);
139
        }
140
        return;
141

    
142

    
143
    }
144

    
145
    @Override
146
    protected boolean doCheck(CsvNameExportState state) {
147
        boolean result = true;
148
        logger.warn("No check implemented for " + this.ioName);
149
        return result;
150
    }
151

    
152
    @Override
153
    protected boolean isIgnore(CsvNameExportState state) {
154
        return false;
155
    }
156

    
157

    
158
    public List<HashMap<String,String>> getRecordsForPrintPub(CsvNameExportState state){
159
        List<String> propertyPaths = new ArrayList<String>();
160
        propertyPaths.add("childNodes");
161
        txStatus = startTransaction();
162
        Classification classification = getClassificationService().load(state.getConfig().getClassificationUUID());
163
        TaxonNode rootNode;
164
        if (classification != null){
165
            rootNode = classification.getRootNode();
166
        }else{
167
            List<Classification> classifications = getClassificationService().list(Classification.class, 10, 0, null, null);
168
            if (classifications.isEmpty()){
169
                return null;
170
            }
171
            classification = classifications.get(0);
172
            rootNode = classification.getRootNode();
173
        }
174
        rootNode = getTaxonNodeService().load(rootNode.getUuid(), propertyPaths);
175
        Set<UUID> childrenUuids = new HashSet<UUID>();
176

    
177

    
178
        rootNode = HibernateProxyHelper.deproxy(rootNode, TaxonNode.class);
179
        rootNode.removeNullValueFromChildren();
180
        for (TaxonNode child: rootNode.getChildNodes()){
181
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
182
            childrenUuids.add(child.getUuid());
183
        }
184
        Set<UUID> parentsNodesUUID = new HashSet<UUID>(childrenUuids);
185
        childrenUuids.clear();
186
        List<TaxonNode> childrenNodes = new ArrayList<TaxonNode>();
187
        TaxonNameBase name;
188

    
189

    
190
        findChildren(state, childrenUuids, parentsNodesUUID);
191

    
192

    
193
        List<HashMap<String,String>> nameRecords = new ArrayList<HashMap<String,String>>();
194
        HashMap<String,String> nameRecord = new HashMap<String,String>();
195

    
196
        childrenNodes = getTaxonNodeService().find(childrenUuids);
197
        for(TaxonNode genusNode : childrenNodes)   {
198

    
199
            nameRecords.add(createNewRecord(genusNode, state));
200

    
201
            refreshTransaction();
202

    
203
        }
204

    
205
        return nameRecords;
206

    
207
    }
208

    
209
    /**
210
     * @param state
211
     * @param childrenUuids
212
     * @param parentsNodesUUID
213
     * @param familyNode
214
     */
215
    private void findChildren(CsvNameExportState state, Set<UUID> childrenUuids, Set<UUID> parentsNodesUUID) {
216
        TaxonNameBase name;
217
        List<TaxonNode> familyNodes = getTaxonNodeService().find(parentsNodesUUID);
218
        parentsNodesUUID =new HashSet<UUID>();
219
        for (TaxonNode familyNode: familyNodes){
220
            familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
221
            familyNode.removeNullValueFromChildren();
222
            for (TaxonNode child: familyNode.getChildNodes()){
223
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
224
                Taxon taxon = HibernateProxyHelper.deproxy(child.getTaxon());
225
                if (taxon != null){
226
                    name = HibernateProxyHelper.deproxy(taxon.getName(), TaxonNameBase.class);
227
                    if (child.getTaxon().getName().getRank().isLower(state.getConfig().getRank()) ) {
228
                        childrenUuids.add(child.getUuid());
229
                        if (child.hasChildNodes()){
230
                            parentsNodesUUID.add(child.getUuid());
231
                        }
232
                    }else{
233
                        parentsNodesUUID.add(child.getUuid());
234
                    }
235
                }
236
            }
237
            //refreshTransaction();
238
            if (!parentsNodesUUID.isEmpty()){
239
                findChildren(state, childrenUuids, parentsNodesUUID);
240
            }
241
        }
242

    
243
    }
244

    
245

    
246

    
247

    
248
    private String createSynonymNameString(IBotanicalName synonymName, boolean isInvalid) {
249
        String synonymString = null;
250

    
251
        synonymString= createTaggedNameString(synonymName, isInvalid);
252
        Set<NameRelationship> nameRelations = synonymName.getNameRelations();
253

    
254
        INonViralName relatedName = null;
255
        String nameRelType = null;
256
        boolean first = true;
257
        boolean isInvalidRel = false;
258
        for (NameRelationship nameRel: nameRelations){
259
           // NameRelationship nameRel = nameRelations.iterator().next();
260
            IBotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), IBotanicalName.class);
261

    
262
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
263
            nameRelType = nameRel.getType().getTitleCache();
264
            String relatedNameString = "";
265
            if (fromName.equals(synonymName)){
266
                relatedName = nameRel.getToName();
267
            }else{
268
                relatedName = nameRel.getFromName();
269
            }
270
            if (!nameRel.getType().equals(NameRelationshipType.BASIONYM())){
271
                isInvalidRel = getStatus(relatedName);
272
                relatedNameString = createTaggedNameString(relatedName, isInvalidRel&&isInvalid);
273

    
274
                if (nameRel.getType().equals(NameRelationshipType.LATER_HOMONYM())){
275
                    if (synonymName.equals(nameRel.getFromName())){
276
                        if (first){
277
                            synonymString = synonymString + " [non " + relatedNameString ;
278
                            first = false;
279
                        } else{
280
                            synonymString = synonymString + " nec " + relatedNameString ;
281
                        }
282
                    }
283
                } else if (nameRel.getType().equals(NameRelationshipType.REPLACED_SYNONYM())){
284
                    //synonymString = synonymString + " [non " + relatedNameString + "]";
285
                } else if (nameRel.getType().equals(NameRelationshipType.BLOCKING_NAME_FOR())){
286
                    if (synonymName.equals(nameRel.getToName())){
287
                        if (first){
288
                            synonymString = synonymString + " [non " + relatedNameString ;
289
                            first = false;
290
                        } else{
291
                            synonymString = synonymString + " nec " + relatedNameString ;
292
                        }
293

    
294
                    }
295
                } else if (nameRel.getType().equals(NameRelationshipType.TREATED_AS_LATER_HOMONYM())){
296
                    if (first){
297
                        synonymString = synonymString + " [non " + relatedNameString ;
298
                        first = false;
299
                    } else{
300
                        synonymString = synonymString + " nec " + relatedNameString ;
301
                    }
302
                } else if (nameRel.getType().equals(NameRelationshipType.ALTERNATIVE_NAME())){
303
                    if (first){
304
                        synonymString = synonymString + " [non " + relatedNameString ;
305
                        first = false;
306
                    } else{
307
                        synonymString = synonymString + " nec " + relatedNameString ;
308
                    }
309
                } else if (nameRel.getType().equals(NameRelationshipType.CONSERVED_AGAINST())) {
310

    
311
                }else if (nameRel.getType().equals(NameRelationshipType.ORTHOGRAPHIC_VARIANT())){
312

    
313
                }
314

    
315

    
316
            }
317
        }
318
        if (!first){
319
            synonymString = synonymString + "]";
320
        }
321

    
322

    
323

    
324
        return synonymString;
325
    }
326

    
327
    /**
328
     * @param relatedName
329
     * @return
330
     */
331
    private boolean getStatus(INonViralName relatedName) {
332
        boolean result;
333
        if (!relatedName.getStatus().isEmpty()){
334
            NomenclaturalStatus status = HibernateProxyHelper.deproxy(relatedName.getStatus().iterator().next(),NomenclaturalStatus.class);
335
            if (status.getType().isInvalidType()){
336
                result = true;
337
            }else{
338
                result = false;
339
            }
340
        }else{
341
            result = false;
342
        }
343
        return result;
344
    }
345

    
346
    private String createTaggedNameString(INonViralName name, boolean isInvalid){
347
        String nameString = null;
348
        if (name == null){
349
            return nameString;
350
        }
351

    
352
        nameString = name.generateFullTitle();
353
        if (isInvalid){
354
            nameString = nameString.replace(name.getTitleCache(), "\""+name.getTitleCache()+"\"");
355
        }
356
        if (name.getGenusOrUninomial() != null){
357
            nameString = nameString.replaceAll(name.getGenusOrUninomial(), "<i>"+ name.getGenusOrUninomial() + "</i>");
358
        }
359
        if (name.getInfraGenericEpithet() != null){
360
            nameString = nameString.replaceAll(name.getInfraGenericEpithet(),  "<i>"+ name.getInfraGenericEpithet() + "</i>");
361
        }
362
        if (name.getSpecificEpithet() != null){
363
            nameString = nameString.replaceAll(name.getSpecificEpithet(),  "<i>"+ name.getSpecificEpithet() + "</i>");
364
        }
365
        if (name.getInfraSpecificEpithet() != null && !name.isAutonym()){
366
            nameString = nameString.replaceAll(name.getInfraSpecificEpithet(),  "<i>"+ name.getInfraSpecificEpithet() + "</i>");
367
        }
368

    
369
        return nameString;
370
    }
371

    
372

    
373

    
374
    private List<TaxonNode> getGenusNodes (UUID classificationUUID){
375
        Classification classification = getClassificationService().load(classificationUUID);
376
        TaxonNode rootNode = classification.getRootNode();
377
        rootNode = getTaxonNodeService().load(rootNode.getUuid());
378
        Set<UUID> childrenUuids = new HashSet<UUID>();
379

    
380
        for (TaxonNode child: rootNode.getChildNodes()){
381
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
382
            childrenUuids.add(child.getUuid());
383
        }
384

    
385
        List<TaxonNode> familyNodes = getTaxonNodeService().find(childrenUuids);
386
        childrenUuids.clear();
387
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
388
        for (TaxonNode familyNode: familyNodes){
389
            for (TaxonNode child: familyNode.getChildNodes()){
390
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
391
                childrenUuids.add(child.getUuid());
392
            }
393

    
394
            genusNodes = getTaxonNodeService().find(childrenUuids);
395
        }
396
        return genusNodes;
397
    }
398

    
399
    private TaxonNode getHigherNode(TaxonNode node, Rank rank){
400

    
401
        Rank nodeRank = node.getTaxon().getName().getRank();
402
        if (nodeRank.isKindOf(rank)){
403
            return null;
404

    
405
        }else if (nodeRank.isHigher(rank)){
406
            return null;
407
        } else {
408
            return node.getAncestorOfRank(rank);
409
        }
410
    }
411

    
412
    private void extractDescriptions(HashMap<String, String> nameRecord, Taxon taxon, Feature feature, String columnName, CsvNameExportState state){
413
        StringBuffer descriptionsString = new StringBuffer();
414
        TextData textElement;
415
        Set<Distribution> distributions = new HashSet<Distribution>();
416
        if (taxon.getDescriptions().isEmpty()){
417
            nameRecord.put(columnName, null);
418
                return;
419
        }
420
        for (DescriptionBase<?> descriptionBase: taxon.getDescriptions()){
421
            if (!descriptionBase.isImageGallery()){
422
                Set<DescriptionElementBase> elements = descriptionBase.getElements();
423
                for (DescriptionElementBase element: elements){
424
                    if (element.getFeature().equals(feature)){
425
                        if (element instanceof TextData){
426
                            textElement = HibernateProxyHelper.deproxy(element, TextData.class);
427
                            descriptionsString.append(textElement.getText(Language.ENGLISH()));
428

    
429
                        }else if (element instanceof Distribution ){
430

    
431
                            Distribution distribution = HibernateProxyHelper.deproxy(element, Distribution.class);
432
                            distributions.add(distribution);
433

    
434

    
435
                        }
436

    
437
                    }
438
                }
439
            }
440

    
441

    
442

    
443
        }
444
        if (state.getConfig().isCondensedDistribution()){
445
            List<Language> langs = new ArrayList<Language>();
446
            langs.add(Language.ENGLISH());
447

    
448

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

    
451
            nameRecord.put(columnName, conDis.toString());
452

    
453
        } else{
454
            NamedArea area ;
455
            for (Distribution distribution:distributions){
456

    
457
                if (descriptionsString.length()> 0 ){
458
                    descriptionsString.append(", ");
459
                }
460
                area = HibernateProxyHelper.deproxy(distribution.getArea(), NamedArea.class);
461
                if (area.getIdInVocabulary() != null){
462
                    descriptionsString.append(area.getIdInVocabulary());
463
                }else if (area.getSymbol() != null){
464
                    descriptionsString.append(area.getSymbol());
465
                }else{
466
                    descriptionsString.append(area.getLabel());
467
                }
468

    
469
            }
470
            nameRecord.put(columnName, descriptionsString.toString());
471
        }
472

    
473
    }
474

    
475
    private Feature getNotesFeature(CsvNameExportState state){
476
        if (state.getNotesFeature() != null){
477
            return state.getNotesFeature();
478
        } else{
479
            Pager<DefinedTermBase> notesFeature = getTermService().findByTitle(Feature.class, "Notes" ,MatchMode.EXACT, null, null, null, null, null);
480
            if (notesFeature.getRecords().size() == 0){
481
                return null;
482
            }else{
483
                DefinedTermBase feature=  notesFeature.getRecords().iterator().next();
484
                if (feature instanceof Feature){
485
                    state.setNotesFeature((Feature)feature);
486
                    return (Feature) feature;
487
                } else{
488
                    return null;
489
                }
490
            }
491
        }
492

    
493
    }
494

    
495
    private HashMap<String, String> createNewRecord(TaxonNode childNode, CsvNameExportState state){
496
        HashMap<String, String> nameRecord = new HashMap<String,String>();
497
        nameRecord.put("classification", childNode.getClassification().getTitleCache());
498
        TaxonNode familyNode = getHigherNode(childNode, Rank.FAMILY());
499
        Taxon taxon;
500
        String nameString;
501
        IBotanicalName name;
502
        if (familyNode == null){
503
            nameRecord.put("familyTaxon", null);
504
            nameRecord.put("familyName", null);
505
            nameRecord.put("descriptionsFam", null);
506
        }else{
507
            familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
508
            familyNode.getTaxon().setProtectedTitleCache(true);
509
            nameRecord.put("familyTaxon", familyNode.getTaxon().getTitleCache());
510

    
511
            taxon = (Taxon)getTaxonService().load(familyNode.getTaxon().getUuid());
512
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
513
            //if publish flag is set
514

    
515
            //  if (taxon.isPublish()){
516
            name = HibernateProxyHelper.deproxy(taxon.getName(), IBotanicalName.class);
517
            nameRecord.put("familyName", name.getNameCache());
518
            extractDescriptions(nameRecord, taxon, Feature.INTRODUCTION(), "descriptionsFam", state);
519
        }
520
        TaxonNode genusNode = getHigherNode(childNode, Rank.GENUS());
521
        if (genusNode!= null){
522
            genusNode = HibernateProxyHelper.deproxy(genusNode, TaxonNode.class);
523
            genusNode.getTaxon().setProtectedTitleCache(true);
524
            nameRecord.put("genusTaxon", genusNode.getTaxon().getTitleCache());
525

    
526
            taxon = (Taxon)getTaxonService().load(genusNode.getTaxon().getUuid());
527
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
528
            //if publish flag is set
529

    
530
            //  if (taxon.isPublish()){
531
            name = HibernateProxyHelper.deproxy(taxon.getName(), IBotanicalName.class);
532
            if (name.getNameCache() != null){
533
                nameRecord.put("genusName", name.getNameCache());
534
            }else{
535
                nameRecord.put("genusName", name.getGenusOrUninomial());
536
            }
537
            extractDescriptions(nameRecord, taxon,getNotesFeature(state), "descriptionsGen", state);
538
        }else{
539
            nameRecord.put("genusTaxon", null);
540
            nameRecord.put("genusName", null);
541
            nameRecord.put("descriptionsGen", null);
542
        }
543

    
544
        taxon = (Taxon) getTaxonService().load(childNode.getTaxon().getUuid());
545
        taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
546
        //  if (taxon.isPublish()){
547

    
548
        INonViralName nonViralName = taxon.getName();
549

    
550
        nameString = createTaggedNameString(nonViralName, false);
551
        nameRecord.put("childTaxon", taxon.getTitleCache());
552
        if (taxon.getSec()!= null){
553
            nameRecord.put("secRef", taxon.getSec().getTitleCache());
554
        }else{
555
            nameRecord.put("secRef", null);
556
        }
557

    
558
        getTaxonRelations(nameRecord, taxon);
559

    
560
        name = HibernateProxyHelper.deproxy(getNameService().load(taxon.getName().getUuid()), IBotanicalName.class);
561
        nameRecord.put("childName",nameString);
562
        nameRecord.put("nameId", String.valueOf(name.getId()));
563
        nameRecord.put("nameCache", name.getNameCache());
564
        nameRecord.put("titleName", name.getTitleCache());
565
        if (name.getNomenclaturalReference() != null){
566
            nameRecord.put("NomRefTitleCache", name.getNomenclaturalReference().getTitleCache());
567
        } else{
568
            nameRecord.put("NomRefTitleCache",null);
569
        }
570
        nameRecord.put("fullName", name.getNameCache());
571
        nameRecord.put("fullTitleCache",  name.getFullTitleCache());
572
        Set<TypeDesignationBase> typeDesSet =  name.getTypeDesignations();
573
        Iterator<TypeDesignationBase> it = typeDesSet.iterator();
574
        String typeNameString = NOT_DESIGNATED;
575
        String statusString = null;
576
        if (it.hasNext()){
577

    
578
            TypeDesignationBase typeDes = HibernateProxyHelper.deproxy(it.next(), TypeDesignationBase.class);
579

    
580
            if (typeDes instanceof NameTypeDesignation){
581
                NameTypeDesignation nameTypeDes = HibernateProxyHelper.deproxy(typeDes, NameTypeDesignation.class);
582

    
583
                IBotanicalName typeName =  HibernateProxyHelper.deproxy(nameTypeDes.getTypeName(), IBotanicalName.class);
584
                if (typeName != null){
585

    
586
                    typeNameString = "<i>" + typeName.getNameCache() +"</i> "  + typeName.getAuthorshipCache();
587
                    if (nameTypeDes.getTypeStatus() != null){
588
                        NameTypeDesignationStatus status = HibernateProxyHelper.deproxy(nameTypeDes.getTypeStatus(), NameTypeDesignationStatus.class);
589
                        statusString = status.getTitleCache();
590
                    }
591
                }
592
            }
593
        }
594
        nameRecord.put("typeName", typeNameString);
595
        StringBuffer homotypicalSynonyms = new StringBuffer();
596
        TreeMap<HomotypicalGroup,List<Synonym>> heterotypicSynonymsList = new TreeMap<HomotypicalGroup,List<Synonym>>(new HomotypicalGroupComparator());
597

    
598
        List<Synonym> homotypicSynonymsList = new ArrayList<Synonym>();
599
        StringBuffer heterotypicalSynonyms = new StringBuffer();
600
        List<Synonym> homotypicSynonyms;
601

    
602
        HomotypicalGroup group;
603
        IBotanicalName synonymName;
604
        String doubtfulTitleCache;
605
        for (Synonym synonym: taxon.getSynonyms()){
606
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), IBotanicalName.class);
607
            group = HibernateProxyHelper.deproxy(synonymName.getHomotypicalGroup(), HomotypicalGroup.class);
608
            synonymName.generateFullTitle();
609
            if (synonym.isDoubtful()){
610
                if (!synonymName.getFullTitleCache().startsWith("?")){
611
                    doubtfulTitleCache = "?" + synonymName.getFullTitleCache();
612
                    synonymName = (IBotanicalName) synonymName.clone();
613
                    synonymName.setFullTitleCache(doubtfulTitleCache, true);
614
                }
615
            }
616
            if (!group.equals(name.getHomotypicalGroup())){
617
                if (heterotypicSynonymsList.containsKey(group)){
618
                    heterotypicSynonymsList.get(group).add(synonym);
619
                }else{
620
                    homotypicSynonyms = new ArrayList<Synonym>();
621
                    homotypicSynonyms.add(synonym);
622
                    heterotypicSynonymsList.put(group, homotypicSynonyms);
623
                    homotypicSynonyms= null;
624
                }
625
            } else{
626
                synonymName.generateFullTitle();
627
                homotypicSynonymsList.add(synonym);
628
            }
629
        }
630

    
631

    
632

    
633
        String synonymString;
634
        boolean first = true;
635

    
636
        for (List<Synonym> list: heterotypicSynonymsList.values()){
637
            Collections.sort(list, new HomotypicGroupTaxonComparator(null));
638
            first = true;
639
            for (TaxonBase<?> synonym : list){
640
                NomenclaturalStatus status = null;
641
                if (!synonym.getName().getStatus().isEmpty()){
642
                    status = HibernateProxyHelper.deproxy(synonym.getName().getStatus().iterator().next(),NomenclaturalStatus.class);
643
                    if (status.getType().isInvalidType()){
644
                        heterotypicalSynonyms.append(" <invalid> ");
645
                        synonymName = HibernateProxyHelper.deproxy(synonym.getName(), IBotanicalName.class);
646

    
647
                        synonymString = createSynonymNameString(synonymName, state.getConfig().isInvalidNamesQuoted()) ;
648
                        heterotypicalSynonyms.append(synonymString);
649
                        continue;
650
                    }
651
                }
652
                if (first){
653
                    heterotypicalSynonyms.append(" <heterotypic> ");
654
                }else{
655
                    heterotypicalSynonyms.append(" <homonym> ");
656
                }
657
                first = false;
658
                synonymName = HibernateProxyHelper.deproxy(synonym.getName(), IBotanicalName.class);
659
                synonymString = createSynonymNameString(synonymName, false);
660
                heterotypicalSynonyms.append(synonymString);
661
            }
662
        }
663

    
664
        first = true;
665
        Collections.sort(homotypicSynonymsList, new HomotypicGroupTaxonComparator(null)  );
666
        NomenclaturalStatus status = null;
667
        for (TaxonBase<?> synonym : homotypicSynonymsList){
668

    
669
            if (!synonym.getName().getStatus().isEmpty()){
670
                status = HibernateProxyHelper.deproxy(synonym.getName().getStatus().iterator().next(),NomenclaturalStatus.class);
671
                if (status.getType().isInvalidType()){
672
                    homotypicalSynonyms.append(" <invalid> ");
673
                    synonymName = HibernateProxyHelper.deproxy(synonym.getName(), IBotanicalName.class);
674
                    synonymString = createSynonymNameString(synonymName, true);
675
                    homotypicalSynonyms.append(synonymString);
676
                    continue;
677
                }else if (!first){
678
                    homotypicalSynonyms.append(" <homonym> ");
679
                }
680

    
681
            }else if (!first){
682
                homotypicalSynonyms.append(" <homonym> ");
683
            }
684
            first = false;
685
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), IBotanicalName.class);
686

    
687
            synonymString = createSynonymNameString(synonymName, false);
688

    
689
            homotypicalSynonyms.append(synonymString);
690

    
691
        }
692

    
693
        nameRecord.put("synonyms_homotypic", homotypicalSynonyms.toString());
694
        nameRecord.put("synonyms_heterotypic", heterotypicalSynonyms.toString());
695
        nameRecord.put("status", statusString);
696

    
697
        Set<NameRelationship> nameRelations = name.getNameRelations();
698

    
699
        INonViralName relatedName = null;
700
        String nameRelType = null;
701
        String relNameString = null;
702
        if (nameRelations.size()>0){
703
            NameRelationship nameRel = nameRelations.iterator().next();
704
            IBotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), IBotanicalName.class);
705
            if (fromName.equals(taxon.getName())){
706
                relatedName = nameRel.getToName();
707

    
708
            }else{
709
                relatedName = nameRel.getFromName();
710
            }
711
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
712
            nameRelType = nameRel.getType().getTitleCache();
713
            relNameString  = createTaggedNameString(relatedName, getStatus(relatedName));
714
        }
715

    
716

    
717
        nameRecord.put("relatedName", relNameString);
718
        nameRecord.put("nameRelType", nameRelType);
719

    
720
        extractDescriptions(nameRecord, taxon, Feature.DISTRIBUTION(), "descriptions", state);
721
        return nameRecord;
722
    }
723

    
724
    /**
725
     * @param nameRecord
726
     * @param taxon
727
     */
728
    private void getTaxonRelations(HashMap<String, String> nameRecord, Taxon taxon) {
729
        Set<TaxonRelationship> relations = new HashSet<TaxonRelationship>();
730
        relations =taxon.getTaxonRelations();
731
        if (relations.isEmpty()){
732
            nameRecord.put("missappliedNames", null);
733
        }else{
734
            Taxon relatedTaxon = null;
735
            StringBuffer nameString = new StringBuffer();
736
            for (TaxonRelationship rel : relations){
737
                if (rel.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())){
738
                    relatedTaxon = rel.getFromTaxon();
739
                    Reference secRef = relatedTaxon.getSec();
740
                    String appendedPhrase = "";
741
                    if (relatedTaxon.getAppendedPhrase() != null){
742
                        appendedPhrase = relatedTaxon.getAppendedPhrase();
743
                    }
744
                    if (secRef == null){
745
                        nameString.append("<misapplied>\"" + createTaggedNameString(relatedTaxon.getName(), false) + "\" " + appendedPhrase);
746
                    } else if (secRef.getAuthorship() == null){
747
                        nameString.append("<misapplied>\"" + createTaggedNameString(relatedTaxon.getName(), false) + "\" " + appendedPhrase + " sensu " + secRef.getTitleCache());
748
                    } else {
749
                        nameString.append("<misapplied>\"" + createTaggedNameString(relatedTaxon.getName(), false) + "\" " + appendedPhrase + " sensu " + secRef.getAuthorship().getNomenclaturalTitle());
750
                    }
751

    
752
                }
753
            }
754
            nameRecord.put("missappliedNames", nameString.toString());
755
        }
756

    
757
    }
758

    
759

    
760

    
761

    
762
}
763

    
(1-1/5)