Project

General

Profile

« Previous | Next » 

Revision 15578742

Added by Andreas Müller about 8 years ago

Apply HomotypicGroupTaxonComparator to all existing uses of old
TaxonComparator #3338

View differences:

cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/csv/caryophyllales/out/CsvNameExport.java
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.hibernate.HibernateProxyHelper;
23
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
24
import eu.etaxonomy.cdm.model.common.Language;
25
import eu.etaxonomy.cdm.model.description.DescriptionBase;
26
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
27
import eu.etaxonomy.cdm.model.description.Feature;
28
import eu.etaxonomy.cdm.model.description.TextData;
29
import eu.etaxonomy.cdm.model.name.BotanicalName;
30
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
31
import eu.etaxonomy.cdm.model.name.HomotypicalGroupComparator;
32
import eu.etaxonomy.cdm.model.name.NameRelationship;
33
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
34
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
35
import eu.etaxonomy.cdm.model.name.Rank;
36
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
37
import eu.etaxonomy.cdm.model.taxon.Classification;
38
import eu.etaxonomy.cdm.model.taxon.Synonym;
39
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
40
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
41
import eu.etaxonomy.cdm.model.taxon.Taxon;
42
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
43
import eu.etaxonomy.cdm.model.taxon.TaxonComparator;
44
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
45
import eu.etaxonomy.cdm.persistence.query.MatchMode;
46

  
47

  
48
@Component
49
public class CsvNameExport extends CsvNameExportBase {
50
    /**
51
     *
52
     */
53
    private static final long serialVersionUID = 1L;
54
    /**
55
     *
56
     */
57

  
58
    private static final Logger logger = Logger.getLogger(CsvNameExport.class);
59

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

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

  
69

  
70
        PrintWriter writer = null;
71

  
72
        try {
73

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

  
89
            }
90

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

  
109
            }
110
            writer.flush();
111

  
112
            writer.close();
113

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

  
121

  
122
    }
123

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

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

  
136

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

  
146
        for (TaxonNode child: rootNode.getChildNodes()){
147
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
148
            childrenUuids.add(child.getUuid());
149
        }
150
        List<UUID> familyNodes = new ArrayList<UUID>(childrenUuids);
151
        childrenUuids.clear();
152
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
153
        TaxonNode familyNode;
154
        for (UUID familyNodeUUID: familyNodes){
155
            familyNode = getTaxonNodeService().find(familyNodeUUID);
156
            for (TaxonNode child: familyNode.getChildNodes()){
157
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
158
                childrenUuids.add(child.getUuid());
159
            }
160

  
161
            genusNodes = getTaxonNodeService().find(childrenUuids);
162
            refreshTransaction();
163
        }
164

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

  
168
        Taxon taxon;
169
        BotanicalName name;
170
        BotanicalName typeName;
171
        TextData textElement;
172
        NameTypeDesignation typeDes;
173
        for(TaxonNode genusNode : genusNodes)   {
174

  
175
            nameRecords.add(createNewRecord(genusNode, state));
176

  
177
            refreshTransaction();
178

  
179
        }
180

  
181
        return nameRecords;
182

  
183
    }
184

  
185

  
186

  
187

  
188
    private String createSynonymNameString(BotanicalName synonymName) {
189
        String synonymString = null;
190

  
191
        synonymString = synonymName.generateFullTitle();
192

  
193
        if (synonymName.getGenusOrUninomial() != null){
194
            synonymString = synonymString.replaceAll(synonymName.getGenusOrUninomial(), "<i>"+ synonymName.getGenusOrUninomial() + "</i>");
195
        }
196
        if (synonymName.getInfraGenericEpithet() != null){
197
            synonymString = synonymString.replaceAll(synonymName.getInfraGenericEpithet(),  "<i>"+ synonymName.getInfraGenericEpithet() + "</i>");
198
        }
199

  
200
        return synonymString;
201
    }
