Project

General

Profile

Download (20.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.stereotype.Component;
20

    
21
import eu.etaxonomy.cdm.api.service.pager.Pager;
22
import eu.etaxonomy.cdm.ext.geo.CondensedDistributionRecipe;
23
import eu.etaxonomy.cdm.ext.geo.EditGeoService;
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.common.MarkerType;
28
import eu.etaxonomy.cdm.model.description.DescriptionBase;
29
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
30
import eu.etaxonomy.cdm.model.description.Distribution;
31
import eu.etaxonomy.cdm.model.description.Feature;
32
import eu.etaxonomy.cdm.model.description.TextData;
33
import eu.etaxonomy.cdm.model.name.BotanicalName;
34
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
35
import eu.etaxonomy.cdm.model.name.HomotypicalGroupComparator;
36
import eu.etaxonomy.cdm.model.name.NameRelationship;
37
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
38
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
39
import eu.etaxonomy.cdm.model.name.Rank;
40
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
41
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
42
import eu.etaxonomy.cdm.model.taxon.Classification;
43
import eu.etaxonomy.cdm.model.taxon.HomotypicGroupTaxonComparator;
44
import eu.etaxonomy.cdm.model.taxon.Synonym;
45
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
46
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
47
import eu.etaxonomy.cdm.model.taxon.Taxon;
48
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
49
import eu.etaxonomy.cdm.model.taxon.TaxonComparator;
50
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
51
import eu.etaxonomy.cdm.persistence.query.MatchMode;
52

    
53

    
54

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

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

    
64
    @Override
65
    protected void doInvoke(CsvNameExportState state) {
66
        CsvNameExportConfigurator config = state.getConfig();
67

    
68

    
69
        PrintWriter writer = null;
70

    
71
        try {
72

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

    
88
            }
89

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

    
108
            }
109
            writer.flush();
110

    
111
            writer.close();
112

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

    
122

    
123
    }
124

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

    
132
    @Override
133
    protected boolean isIgnore(CsvNameExportState state) {
134
        return false;
135
    }
136

    
137

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

    
147
        for (TaxonNode child: rootNode.getChildNodes()){
148
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
149
            childrenUuids.add(child.getUuid());
150
        }
151
        Set<UUID> parentsNodesUUID = new HashSet<UUID>(childrenUuids);
152
        childrenUuids.clear();
153
        List<TaxonNode> childrenNodes = new ArrayList<TaxonNode>();
154
        TaxonNameBase name;
155

    
156

    
157
        findChildren(state, childrenUuids, parentsNodesUUID);
158

    
159

    
160
        List<HashMap<String,String>> nameRecords = new ArrayList<HashMap<String,String>>();
161
        HashMap<String,String> nameRecord = new HashMap<String,String>();
162

    
163
        childrenNodes = getTaxonNodeService().find(childrenUuids);
164
        for(TaxonNode genusNode : childrenNodes)   {
165

    
166
            nameRecords.add(createNewRecord(genusNode, state));
167

    
168
            refreshTransaction();
169

    
170
        }
171

    
172
        return nameRecords;
173

    
174
    }
175

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

    
206
    }
207

    
208

    
209

    
210

    
211
    private String createSynonymNameString(BotanicalName synonymName) {
212
        String synonymString = null;
213

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

    
232

    
233
        return synonymString;
234
    }
235

    
236

    
237

    
238
    private List<TaxonNode> getGenusNodes (UUID classificationUUID){
239
        Classification classification = getClassificationService().load(classificationUUID);
240
        TaxonNode rootNode = classification.getRootNode();
241
        rootNode = getTaxonNodeService().load(rootNode.getUuid());
242
        Set<UUID> childrenUuids = new HashSet<UUID>();
243

    
244
        for (TaxonNode child: rootNode.getChildNodes()){
245
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
246
            childrenUuids.add(child.getUuid());
247
        }
248

    
249
        List<TaxonNode> familyNodes = getTaxonNodeService().find(childrenUuids);
250
        childrenUuids.clear();
251
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
252
        for (TaxonNode familyNode: familyNodes){
253
            for (TaxonNode child: familyNode.getChildNodes()){
254
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
255
                childrenUuids.add(child.getUuid());
256
            }
257

    
258
            genusNodes = getTaxonNodeService().find(childrenUuids);
259
        }
260
        return genusNodes;
261
    }
