Project

General

Profile

Download (21.1 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.pager.Pager;
23
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
24
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
25
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
26
import eu.etaxonomy.cdm.model.common.Language;
27
import eu.etaxonomy.cdm.model.description.DescriptionBase;
28
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
29
import eu.etaxonomy.cdm.model.description.Distribution;
30
import eu.etaxonomy.cdm.model.description.Feature;
31
import eu.etaxonomy.cdm.model.description.TextData;
32
import eu.etaxonomy.cdm.model.name.BotanicalName;
33
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
34
import eu.etaxonomy.cdm.model.name.HomotypicalGroupComparator;
35
import eu.etaxonomy.cdm.model.name.NameRelationship;
36
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
37
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
38
import eu.etaxonomy.cdm.model.name.Rank;
39
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
40
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
41
import eu.etaxonomy.cdm.model.taxon.Classification;
42
import eu.etaxonomy.cdm.model.taxon.HomotypicGroupTaxonComparator;
43
import eu.etaxonomy.cdm.model.taxon.Synonym;
44
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
45
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
46
import eu.etaxonomy.cdm.model.taxon.Taxon;
47
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
48
import eu.etaxonomy.cdm.model.taxon.TaxonComparator;
49
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
50
import eu.etaxonomy.cdm.persistence.query.MatchMode;
51

    
52

    
53

    
54
@Component
55
public class CsvNameExport extends CsvNameExportBase {
56
    private static final Logger logger = Logger.getLogger(CsvNameExport.class);
57

    
58
    @Autowired
59
    IEditGeoService geoService;
60

    
61
    public CsvNameExport() {
62
        super();
63
        this.ioName = this.getClass().getSimpleName();
64

    
65
    }
66

    
67
    @Override
68
    protected void doInvoke(CsvNameExportState state) {
69
        CsvNameExportConfigurator config = state.getConfig();
70

    
71

    
72
        PrintWriter writer = null;
73

    
74
        try {
75

    
76
            switch(config.getTarget()) {
77
            case FILE :
78
                OutputStream os = new FileOutputStream(config.getDestination());
79
                os.write(239);
80
                os.write(187);
81
                os.write(191);
82
                writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
83
                break;
84
            case EXPORT_DATA :
85
                exportStream = new ByteArrayOutputStream();
86
                writer = new PrintWriter(exportStream);
87
                break;
88
            default:
89
                break;
90

    
91
            }
92

    
93
            List<HashMap<String, String>> result;
94
            if (config.isNamesOnly()){
95
                txStatus = startTransaction();
96
                result = getNameService().getNameRecords();
97
            } else {
98
                result = getRecordsForPrintPub(state);
99
            }
100
            NameRecord nameRecord;
101
            int count = 0;
102
            boolean isFirst = true;
103
            for (HashMap<String,String> record:result){
104
                if (count > 0){
105
                    isFirst = false;
106
                }
107
                count++;
108
                nameRecord = new NameRecord(record, isFirst);
109
                nameRecord.print(writer, config);
110

    
111
            }
112
            writer.flush();
113

    
114
            writer.close();
115

    
116
        } catch (Exception e) {
117
            // TODO Auto-generated catch block
118
            e.printStackTrace();
119
        }
120
        if (txStatus != null  ){
121
            commitTransaction(txStatus);
122
        }
123
        return;
124

    
125

    
126
    }
127

    
128
    @Override
129
    protected boolean doCheck(CsvNameExportState state) {
130
        boolean result = true;
131
        logger.warn("No check implemented for " + this.ioName);
132
        return result;
133
    }
134

    
135
    @Override
136
    protected boolean isIgnore(CsvNameExportState state) {
137
        return false;
138
    }
139

    
140

    
141
    public List<HashMap<String,String>> getRecordsForPrintPub(CsvNameExportState state){
142
        List<String> propertyPaths = new ArrayList<String>();
143
        propertyPaths.add("childNodes");
144
        txStatus = startTransaction();
145
        Classification classification = getClassificationService().load(state.getConfig().getClassificationUUID());
146
        TaxonNode rootNode = classification.getRootNode();
147
        rootNode = getTaxonNodeService().load(rootNode.getUuid(), propertyPaths);
148
        Set<UUID> childrenUuids = new HashSet<UUID>();
149

    
150

    
151
        rootNode = HibernateProxyHelper.deproxy(rootNode, TaxonNode.class);
152
        rootNode.removeNullValueFromChildren();
153
        for (TaxonNode child: rootNode.getChildNodes()){
154
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
155
            childrenUuids.add(child.getUuid());
156
        }
157
        Set<UUID> parentsNodesUUID = new HashSet<UUID>(childrenUuids);
158
        childrenUuids.clear();
159
        List<TaxonNode> childrenNodes = new ArrayList<TaxonNode>();
160
        TaxonNameBase name;
161

    
162

    
163
        findChildren(state, childrenUuids, parentsNodesUUID);
164

    
165

    
166
        List<HashMap<String,String>> nameRecords = new ArrayList<HashMap<String,String>>();
167
        HashMap<String,String> nameRecord = new HashMap<String,String>();
168

    
169
        childrenNodes = getTaxonNodeService().find(childrenUuids);
170
        for(TaxonNode genusNode : childrenNodes)   {
171
            if (!genusNode.isTopmostNode()){
172
                nameRecords.add(createNewRecord(genusNode, state));
173
            }
174
            refreshTransaction();
175

    
176
        }
177

    
178
        return nameRecords;
179

    
180
    }
181

    
182
    /**
183
     * @param state
184
     * @param childrenUuids
185
     * @param parentsNodesUUID
186
     * @param familyNode
187
     */
188
    private void findChildren(CsvNameExportState state, Set<UUID> childrenUuids, Set<UUID> parentsNodesUUID) {
189
        TaxonNameBase name;
190
        List<TaxonNode> familyNodes = getTaxonNodeService().find(parentsNodesUUID);
191
        parentsNodesUUID =new HashSet<UUID>();
192
        for (TaxonNode familyNode: familyNodes){
193
            familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
194
            familyNode.removeNullValueFromChildren();
195
            for (TaxonNode child: familyNode.getChildNodes()){
196
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
197
                name = HibernateProxyHelper.deproxy(child.getTaxon().getName(), TaxonNameBase.class);
198
                if (name.isGenus()) {
199
                    childrenUuids.add(child.getUuid());
200
                    if (child.hasChildNodes()){
201
                        parentsNodesUUID.add(child.getUuid());
202
                    }
203
                }
204
            }
205
            //refreshTransaction();
206
            if (!parentsNodesUUID.isEmpty()){
207
                findChildren(state, childrenUuids, parentsNodesUUID);
208
            }
209
        }
210

    
211
    }
212

    
213

    
214

    
215

    
216
    private String createSynonymNameString(BotanicalName synonymName) {
217
        String synonymString = null;
218

    
219
        synonymString = synonymName.generateFullTitle();
220
        if (synonymName.getNameCache() != null){
221
        synonymString = synonymString.replaceAll(synonymName.getNameCache(), "<i>"+ synonymName.getNameCache() + "</i>");
222
        } else{
223
            if (synonymName.getGenusOrUninomial() != null){
224
                synonymString = synonymString.replaceAll(synonymName.getGenusOrUninomial(), "<i>"+ synonymName.getGenusOrUninomial() + "</i>");
225
            }
226
            if (synonymName.getInfraGenericEpithet() != null){
227
                synonymString = synonymString.replaceAll(synonymName.getInfraGenericEpithet(),  "<i>"+ synonymName.getInfraGenericEpithet() + "</i>");
228
            }
229
            if (synonymName.getSpecificEpithet() != null){
230
                synonymString = synonymString.replaceAll(synonymName.getSpecificEpithet(),  "<i>"+ synonymName.getSpecificEpithet() + "</i>");
231
            }
232
            if (synonymName.getInfraSpecificEpithet() != null){
233
                synonymString = synonymString.replaceAll(synonymName.getInfraSpecificEpithet(),  "<i>"+ synonymName.getInfraSpecificEpithet() + "</i>");
234
            }
235
        }
236

    
237

    
238
        return synonymString;
239
    }
240

    
241

    
242

    
243
    private List<TaxonNode> getGenusNodes (UUID classificationUUID){
244
        Classification classification = getClassificationService().load(classificationUUID);
245
        TaxonNode rootNode = classification.getRootNode();
246
        rootNode = getTaxonNodeService().load(rootNode.getUuid());
247
        Set<UUID> childrenUuids = new HashSet<UUID>();
248

    
249
        for (TaxonNode child: rootNode.getChildNodes()){
250
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
251
            childrenUuids.add(child.getUuid());
252
        }
253

    
254
        List<TaxonNode> familyNodes = getTaxonNodeService().find(childrenUuids);
255
        childrenUuids.clear();
256
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
257
        for (TaxonNode familyNode: familyNodes){
258
            for (TaxonNode child: familyNode.getChildNodes()){
259
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
260
                childrenUuids.add(child.getUuid());
261
            }
262

    
263
            genusNodes = getTaxonNodeService().find(childrenUuids);
264
        }
265
        return genusNodes;
266
    }
267

    
268
    private TaxonNode getHigherNode(TaxonNode node, Rank rank){
269

    
270
        node = HibernateProxyHelper.deproxy(node, TaxonNode.class);
271
        TaxonNameBase name = HibernateProxyHelper.deproxy( node.getTaxon().getName(), TaxonNameBase.class);
272
        Rank nodeRank = node.getTaxon().getName().getRank();
273
        if (nodeRank.equals(rank)){
274
            return node;
275

    
276
        }else if (nodeRank.isHigher(rank)){
277
            return null;
278
        } else {
279
            return node.getAncestorOfRank(rank);
280
        }
281
    }
282

    
283
    private void extractDescriptions(HashMap<String, String> nameRecord, Taxon taxon, Feature feature, String columnName, CsvNameExportState state){
284
        StringBuffer descriptionsString = new StringBuffer();
285
        TextData textElement;
286
        Set<Distribution> distributions = new HashSet<Distribution>();
287
        for (DescriptionBase<?> descriptionBase: taxon.getDescriptions()){
288

    
289
            Set<DescriptionElementBase> elements = descriptionBase.getElements();
290
            for (DescriptionElementBase element: elements){
291
                if (element.getFeature().equals(feature)){
292
                    if (element instanceof TextData){
293
                        textElement = HibernateProxyHelper.deproxy(element, TextData.class);
294
                        descriptionsString.append(textElement.getText(Language.ENGLISH()));
295

    
296
                    }else if (element instanceof Distribution ){
297

    
298
                        Distribution distribution = HibernateProxyHelper.deproxy(element, Distribution.class);
299
                        distributions.add(distribution);
300

    
301

    
302
                    }
303

    
304
                }
305
            }
306

    
307

    
308

    
309
        }
310
     //   Collections.sort(distributions, new DistributionNodeByAreaLabelComparator());
311

    
312
        if (state.getConfig().isCondensedDistribution()){
313
            List<Language> langs = new ArrayList<Language>();
314
            langs.add(Language.ENGLISH());
315

    
316

    
317
//            CondensedDistribution conDis = geoService.getCondensedDistribution(distributions, true, null,null,CondensedDistributionRecipe.FloraCuba, langs );
318
//
319
//            nameRecord.put(columnName, conDis.toString());
320

    
321
        } else{
322
            for (Distribution distribution:distributions){
323

    
324
                if (descriptionsString.length()> 0 ){
325
                    descriptionsString.append(", ");
326
                }
327
                descriptionsString.append(distribution.getArea().getIdInVocabulary());
328

    
329
            }
330

    
331
        }
332
        nameRecord.put(columnName, descriptionsString.toString());
333

    
334
    }
335

    
336
    private Feature getNotesFeature(CsvNameExportState state){
337
        if (state.getNotesFeature() != null){
338
            return state.getNotesFeature();
339
        } else{
340
            Pager<DefinedTermBase> notesFeature = getTermService().findByTitle(Feature.class, "Notes" ,MatchMode.EXACT, null, null, null, null, null);
341
            if (notesFeature.getRecords().size() == 0){
342
                return null;
343
            }else{
344
                DefinedTermBase feature=  notesFeature.getRecords().iterator().next();
345
                if (feature instanceof Feature){
346
                    state.setNotesFeature((Feature)feature);
347
                    return (Feature) feature;
348
                } else{
349
                    return null;
350
                }
351
            }
352
        }
353

    
354
    }
355

    
356
    private HashMap<String, String> createNewRecord(TaxonNode childNode, CsvNameExportState state){
357
        HashMap<String, String> nameRecord = new HashMap<String,String>();
358
        nameRecord.put("classification", childNode.getClassification().getTitleCache());
359
        TaxonNode familyNode = getHigherNode(childNode, Rank.FAMILY());
360
        Taxon taxon;
361
        BotanicalName name;
362
        if (familyNode != null){
363
            familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
364
            familyNode.getTaxon().setProtectedTitleCache(true);
365

    
366
            nameRecord.put("familyTaxon", familyNode.getTaxon().getTitleCache());
367

    
368

    
369

    
370

    
371
            taxon = (Taxon)getTaxonService().load(familyNode.getTaxon().getUuid());
372
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
373
            //if publish flag is set
374

    
375
            //  if (taxon.isPublish()){
376
            name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
377
            nameRecord.put("familyName", name.getNameCache());
378
            extractDescriptions(nameRecord, taxon, Feature.INTRODUCTION(), "descriptionsFam", state);
379
        } else{
380
            nameRecord.put("familyTaxon", null);
381
            nameRecord.put("familyName", null);
382
            nameRecord.put("descriptionsFam", null);
383
        }
384
        TaxonNode genusNode = getHigherNode(childNode, Rank.GENUS());
385
        if (genusNode!= null){
386
            genusNode = HibernateProxyHelper.deproxy(genusNode, TaxonNode.class);
387
            genusNode.getTaxon().setProtectedTitleCache(true);
388
            nameRecord.put("genusTaxon", genusNode.getTaxon().getTitleCache());
389

    
390
            taxon = (Taxon)getTaxonService().load(genusNode.getTaxon().getUuid());
391
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
392
            //if publish flag is set
393

    
394
            //  if (taxon.isPublish()){
395
            name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
396
            if (name.getNameCache() != null){
397
                nameRecord.put("genusName", name.getNameCache());
398
            }else{
399
                nameRecord.put("genusName", name.getGenusOrUninomial());
400
            }
401
            extractDescriptions(nameRecord, taxon, getNotesFeature(state), "descriptionsGen", state);
402
        }
403
        taxon = (Taxon) getTaxonService().load(childNode.getTaxon().getUuid());
404
        taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
405
        //  if (taxon.isPublish()){
406
        nameRecord.put("childTaxon", taxon.getTitleCache());
407
        if (taxon.getSec()!= null){
408
            nameRecord.put("secRef", taxon.getSec().getTitleCache());
409
        }else{
410
            nameRecord.put("secRef", null);
411
        }
412

    
413
        name = HibernateProxyHelper.deproxy(getNameService().load(taxon.getName().getUuid()), BotanicalName.class);
414
        nameRecord.put("childName",name.getTitleCache());
415
        nameRecord.put("nameId", String.valueOf(name.getId()));
416
        nameRecord.put("nameCache", name.getNameCache());
417
        nameRecord.put("titleName", name.getTitleCache());
418
        if (name.getNomenclaturalReference() != null){
419
            nameRecord.put("NomRefTitleCache", name.getNomenclaturalReference().getTitleCache());
420
        } else{
421
            nameRecord.put("NomRefTitleCache",null);
422
        }
423
        nameRecord.put("fullName", name.getNameCache());
424
        nameRecord.put("fullTitleCache",  name.getFullTitleCache());
425
        Set<TypeDesignationBase> typeDesSet =  name.getTypeDesignations();
426
        Iterator<TypeDesignationBase> it = typeDesSet.iterator();
427
        String typeNameString = NOT_DESIGNATED;
428
        String statusString = null;
429
        if (it.hasNext()){
430
            NameTypeDesignation typeDes = HibernateProxyHelper.deproxy(it.next(), NameTypeDesignation.class);
431

    
432

    
433
            BotanicalName typeName =  HibernateProxyHelper.deproxy(typeDes.getTypeName(), BotanicalName.class);
434
            if (typeName != null){
435

    
436
                typeNameString = "<i>" + typeName.getNameCache() +"</i> "  + typeName.getAuthorshipCache();
437
                if (typeDes.getTypeStatus() != null){
438
                    NameTypeDesignationStatus status = HibernateProxyHelper.deproxy(typeDes.getTypeStatus(), NameTypeDesignationStatus.class);
439
                    statusString = status.getTitleCache();
440
                }
441
            }
442

    
443
        }
444
        nameRecord.put("typeName", typeNameString);
445
        StringBuffer homotypicalSynonyms = new StringBuffer();
446
        TreeMap<HomotypicalGroup,List<Synonym>> heterotypicSynonymsList = new TreeMap<HomotypicalGroup,List<Synonym>>(new HomotypicalGroupComparator());
447
        List<Synonym> homotypicSynonymsList = new ArrayList<Synonym>();
448
        StringBuffer heterotypicalSynonyms = new StringBuffer();
449
        List<Synonym> homotypicSynonyms;
450

    
451
        HomotypicalGroup group;
452
        BotanicalName synonymName;
453
        String doubtfulTitleCache;
454
        for (SynonymRelationship synRel: taxon.getSynonymRelations()){
455
            synonymName = HibernateProxyHelper.deproxy(synRel.getSynonym().getName(), BotanicalName.class);
456
            if (synRel.getType().equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())){
457
                group = HibernateProxyHelper.deproxy(synonymName.getHomotypicalGroup(), HomotypicalGroup.class);
458
                synonymName.generateFullTitle();
459
                if (synRel.getSynonym().isDoubtful()){
460
                    doubtfulTitleCache = "?" + synonymName.getFullTitleCache();
461
                    synonymName.setFullTitleCache(doubtfulTitleCache, true);
462
                }
463
                if (heterotypicSynonymsList.containsKey(group)){
464
                    heterotypicSynonymsList.get(group).add(synRel.getSynonym());
465
                }else{
466
                    homotypicSynonyms = new ArrayList<Synonym>();
467
                    homotypicSynonyms.add(synRel.getSynonym());
468
                    heterotypicSynonymsList.put(group, homotypicSynonyms);
469
                    homotypicSynonyms= null;
470
                }
471
            } else{
472
                synonymName.generateFullTitle();
473
                homotypicSynonymsList.add(synRel.getSynonym());
474
            }
475
        }
476

    
477

    
478

    
479
        String synonymString;
480
        boolean first = true;
481

    
482
        for (List<Synonym> list: heterotypicSynonymsList.values()){
483
            Collections.sort(list, new HomotypicGroupTaxonComparator(null));
484
            first = true;
485
            for (TaxonBase<?> synonym : list){
486
                if (first){
487
                    heterotypicalSynonyms.append(" <heterotypic> ");
488
                }else{
489
                    heterotypicalSynonyms.append(" <homonym> ");
490
                }
491
                first = false;
492
                synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
493
                synonymString = createSynonymNameString(synonymName);
494
                heterotypicalSynonyms.append(synonymString);
495
            }
496
        }
497

    
498
        first = true;
499
        Collections.sort(homotypicSynonymsList, new TaxonComparator());
500
        for (TaxonBase<?> synonym : homotypicSynonymsList){
501
            if (!first){
502
                homotypicalSynonyms.append(" <homonym> ");
503
            }
504
            first = false;
505
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
506
            synonymString = createSynonymNameString(synonymName);
507

    
508
            homotypicalSynonyms.append(synonymString);
509

    
510
        }
511

    
512
        nameRecord.put("synonyms_homotypic", homotypicalSynonyms.toString());
513
        nameRecord.put("synonyms_heterotypic", heterotypicalSynonyms.toString());
514
        nameRecord.put("status", statusString);
515

    
516
        Set<NameRelationship> nameRelations = name.getNameRelations();
517

    
518
        String relatedName = null;
519
        String nameRelType = null;
520
        if (nameRelations.size()>0){
521
            NameRelationship nameRel = nameRelations.iterator().next();
522
            BotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), BotanicalName.class);
523
            if (fromName.equals(taxon.getName())){
524
                relatedName = nameRel.getToName().getTitleCache();
525

    
526
            }else{
527
                relatedName = nameRel.getFromName().getTitleCache();
528
            }
529
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
530
            nameRelType = nameRel.getType().getTitleCache();
531
        }
532

    
533

    
534
        nameRecord.put("relatedName", relatedName);
535
        nameRecord.put("nameRelType", nameRelType);
536

    
537
        extractDescriptions(nameRecord, taxon, Feature.DISTRIBUTION(), "description", state);
538
        return nameRecord;
539
    }
540

    
541

    
542
}
543

    
(1-1/5)