202

  
203

  
204

  
205
    private List<TaxonNode> getGenusNodes (UUID classificationUUID){
206
        Classification classification = getClassificationService().load(classificationUUID);
207
        TaxonNode rootNode = classification.getRootNode();
208
        rootNode = getTaxonNodeService().load(rootNode.getUuid());
209
        Set<UUID> childrenUuids = new HashSet<UUID>();
210

  
211
        for (TaxonNode child: rootNode.getChildNodes()){
212
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
213
            childrenUuids.add(child.getUuid());
214
        }
215

  
216
        List<TaxonNode> familyNodes = getTaxonNodeService().find(childrenUuids);
217
        childrenUuids.clear();
218
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
219
        for (TaxonNode familyNode: familyNodes){
220
            for (TaxonNode child: familyNode.getChildNodes()){
221
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
222
                childrenUuids.add(child.getUuid());
223
            }
224

  
225
            genusNodes = getTaxonNodeService().find(childrenUuids);
226
        }
227
        return genusNodes;
228
    }
229

  
230
    private TaxonNode getFamilyName(TaxonNode node){
231

  
232
        Rank nodeRank = node.getTaxon().getName().getRank();
233
        if (nodeRank.isKindOf(Rank.FAMILY())){
234
            return node;
235

  
236
        }else if (nodeRank.isHigher(Rank.FAMILY())){
237
            return null;
238
        } else {
239
            return node.getAncestorOfRank(Rank.FAMILY());
240
        }
241
    }
242

  
243
    private void extractDescriptions(HashMap<String, String> nameRecord, Taxon taxon, Feature feature, String columnName){
244
        StringBuffer descriptionsString = new StringBuffer();
245
        TextData textElement;
246
        for (DescriptionBase<?> descriptionBase: taxon.getDescriptions()){
247
            Set<DescriptionElementBase> elements = descriptionBase.getElements();
248
            for (DescriptionElementBase element: elements){
249
                if (element.getFeature().equals(feature)){
250
                    if (element instanceof TextData){
251
                        textElement = HibernateProxyHelper.deproxy(element, TextData.class);
252
                        descriptionsString.append(textElement.getText(Language.ENGLISH()));
253

  
254
                    }
255

  
256
                }
257
            }
258

  
259

  
260
        }
261

  
262
        nameRecord.put(columnName, descriptionsString.toString());
263
    }
264

  
265
    private Feature getNotesFeature(CsvNameExportState state){
266
        if (state.getNotesFeature() != null){
267
            return state.getNotesFeature();
268
        } else{
269
            Pager<DefinedTermBase> notesFeature = getTermService().findByTitle(Feature.class, "Notes" ,MatchMode.EXACT, null, null, null, null, null);
270
            if (notesFeature.getRecords().size() == 0){
271
                return null;
272
            }else{
273
                DefinedTermBase feature=  notesFeature.getRecords().iterator().next();
274
                if (feature instanceof Feature){
275
                    state.setNotesFeature((Feature)feature);
276
                    return (Feature) feature;
277
                } else{
278
                    return null;
279
                }
280
            }
281
        }
282

  
283
    }