262

    
263
    private TaxonNode getHigherNode(TaxonNode node, Rank rank){
264

    
265
        Rank nodeRank = node.getTaxon().getName().getRank();
266
        if (nodeRank.isKindOf(rank)){
267
            return node;
268

    
269
        }else if (nodeRank.isHigher(rank)){
270
            return null;
271
        } else {
272
            return node.getAncestorOfRank(rank);
273
        }
274
    }
275

    
276
    private void extractDescriptions(HashMap<String, String> nameRecord, Taxon taxon, Feature feature, String columnName){
277
        StringBuffer descriptionsString = new StringBuffer();
278
        TextData textElement;
279
        List<Distribution> distributions = new ArrayList<Distribution>();
280
        for (DescriptionBase<?> descriptionBase: taxon.getDescriptions()){
281
            Set<DescriptionElementBase> elements = descriptionBase.getElements();
282
            for (DescriptionElementBase element: elements){
283
                if (element.getFeature().equals(feature)){
284
                    if (element instanceof TextData){
285
                        textElement = HibernateProxyHelper.deproxy(element, TextData.class);
286
                        descriptionsString.append(textElement.getText(Language.ENGLISH()));
287

    
288
                    }else if (element instanceof Distribution){
289

    
290
                        Distribution distribution = HibernateProxyHelper.deproxy(element, Distribution.class);
291
                        distributions.add(distribution);
292

    
293

    
294
                    }
295

    
296
                }
297
            }
298

    
299

    
300

    
301
        }
302
     //   Collections.sort(distributions, new DistributionNodeByAreaLabelComparator());
303
        EditGeoService.getCondensedDistribution(distributions, true,
304
                Set<MarkerType> hideMarkedAreas,
305
                MarkerType fallbackAreaMarkerType,
306
                CondensedDistributionRecipe recipe,
307
                List<Language> langs);
308
        for (Distribution distribution:distributions){
309

    
310
            if (descriptionsString.length()> 0 ){
311
                descriptionsString.append(", ");
312
            }
313
            descriptionsString.append(distribution.getArea().getIdInVocabulary());
314

    
315
        }
316
        nameRecord.put(columnName, descriptionsString.toString());
317
    }
318

    
319
    private Feature getNotesFeature(CsvNameExportState state){
320
        if (state.getNotesFeature() != null){
321
            return state.getNotesFeature();
322
        } else{
323
            Pager<DefinedTermBase> notesFeature = getTermService().findByTitle(Feature.class, "Notes" ,MatchMode.EXACT, null, null, null, null, null);
324
            if (notesFeature.getRecords().size() == 0){
325
                return null;
326
            }else{
327
                DefinedTermBase feature=  notesFeature.getRecords().iterator().next();
328
                if (feature instanceof Feature){
329
                    state.setNotesFeature((Feature)feature);
330
                    return (Feature) feature;
331
                } else{
332
                    return null;
333
                }
334
            }
335
        }
336

    
337
    }
