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 |
}
|
Apply HomotypicGroupTaxonComparator to all existing uses of old
TaxonComparator #3338