284

  
285
    private HashMap<String, String> createNewRecord(TaxonNode genusNode, CsvNameExportState state){
286
        HashMap<String, String> nameRecord = new HashMap<String,String>();
287
        nameRecord.put("classification", genusNode.getClassification().getTitleCache());
288
        TaxonNode familyNode = getTaxonNodeService().load(genusNode.getParent().getUuid());
289
        familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
290
        familyNode.getTaxon().setProtectedTitleCache(true);
291
        nameRecord.put("familyTaxon", familyNode.getTaxon().getTitleCache());
292

  
293
        Taxon taxon = (Taxon)getTaxonService().load(familyNode.getTaxon().getUuid());
294
        taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
295
        //if publish flag is set
296

  
297
        //  if (taxon.isPublish()){
298
        BotanicalName name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
299
        nameRecord.put("familyName", name.getNameCache());
300
        extractDescriptions(nameRecord, taxon, Feature.INTRODUCTION(), "descriptionsFam");
301

  
302
        if (genusNode.getTaxon() == null){
303
            nameRecord.put("genusTaxon", null);
304
            return nameRecord;
305
        }else{
306
            taxon = (Taxon) getTaxonService().load(genusNode.getTaxon().getUuid());
307
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
308
            nameRecord.put("genusTaxon", taxon.getTitleCache());
309

  
310
            if (taxon.getSec()!= null){
311
                nameRecord.put("secRef", taxon.getSec().getTitleCache());
312
            }else{
313
                nameRecord.put("secRef", null);
314
            }
315
        }
316

  
317
        //  if (taxon.isPublish()){
318

  
319

  
320

  
321
        name = HibernateProxyHelper.deproxy(getNameService().load(taxon.getName().getUuid()), BotanicalName.class);
322
        nameRecord.put("genusName",name.getTitleCache());
323
        nameRecord.put("nameId", String.valueOf(name.getId()));
324
        nameRecord.put("nameCache", name.getNameCache());
325
        nameRecord.put("titleName", name.getTitleCache());
326
        if (name.getNomenclaturalReference() != null){
327
            nameRecord.put("NomRefTitleCache", name.getNomenclaturalReference().getTitleCache());
328
        } else{
329
            nameRecord.put("NomRefTitleCache",null);
330
        }
331
        nameRecord.put("fullName", name.getNameCache());
332
        nameRecord.put("fullTitleCache",  name.getFullTitleCache());
333
        Set<TypeDesignationBase> typeDesSet =  name.getTypeDesignations();
334
        Iterator<TypeDesignationBase> it = typeDesSet.iterator();
335
        String typeNameString = NOT_DESIGNATED;
336
        String statusString = null;
337
        if (it.hasNext()){
338
            NameTypeDesignation typeDes = HibernateProxyHelper.deproxy(it.next(), NameTypeDesignation.class);
339

  
340

  
341
            BotanicalName typeName =  HibernateProxyHelper.deproxy(typeDes.getTypeName(), BotanicalName.class);
342
            if (typeName != null){
343

  
344
                typeNameString = "<i>" + typeName.getNameCache() +"</i> "  + typeName.getAuthorshipCache();
345
                if (typeDes.getTypeStatus() != null){
346
                    NameTypeDesignationStatus status = HibernateProxyHelper.deproxy(typeDes.getTypeStatus(), NameTypeDesignationStatus.class);
347
                    statusString = status.getTitleCache();
348
                }
349
            }
350

  
351
        }
352
        nameRecord.put("typeName", typeNameString);
353
        StringBuffer homotypicalSynonyms = new StringBuffer();
354
        TreeMap<HomotypicalGroup,List<Synonym>> heterotypicSynonymsList = new TreeMap<HomotypicalGroup,List<Synonym>>(new HomotypicalGroupComparator());
355
        List<Synonym> homotypicSynonymsList = new ArrayList<Synonym>();
356
        StringBuffer heterotypicalSynonyms = new StringBuffer();
357
        List<Synonym> homotypicSynonyms;
358

  
359
        HomotypicalGroup group;
360
        BotanicalName synonymName;
361
        String doubtfulTitleCache;
362
        for (SynonymRelationship synRel: taxon.getSynonymRelations()){
363
            synonymName = HibernateProxyHelper.deproxy(synRel.getSynonym().getName(), BotanicalName.class);
364
            if (synRel.getType().equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())){
365
                group = HibernateProxyHelper.deproxy(synonymName.getHomotypicalGroup(), HomotypicalGroup.class);
366
                synonymName.generateFullTitle();
367
                if (synRel.getSynonym().isDoubtful()){
368
                    doubtfulTitleCache = "?" + synonymName.getFullTitleCache();
369
                    synonymName.setFullTitleCache(doubtfulTitleCache, true);
370
                }
371
                if (heterotypicSynonymsList.containsKey(group)){
372
                    heterotypicSynonymsList.get(group).add(synRel.getSynonym());
373
                }else{
374
                    homotypicSynonyms = new ArrayList<Synonym>();
375
                    homotypicSynonyms.add(synRel.getSynonym());
376
                    heterotypicSynonymsList.put(group, homotypicSynonyms);
377
                    homotypicSynonyms= null;
378
                }
379
            } else{
380
                synonymName.generateFullTitle();
381
                homotypicSynonymsList.add(synRel.getSynonym());
382
            }
383
        }
384

  
385

  
386

  
387
        String synonymString;
388
        boolean first = true;