338

    
339
    private HashMap<String, String> createNewRecord(TaxonNode childNode, CsvNameExportState state){
340
        HashMap<String, String> nameRecord = new HashMap<String,String>();
341
        nameRecord.put("classification", childNode.getClassification().getTitleCache());
342
        TaxonNode familyNode = getHigherNode(childNode, Rank.FAMILY());
343
        familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
344
        familyNode.getTaxon().setProtectedTitleCache(true);
345
        nameRecord.put("familyTaxon", familyNode.getTaxon().getTitleCache());
346

    
347

    
348

    
349

    
350
        Taxon taxon = (Taxon)getTaxonService().load(familyNode.getTaxon().getUuid());
351
        taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
352
        //if publish flag is set
353

    
354
        //  if (taxon.isPublish()){
355
        BotanicalName name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
356
        nameRecord.put("familyName", name.getNameCache());
357
        extractDescriptions(nameRecord, taxon, Feature.INTRODUCTION(), "descriptionsFam");
358

    
359
        TaxonNode genusNode = getHigherNode(childNode, Rank.GENUS());
360
        if (genusNode!= null){
361
            genusNode = HibernateProxyHelper.deproxy(genusNode, TaxonNode.class);
362
            genusNode.getTaxon().setProtectedTitleCache(true);
363
            nameRecord.put("genusTaxon", genusNode.getTaxon().getTitleCache());
364

    
365
            taxon = (Taxon)getTaxonService().load(genusNode.getTaxon().getUuid());
366
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
367
            //if publish flag is set
368

    
369
            //  if (taxon.isPublish()){
370
            name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
371
            if (name.getNameCache() != null){
372
                nameRecord.put("genusName", name.getNameCache());
373
            }else{
374
                nameRecord.put("genusName", name.getGenusOrUninomial());
375
            }
376
            extractDescriptions(nameRecord, taxon, Feature.INTRODUCTION(), "descriptionsGen");
377
        }
378
        taxon = (Taxon) getTaxonService().load(childNode.getTaxon().getUuid());
379
        taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
380
        //  if (taxon.isPublish()){
381
        nameRecord.put("childTaxon", taxon.getTitleCache());
382
        if (taxon.getSec()!= null){
383
            nameRecord.put("secRef", taxon.getSec().getTitleCache());
384
        }else{
385
            nameRecord.put("secRef", null);
386
        }
387

    
388
        name = HibernateProxyHelper.deproxy(getNameService().load(taxon.getName().getUuid()), BotanicalName.class);
389
        nameRecord.put("childName",name.getTitleCache());
390
        nameRecord.put("nameId", String.valueOf(name.getId()));
391
        nameRecord.put("nameCache", name.getNameCache());
392
        nameRecord.put("titleName", name.getTitleCache());
393
        if (name.getNomenclaturalReference() != null){
394
            nameRecord.put("NomRefTitleCache", name.getNomenclaturalReference().getTitleCache());
395
        } else{
396
            nameRecord.put("NomRefTitleCache",null);
397
        }
398
        nameRecord.put("fullName", name.getNameCache());
399
        nameRecord.put("fullTitleCache",  name.getFullTitleCache());
400
        Set<TypeDesignationBase> typeDesSet =  name.getTypeDesignations();
401
        Iterator<TypeDesignationBase> it = typeDesSet.iterator();
402
        String typeNameString = NOT_DESIGNATED;
403
        String statusString = null;
404
        if (it.hasNext()){
405
            NameTypeDesignation typeDes = HibernateProxyHelper.deproxy(it.next(), NameTypeDesignation.class);
406

    
407

    
408
            BotanicalName typeName =  HibernateProxyHelper.deproxy(typeDes.getTypeName(), BotanicalName.class);
409
            if (typeName != null){
410

    
411
                typeNameString = "<i>" + typeName.getNameCache() +"</i> "  + typeName.getAuthorshipCache();
412
                if (typeDes.getTypeStatus() != null){
413
                    NameTypeDesignationStatus status = HibernateProxyHelper.deproxy(typeDes.getTypeStatus(), NameTypeDesignationStatus.class);
414
                    statusString = status.getTitleCache();
415
                }
416
            }
417

    
418
        }
419
        nameRecord.put("typeName", typeNameString);
420
        StringBuffer homotypicalSynonyms = new StringBuffer();
421
        TreeMap<HomotypicalGroup,List<Synonym>> heterotypicSynonymsList = new TreeMap<HomotypicalGroup,List<Synonym>>(new HomotypicalGroupComparator());
422
        List<Synonym> homotypicSynonymsList = new ArrayList<Synonym>();
423
        StringBuffer heterotypicalSynonyms = new StringBuffer();
424
        List<Synonym> homotypicSynonyms;
425

    
426
        HomotypicalGroup group;
427
        BotanicalName synonymName;
428
        String doubtfulTitleCache;
429
        for (SynonymRelationship synRel: taxon.getSynonymRelations()){
430
            synonymName = HibernateProxyHelper.deproxy(synRel.getSynonym().getName(), BotanicalName.class);
431
            if (synRel.getType().equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())){
432
                group = HibernateProxyHelper.deproxy(synonymName.getHomotypicalGroup(), HomotypicalGroup.class);
433
                synonymName.generateFullTitle();
434
                if (synRel.getSynonym().isDoubtful()){
435
                    doubtfulTitleCache = "?" + synonymName.getFullTitleCache();
436
                    synonymName.setFullTitleCache(doubtfulTitleCache, true);
437
                }
438
                if (heterotypicSynonymsList.containsKey(group)){
439
                    heterotypicSynonymsList.get(group).add(synRel.getSynonym());
440
                }else{
441
                    homotypicSynonyms = new ArrayList<Synonym>();
442
                    homotypicSynonyms.add(synRel.getSynonym());
443
                    heterotypicSynonymsList.put(group, homotypicSynonyms);
444
                    homotypicSynonyms= null;
445
                }
446
            } else{
447
                synonymName.generateFullTitle();
448
                homotypicSynonymsList.add(synRel.getSynonym());
449
            }
450
        }