389

  
390
        for (List<Synonym> list: heterotypicSynonymsList.values()){
391
            Collections.sort(list, new TaxonComparator());
392
            first = true;
393
            for (TaxonBase<?> synonym : list){
394
                if (first){
395
                    heterotypicalSynonyms.append(" <heterotypic> ");
396
                }else{
397
                    heterotypicalSynonyms.append(" <homonym> ");
398
                }
399
                first = false;
400
                synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
401
                synonymString = createSynonymNameString(synonymName);
402
                heterotypicalSynonyms.append(synonymString);
403
            }
404
        }
405

  
406
        first = true;
407
        Collections.sort(homotypicSynonymsList, new TaxonComparator());
408
        for (TaxonBase<?> synonym : homotypicSynonymsList){
409
            if (!first){
410
                homotypicalSynonyms.append(" <homonym> ");
411
            }
412
            first = false;
413
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
414
            synonymString = createSynonymNameString(synonymName);
415

  
416
            homotypicalSynonyms.append(synonymString);
417

  
418
        }
419

  
420
        nameRecord.put("synonyms_homotypic", homotypicalSynonyms.toString());
421
        nameRecord.put("synonyms_heterotypic", heterotypicalSynonyms.toString());
422
        nameRecord.put("status", statusString);
423

  
424
        Set<NameRelationship> nameRelations = name.getNameRelations();
425

  
426
        String relatedName = null;
427
        String nameRelType = null;
428
        if (nameRelations.size()>0){
429
            NameRelationship nameRel = nameRelations.iterator().next();
430
            BotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), BotanicalName.class);
431
            if (fromName.equals(taxon.getName())){
432
                relatedName = nameRel.getToName().getTitleCache();
433

  
434
            }else{
435
                relatedName = nameRel.getFromName().getTitleCache();
436
            }
437
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
438
            nameRelType = nameRel.getType().getTitleCache();
439
        }
440

  
441

  
442
        nameRecord.put("relatedName", relatedName);
443
        nameRecord.put("nameRelType", nameRelType);
444

  
445
        extractDescriptions(nameRecord, taxon, getNotesFeature(state), "description");
446
        return nameRecord;
447
    }
448

  
449

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

  
48

  
49
@Component
50
public class CsvNameExport extends CsvNameExportBase {
51
    /**
52
     *
53
     */
54
    private static final long serialVersionUID = 1L;
55
    /**
56
     *
57
     */
58

  
59
    private static final Logger logger = Logger.getLogger(CsvNameExport.class);
60

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

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

  
70

  
71
        PrintWriter writer = null;
72

  
73
        try {
74

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

  
90
            }
91

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

  
110
            }
111
            writer.flush();
112

  
113
            writer.close();
114

  
115
        } catch (Exception e) {
116
            // TODO Auto-generated catch block
117
            e.printStackTrace();
118
        }
119
        commitTransaction(txStatus);
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
        List<UUID> familyNodes = new ArrayList<UUID>(childrenUuids);
152
        childrenUuids.clear();
153
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
154
        TaxonNode familyNode;
155
        for (UUID familyNodeUUID: familyNodes){
156
            familyNode = getTaxonNodeService().find(familyNodeUUID);
157
            for (TaxonNode child: familyNode.getChildNodes()){
158
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
159
                childrenUuids.add(child.getUuid());
160
            }
161

  
162
            genusNodes = getTaxonNodeService().find(childrenUuids);
163
            refreshTransaction();
164
        }
165

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

  
169
        Taxon taxon;
170
        BotanicalName name;
171
        BotanicalName typeName;
172
        TextData textElement;
173
        NameTypeDesignation typeDes;
174
        for(TaxonNode genusNode : genusNodes)   {
175

  
176
            nameRecords.add(createNewRecord(genusNode, state));
177

  
178
            refreshTransaction();
179

  
180
        }
181

  
182
        return nameRecords;
183

  
184
    }
185

  
186

  
187

  
188

  
189
    private String createSynonymNameString(BotanicalName synonymName) {
190
        String synonymString = null;
191

  
192
        synonymString = synonymName.generateFullTitle();
193

  
194
        if (synonymName.getGenusOrUninomial() != null){
195
            synonymString = synonymString.replaceAll(synonymName.getGenusOrUninomial(), "<i>"+ synonymName.getGenusOrUninomial() + "</i>");
196
        }
197
        if (synonymName.getInfraGenericEpithet() != null){
198
            synonymString = synonymString.replaceAll(synonymName.getInfraGenericEpithet(),  "<i>"+ synonymName.getInfraGenericEpithet() + "</i>");
199
        }
200

  
201
        return synonymString;
202
    }
203

  
204

  
205

  
206
    private List<TaxonNode> getGenusNodes (UUID classificationUUID){
207
        Classification classification = getClassificationService().load(classificationUUID);
208
        TaxonNode rootNode = classification.getRootNode();
209
        rootNode = getTaxonNodeService().load(rootNode.getUuid());
210
        Set<UUID> childrenUuids = new HashSet<UUID>();
211

  
212
        for (TaxonNode child: rootNode.getChildNodes()){
213
            child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
214
            childrenUuids.add(child.getUuid());
215
        }
216

  
217
        List<TaxonNode> familyNodes = getTaxonNodeService().find(childrenUuids);
218
        childrenUuids.clear();
219
        List<TaxonNode> genusNodes = new ArrayList<TaxonNode>();
220
        for (TaxonNode familyNode: familyNodes){
221
            for (TaxonNode child: familyNode.getChildNodes()){
222
                child = HibernateProxyHelper.deproxy(child, TaxonNode.class);
223
                childrenUuids.add(child.getUuid());
224
            }
225

  
226
            genusNodes = getTaxonNodeService().find(childrenUuids);
227
        }
228
        return genusNodes;
229
    }
230

  
231
    private TaxonNode getFamilyName(TaxonNode node){
232

  
233
        Rank nodeRank = node.getTaxon().getName().getRank();
234
        if (nodeRank.isKindOf(Rank.FAMILY())){
235
            return node;
236

  
237
        }else if (nodeRank.isHigher(Rank.FAMILY())){
238
            return null;
239
        } else {
240
            return node.getAncestorOfRank(Rank.FAMILY());
241
        }
242
    }
243

  
244
    private void extractDescriptions(HashMap<String, String> nameRecord, Taxon taxon, Feature feature, String columnName){
245
        StringBuffer descriptionsString = new StringBuffer();
246
        TextData textElement;
247
        for (DescriptionBase<?> descriptionBase: taxon.getDescriptions()){
248
            Set<DescriptionElementBase> elements = descriptionBase.getElements();
249
            for (DescriptionElementBase element: elements){
250
                if (element.getFeature().equals(feature)){
251
                    if (element instanceof TextData){
252
                        textElement = HibernateProxyHelper.deproxy(element, TextData.class);
253
                        descriptionsString.append(textElement.getText(Language.ENGLISH()));
254

  
255
                    }
256

  
257
                }
258
            }
259

  
260

  
261
        }
262

  
263
        nameRecord.put(columnName, descriptionsString.toString());
264
    }
265

  
266
    private Feature getNotesFeature(CsvNameExportState state){
267
        if (state.getNotesFeature() != null){
268
            return state.getNotesFeature();
269
        } else{
270
            Pager<DefinedTermBase> notesFeature = getTermService().findByTitle(Feature.class, "Notes" ,MatchMode.EXACT, null, null, null, null, null);
271
            if (notesFeature.getRecords().size() == 0){
272
                return null;
273
            }else{
274
                DefinedTermBase feature=  notesFeature.getRecords().iterator().next();
275
                if (feature instanceof Feature){
276
                    state.setNotesFeature((Feature)feature);
277
                    return (Feature) feature;
278
                } else{
279
                    return null;
280
                }
281
            }
282
        }
283

  
284
    }