451

    
452

    
453

    
454
        String synonymString;
455
        boolean first = true;
456

    
457
        for (List<Synonym> list: heterotypicSynonymsList.values()){
458
            Collections.sort(list, new HomotypicGroupTaxonComparator(null));
459
            first = true;
460
            for (TaxonBase<?> synonym : list){
461
                if (first){
462
                    heterotypicalSynonyms.append(" <heterotypic> ");
463
                }else{
464
                    heterotypicalSynonyms.append(" <homonym> ");
465
                }
466
                first = false;
467
                synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
468
                synonymString = createSynonymNameString(synonymName);
469
                heterotypicalSynonyms.append(synonymString);
470
            }
471
        }
472

    
473
        first = true;
474
        Collections.sort(homotypicSynonymsList, new TaxonComparator());
475
        for (TaxonBase<?> synonym : homotypicSynonymsList){
476
            if (!first){
477
                homotypicalSynonyms.append(" <homonym> ");
478
            }
479
            first = false;
480
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
481
            synonymString = createSynonymNameString(synonymName);
482

    
483
            homotypicalSynonyms.append(synonymString);
484

    
485
        }
486

    
487
        nameRecord.put("synonyms_homotypic", homotypicalSynonyms.toString());
488
        nameRecord.put("synonyms_heterotypic", heterotypicalSynonyms.toString());
489
        nameRecord.put("status", statusString);
490

    
491
        Set<NameRelationship> nameRelations = name.getNameRelations();
492

    
493
        String relatedName = null;
494
        String nameRelType = null;
495
        if (nameRelations.size()>0){
496
            NameRelationship nameRel = nameRelations.iterator().next();
497
            BotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), BotanicalName.class);
498
            if (fromName.equals(taxon.getName())){
499
                relatedName = nameRel.getToName().getTitleCache();
500

    
501
            }else{
502
                relatedName = nameRel.getFromName().getTitleCache();
503
            }
504
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
505
            nameRelType = nameRel.getType().getTitleCache();
506
        }
507

    
508

    
509
        nameRecord.put("relatedName", relatedName);
510
        nameRecord.put("nameRelType", nameRelType);
511

    
512
        extractDescriptions(nameRecord, taxon, Feature.DISTRIBUTION(), "description");
513
        return nameRecord;
514
    }
515

    
516

    
517
}
518

    
(1-1/5)