285

  
286
    private HashMap<String, String> createNewRecord(TaxonNode genusNode, CsvNameExportState state){
287
        HashMap<String, String> nameRecord = new HashMap<String,String>();
288
        nameRecord.put("classification", genusNode.getClassification().getTitleCache());
289
        TaxonNode familyNode = getTaxonNodeService().load(genusNode.getParent().getUuid());
290
        familyNode = HibernateProxyHelper.deproxy(familyNode, TaxonNode.class);
291
        familyNode.getTaxon().setProtectedTitleCache(true);
292
        nameRecord.put("familyTaxon", familyNode.getTaxon().getTitleCache());
293

  
294
        Taxon taxon = (Taxon)getTaxonService().load(familyNode.getTaxon().getUuid());
295
        taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
296
        //if publish flag is set
297

  
298
        //  if (taxon.isPublish()){
299
        BotanicalName name = HibernateProxyHelper.deproxy(taxon.getName(), BotanicalName.class);
300
        nameRecord.put("familyName", name.getNameCache());
301
        extractDescriptions(nameRecord, taxon, Feature.INTRODUCTION(), "descriptionsFam");
302

  
303
        if (genusNode.getTaxon() == null){
304
            nameRecord.put("genusTaxon", null);
305
            return nameRecord;
306
        }else{
307
            taxon = (Taxon) getTaxonService().load(genusNode.getTaxon().getUuid());
308
            taxon = HibernateProxyHelper.deproxy(taxon, Taxon.class);
309
            nameRecord.put("genusTaxon", taxon.getTitleCache());
310

  
311
            if (taxon.getSec()!= null){
312
                nameRecord.put("secRef", taxon.getSec().getTitleCache());
313
            }else{
314
                nameRecord.put("secRef", null);
315
            }
316
        }
317

  
318
        //  if (taxon.isPublish()){
319

  
320

  
321

  
322
        name = HibernateProxyHelper.deproxy(getNameService().load(taxon.getName().getUuid()), BotanicalName.class);
323
        nameRecord.put("genusName",name.getTitleCache());
324
        nameRecord.put("nameId", String.valueOf(name.getId()));
325
        nameRecord.put("nameCache", name.getNameCache());
326
        nameRecord.put("titleName", name.getTitleCache());
327
        if (name.getNomenclaturalReference() != null){
328
            nameRecord.put("NomRefTitleCache", name.getNomenclaturalReference().getTitleCache());
329
        } else{
330
            nameRecord.put("NomRefTitleCache",null);
331
        }
332
        nameRecord.put("fullName", name.getNameCache());
333
        nameRecord.put("fullTitleCache",  name.getFullTitleCache());
334
        Set<TypeDesignationBase> typeDesSet =  name.getTypeDesignations();
335
        Iterator<TypeDesignationBase> it = typeDesSet.iterator();
336
        String typeNameString = NOT_DESIGNATED;
337
        String statusString = null;
338
        if (it.hasNext()){
339
            NameTypeDesignation typeDes = HibernateProxyHelper.deproxy(it.next(), NameTypeDesignation.class);
340

  
341

  
342
            BotanicalName typeName =  HibernateProxyHelper.deproxy(typeDes.getTypeName(), BotanicalName.class);
343
            if (typeName != null){
344

  
345
                typeNameString = "<i>" + typeName.getNameCache() +"</i> "  + typeName.getAuthorshipCache();
346
                if (typeDes.getTypeStatus() != null){
347
                    NameTypeDesignationStatus status = HibernateProxyHelper.deproxy(typeDes.getTypeStatus(), NameTypeDesignationStatus.class);
348
                    statusString = status.getTitleCache();
349
                }
350
            }
351

  
352
        }
353
        nameRecord.put("typeName", typeNameString);
354
        StringBuffer homotypicalSynonyms = new StringBuffer();
355
        TreeMap<HomotypicalGroup,List<Synonym>> heterotypicSynonymsList = new TreeMap<HomotypicalGroup,List<Synonym>>(new HomotypicalGroupComparator());
356
        List<Synonym> homotypicSynonymsList = new ArrayList<Synonym>();
357
        StringBuffer heterotypicalSynonyms = new StringBuffer();
358
        List<Synonym> homotypicSynonyms;
359

  
360
        HomotypicalGroup group;
361
        BotanicalName synonymName;
362
        String doubtfulTitleCache;
363
        for (SynonymRelationship synRel: taxon.getSynonymRelations()){
364
            synonymName = HibernateProxyHelper.deproxy(synRel.getSynonym().getName(), BotanicalName.class);
365
            if (synRel.getType().equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())){
366
                group = HibernateProxyHelper.deproxy(synonymName.getHomotypicalGroup(), HomotypicalGroup.class);
367
                synonymName.generateFullTitle();
368
                if (synRel.getSynonym().isDoubtful()){
369
                    doubtfulTitleCache = "?" + synonymName.getFullTitleCache();
370
                    synonymName.setFullTitleCache(doubtfulTitleCache, true);
371
                }
372
                if (heterotypicSynonymsList.containsKey(group)){
373
                    heterotypicSynonymsList.get(group).add(synRel.getSynonym());
374
                }else{
375
                    homotypicSynonyms = new ArrayList<Synonym>();
376
                    homotypicSynonyms.add(synRel.getSynonym());
377
                    heterotypicSynonymsList.put(group, homotypicSynonyms);
378
                    homotypicSynonyms= null;
379
                }
380
            } else{
381
                synonymName.generateFullTitle();
382
                homotypicSynonymsList.add(synRel.getSynonym());
383
            }
384
        }
385

  
386

  
387

  
388
        String synonymString;
389
        boolean first = true;
390

  
391
        for (List<Synonym> list: heterotypicSynonymsList.values()){
392
            Collections.sort(list, new HomotypicGroupTaxonComparator(null));
393
            first = true;
394
            for (TaxonBase<?> synonym : list){
395
                if (first){
396
                    heterotypicalSynonyms.append(" <heterotypic> ");
397
                }else{
398
                    heterotypicalSynonyms.append(" <homonym> ");
399
                }
400
                first = false;
401
                synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
402
                synonymString = createSynonymNameString(synonymName);
403
                heterotypicalSynonyms.append(synonymString);
404
            }
405
        }
406

  
407
        first = true;
408
        Collections.sort(homotypicSynonymsList, new TaxonComparator());
409
        for (TaxonBase<?> synonym : homotypicSynonymsList){
410
            if (!first){
411
                homotypicalSynonyms.append(" <homonym> ");
412
            }
413
            first = false;
414
            synonymName = HibernateProxyHelper.deproxy(synonym.getName(), BotanicalName.class);
415
            synonymString = createSynonymNameString(synonymName);
416

  
417
            homotypicalSynonyms.append(synonymString);
418

  
419
        }
420

  
421
        nameRecord.put("synonyms_homotypic", homotypicalSynonyms.toString());
422
        nameRecord.put("synonyms_heterotypic", heterotypicalSynonyms.toString());
423
        nameRecord.put("status", statusString);
424

  
425
        Set<NameRelationship> nameRelations = name.getNameRelations();
426

  
427
        String relatedName = null;
428
        String nameRelType = null;
429
        if (nameRelations.size()>0){
430
            NameRelationship nameRel = nameRelations.iterator().next();
431
            BotanicalName fromName = HibernateProxyHelper.deproxy(nameRel.getFromName(), BotanicalName.class);
432
            if (fromName.equals(taxon.getName())){
433
                relatedName = nameRel.getToName().getTitleCache();
434

  
435
            }else{
436
                relatedName = nameRel.getFromName().getTitleCache();
437
            }
438
            nameRel = HibernateProxyHelper.deproxy(nameRel, NameRelationship.class);
439
            nameRelType = nameRel.getType().getTitleCache();
440
        }
441

  
442

  
443
        nameRecord.put("relatedName", relatedName);
444
        nameRecord.put("nameRelType", nameRelType);
445

  
446
        extractDescriptions(nameRecord, taxon, getNotesFeature(state), "description");
447
        return nameRecord;
448
    }
449

  
450

  
451
}
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/HomotypicalGroupComparator.java
15 15
import java.util.List;
16 16
import java.util.Set;
17 17

  
18
import eu.etaxonomy.cdm.model.taxon.HomotypicGroupTaxonComparator;
18 19
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
19 20
import eu.etaxonomy.cdm.model.taxon.TaxonComparator;
20 21

  
21 22
public class HomotypicalGroupComparator implements
22 23
		Comparator<HomotypicalGroup>, Serializable {
24
    private static final long serialVersionUID = -676465815899137107L;
23 25

  
24
	@Override
26
    @Override
25 27
	public int compare(HomotypicalGroup group1, HomotypicalGroup group2) {
26 28
		TaxonBase<?> firstTypified1 = null;
27 29
		TaxonBase<?> firstTypified2 = null;
28
		TaxonComparator taxComparator = new TaxonComparator();
30
		TaxonComparator taxComparator = new HomotypicGroupTaxonComparator(null);
29 31
		Set<TaxonNameBase> typifiedNames1 = group1.getTypifiedNames();
30 32
		List<TaxonBase> taxonBasesOfTypifiedNames = new ArrayList<TaxonBase>();
31 33
		for (TaxonNameBase<?,?> typifiedName:typifiedNames1){
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/Taxon.java
1649 1649
    }
1650 1650

  
1651 1651
    /**
1652
     * Returns the ordered list of all {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup homotypical groups}
1653
     * that contain {@link Synonym synonyms} that are heterotypic to <i>this</i> taxon.
1652
     * Returns the ordered list of all
1653
     * {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup homotypical groups}
1654
     * that contain {@link Synonym synonyms} that are heterotypic to <i>this</i> taxon.<BR>
1655
     *
1654 1656
     * {@link eu.etaxonomy.cdm.model.name.TaxonNameBase Taxon names} of heterotypic synonyms
1655 1657
     * belong to a homotypical group which cannot be the homotypical group to which the
1656
     * taxon name of <i>this</i> taxon belongs. This method returns the same
1658
     * taxon name of <i>this</i> taxon belongs.
1659
     * This method returns the same
1657 1660
     * list as the {@link #getHomotypicSynonymyGroups() getHomotypicSynonymyGroups} method
1658 1661
     * but without the homotypical group to which the taxon name of <i>this</i> taxon
1659 1662
     * belongs.<BR>
1660
     * The list returned is ordered according to the date of publication of the
1661
     * first published name within each homotypical group.
1663
     * The list returned is <B>ordered</B> according to the rules defined for
1664
     * the {@link HomotypicGroupTaxonComparator} which includes 1) grouping of
1665
     * basionym groups, 2) replaced synonym relationships, 3) publication date,
1666
     * 4) ranks and 5) alphabetical order.
1662 1667
     *
1663 1668
     * @see			#getHeterotypicSynonymyGroups()
1664 1669
     * @see			#getSynonyms()
......
1679 1684
        }
1680 1685
        List<Synonym> keyList = new ArrayList<Synonym>();
1681 1686
        keyList.addAll(map.keySet());
1682
        Collections.sort(keyList, new TaxonComparator());
1687
        Collections.sort(keyList, new HomotypicGroupTaxonComparator(null));
1683 1688

  
1684 1689
        List<HomotypicalGroup> result = new ArrayList<HomotypicalGroup>();
1685 1690
        for(Synonym synonym: keyList){
......
1690 1695
    }
1691 1696

  
1692 1697
    /**
1693
     * Retrieves the ordered list (depending on the date of publication) of
1698
     * Retrieves the ordered list (depending on the rules defined for
1699
     * the {@link HomotypicGroupTaxonComparator}) of
1694 1700
     * {@link taxon.Synonym synonyms} (according to a given reference)
1695 1701
     * the {@link TaxonNameBase taxon names} of which belong to the homotypical group.
1696 1702
     * If other names are part of the group that are not considered synonyms of
1697 1703
     * <i>this</i> taxon, then they will not be included in
1698 1704
     * the result set.
1699 1705
     *
1700
     * @param homoGroup
1706
     * @param homotypicGroup
1707
     * @see          #getHeterotypicSynonymyGroups()
1701 1708
     * @see			TaxonNameBase#getSynonyms()
1702 1709
     * @see			TaxonNameBase#getTaxa()
1703 1710
     * @see			taxon.Synonym
1704 1711
     */
1705 1712
    @Transient
1706 1713
    public List<Synonym> getSynonymsInGroup(HomotypicalGroup homotypicGroup){
1707
        return getSynonymsInGroup(homotypicGroup, new TaxonComparator());
1714
        return getSynonymsInGroup(homotypicGroup, new HomotypicGroupTaxonComparator(this));
1708 1715
    }
1709 1716

  
1710 1717
    /**
1711 1718
     * @param homotypicGroup
1712 1719
     * @param comparator
1713 1720
     * @return
1714
     * @see {@link #getSynonymsInGroup(HomotypicalGroup)}
1721
     * @see     #getSynonymsInGroup(HomotypicalGroup)
1722
     * @see     #getHeterotypicSynonymyGroups()
1715 1723
     */
1716 1724
    @Transient
1717 1725
    public List<Synonym> getSynonymsInGroup(HomotypicalGroup homotypicGroup, TaxonComparator comparator){

Also available in: Unified diff