Merge branch 'release/5.45.0'
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / csv / redlist / demo / CsvDemoRecordBase.java
1 /**
2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.cdm.io.csv.redlist.demo;
10
11 import java.io.PrintWriter;
12 import java.net.URISyntaxException;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.apache.commons.lang3.StringUtils;
21 import org.apache.logging.log4j.LogManager;
22 import org.apache.logging.log4j.Logger;
23 import org.joda.time.DateTime;
24 import org.joda.time.Partial;
25
26 import eu.etaxonomy.cdm.common.CdmUtils;
27 import eu.etaxonomy.cdm.common.URI;
28 import eu.etaxonomy.cdm.io.stream.terms.TermUri;
29 import eu.etaxonomy.cdm.model.agent.AgentBase;
30 import eu.etaxonomy.cdm.model.common.Annotation;
31 import eu.etaxonomy.cdm.model.common.CdmBase;
32 import eu.etaxonomy.cdm.model.common.LSID;
33 import eu.etaxonomy.cdm.model.common.Language;
34 import eu.etaxonomy.cdm.model.common.TimePeriod;
35 import eu.etaxonomy.cdm.model.description.Feature;
36 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
37 import eu.etaxonomy.cdm.model.location.Point;
38 import eu.etaxonomy.cdm.model.media.Rights;
39 import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
40 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
41 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
42 import eu.etaxonomy.cdm.model.name.Rank;
43 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
44 import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
45 import eu.etaxonomy.cdm.model.term.DefinedTerm;
46
47 /**
48 * @author a.mueller, a.oppermann
49 * @since 20.04.2011
50 */
51 public abstract class CsvDemoRecordBase {
52
53 private static final Logger logger = LogManager.getLogger();
54
55 //TODO Collection_SEPARATOR
56 protected static final CharSequence COLLECTION_SEPARATOR = "@";
57 // protected static final String FIELD_ENCLOSER = "\"";
58 protected static final boolean IS_FIRST = false;
59 protected static final boolean IS_NOT_FIRST = true;
60 // protected static final String SEP = ",";
61
62 protected Map<String, URI> knownFields = new HashMap<String, URI>();
63 protected Set<TermUri> knownTermFields = new HashSet<TermUri>();
64
65 public abstract void write(PrintWriter writer);
66 protected abstract void registerKnownFields();
67
68 protected int count;
69 private final CsvDemoMetaDataRecord metaDataRecord;
70 protected CsvDemoExportConfigurator config;
71
72 private Integer id;
73 private UUID uuid;
74
75 protected CsvDemoRecordBase(CsvDemoMetaDataRecord metaDataRecord, CsvDemoExportConfigurator config){
76 this.metaDataRecord = metaDataRecord;
77 this.count = metaDataRecord.inc();
78 this.config = config;
79 }
80
81 public void setId(Integer id) {
82 this.id = id;
83 }
84
85 public Integer getId() {
86 return id;
87 }
88
89 public void setUuid(UUID uuid) {
90 this.uuid = uuid;
91 }
92
93 /* public UUID getUuid() {
94 return uuid;
95 }*/
96
97 protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
98 printNotes(notes, writer, addSeparator, fieldKey.getUriString());
99 }
100 protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, String fieldKey) {
101 //FIXME handles annotations correctly
102 String value = null;
103 print(value, writer, addSeparator, fieldKey);
104 }
105
106 // protected void print(Object object, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
107 // print(object == null ? null : object.toString(), writer, addSeparator, fieldKey);
108 // }
109 protected void print(CsvDemoId dwcaId, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
110 print(dwcaId == null ? null : dwcaId.getId(), writer, addSeparator, fieldKey);
111 }
112 protected void print(UUID uuid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
113 print(uuid == null ? null : uuid.toString(), writer, addSeparator, fieldKey);
114 }
115 protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
116 print(agent, writer, addSeparator, fieldKey.getUriString());
117 }
118 protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, String fieldKey) {
119 print(agent == null ? null : getAgent(agent), writer, addSeparator, fieldKey);
120 }
121
122 protected void print(Language language, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
123 print(language, writer, addSeparator, fieldKey.getUriString());
124 }
125 protected void print(Language language, PrintWriter writer, boolean addSeparator, String fieldKey) {
126 print(language == null ? null : getLanguage(language), writer, addSeparator, fieldKey);
127 }
128 protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
129 print(lsid, writer, addSeparator, fieldKey.getUriString());
130 }
131 protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, String fieldKey) {
132 print(lsid == null ? null : String.valueOf(lsid.toString()), writer, addSeparator, fieldKey);
133 }
134
135 protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
136 print(rights, writer, addSeparator, fieldKey.getUriString());
137 }
138 protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, String fieldKey) {
139 String rightsString = getRights(rights);
140 print(rightsString, writer, addSeparator, fieldKey);
141 }
142 protected void print(URI uri, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
143 print(uri, writer, addSeparator, fieldKey.getUriString());
144 }
145 protected void print(URI uri, PrintWriter writer, boolean addSeparator, String fieldKey) {
146 print(uri == null ? null : String.valueOf(uri), writer, addSeparator, fieldKey);
147 }
148
149 protected void print(Point point, PrintWriter writer, boolean addSeparator, TermUri latitudeKey, TermUri longitudeKey) {
150 print(point, writer, addSeparator, latitudeKey.getUriString(), longitudeKey.getUriString());
151 }
152
153 protected void print(Point point, PrintWriter writer, boolean addSeparator, String latitudeKey, String longitudeKey) {
154 if (point == null){
155 String toPrint = null;
156 print(toPrint, writer, addSeparator, latitudeKey);
157 print(toPrint, writer, addSeparator, longitudeKey);
158 }else{
159 String latitude = point.getLatitude().toString();
160 String longitude = point.getLongitude().toString();
161 print(latitude, writer, addSeparator, latitudeKey);
162 print(longitude, writer, addSeparator, longitudeKey);
163 }
164 }
165 protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
166 print(boolValue, writer, addSeparator, fieldKey.getUriString());
167 }
168 protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
169 print(boolValue == null ? null : String.valueOf(boolValue), writer, addSeparator, fieldKey);
170 }
171
172 protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
173 print(intValue, writer, addSeparator, fieldKey.getUriString());
174 }
175 protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
176 print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
177 }
178
179 protected void printId(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
180 print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
181 }
182 protected void printId(UUID uuid, PrintWriter writer, boolean addSeparator, String fieldKey) {
183 print(uuid == null ? null : String.valueOf(uuid), writer, addSeparator, fieldKey);
184 }
185
186 protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
187 print(value, writer, addSeparator, fieldKey, null);
188 }
189
190 protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey, String defaultValue) {
191 print(value, writer, addSeparator, fieldKey.getUriString(), defaultValue);
192 }
193
194 protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey) {
195 print(value, writer, addSeparator, fieldKey, null);
196 }
197
198 protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey, String defaultValue) {
199 if (count == 1 && addSeparator == IS_NOT_FIRST){
200 registerFieldKey(URI.create(fieldKey), defaultValue);
201 }
202 if (StringUtils.isBlank(defaultValue)){
203 String strToPrint = addSeparator ? config.getFieldsTerminatedBy() : "";
204 if (StringUtils.isNotBlank(value)){
205 //Replace quotes by double quotes
206 value = value.replace("\"", "\"\"");
207
208 value = value.replace(config.getLinesTerminatedBy(), "\\r");
209
210 //replace all line brakes according to best practices: http://code.google.com/p/gbif-ecat/wiki/BestPractices
211 value = value.replace("\r\n", "\\r");
212 value = value.replace("\r", "\\r");
213 value = value.replace("\n", "\\r");
214
215 strToPrint += config.getFieldsEnclosedBy() + value + config.getFieldsEnclosedBy();
216 }
217 writer.print(strToPrint);
218 }
219 }
220
221 /**
222 * @param writer
223 * @param list
224 * @param termUri
225 */
226 protected void printHeadline(PrintWriter writer, ArrayList<String> list, TermUri termUri){
227 for(String element:list){
228 if(list.get(0).equals(element)){
229 print(element, writer, IS_FIRST, termUri);
230 }
231 else{
232 print(element, writer, IS_NOT_FIRST, termUri);
233 }
234 }
235 writer.println();
236 }
237
238 /**
239 * @param list
240 * @param termUri
241 * @param writer
242 *
243 * Method for concatenating strings, especially for the red list use case
244 */
245 protected void print(ArrayList<String> list, TermUri termUri, PrintWriter writer){
246 if(list == null||list.isEmpty()){
247 print("", writer, IS_NOT_FIRST, termUri);
248 }else{
249 for (String element:list){
250 if(list.get(0).equals(element)){
251 writer.write("\t");
252 print(element, writer, IS_FIRST, termUri);
253 if(list.size()>1){
254 writer.write(",");
255 logger.info(element);
256 }
257 }else if(list.get(list.size()-1).equals(element)){
258 print(element, writer, IS_FIRST, termUri);
259 }else{
260 print(element, writer, IS_FIRST, termUri);
261 writer.write(",");
262 logger.info(element);
263
264 }
265 }
266 }
267 }
268
269
270 private void registerFieldKey(URI key, String defaultValue) {
271 this.metaDataRecord.addFieldEntry(key, defaultValue);
272 }
273
274
275 protected String getRights(Rights rights) {
276 if (rights == null){
277 return "";
278 }else{
279 //TODO
280 return rights.getAbbreviatedText();
281 }
282 }
283
284 protected String getLanguage(Language language) {
285 if (language == null){
286 return "";
287 }else{
288 //TODO
289 return language.getIso639_2();
290 }
291 }
292
293 protected String getDate(DateTime date) {
294 if (date == null){
295 return "";
296 }else{
297 //TODO
298 return date.toString();
299 }
300 }
301
302 protected String getNomStatus(NomenclaturalStatusType nomStatus) {
303 String result = CsvDemoExportTransformer.transformToGbifNomStatus(nomStatus);
304 if (result == null){
305 if (nomStatus == null){
306 return "";
307 }else{
308 return nomStatus.getLabel();
309 }
310 }else{
311 return result;
312 }
313 }
314
315 protected String getNomCode(NomenclaturalCode nomCode) {
316 if (nomCode == null){
317 return "";
318 }else{
319 //TODO
320 return nomCode.getTitleCache();
321 }
322 }
323
324 protected String getRank(Rank rank) {
325 String result = CsvDemoExportTransformer.transformToGbifRank(rank);
326 if (result == null){
327 if (rank == null){
328 return "";
329 }else{
330 return rank.getLabel();
331 }
332 }else{
333 return result;
334 }
335 }
336
337 protected String getSex(DefinedTerm sex) {
338 String result = CsvDemoExportTransformer.transformToGbifSex(sex);
339 if (result == null){
340 if (sex == null){
341 return "";
342 }else{
343 return sex.getLabel();
344 }
345 }else{
346 return result;
347 }
348 }
349
350 protected String getLifeStage(DefinedTerm stage) {
351 String result = CsvDemoExportTransformer.transformToGbifLifeStage(stage);
352 if (result == null){
353 if (stage == null){
354 return "";
355 }else{
356 return stage.getLabel();
357 }
358 }else{
359 return result;
360 }
361 }
362
363 protected String getOccurrenceStatus(PresenceAbsenceTerm status) {
364 String result = CsvDemoExportTransformer.transformToGbifOccStatus(status);
365 if (result == null){
366 if (status == null){
367 return "";
368 }else{
369 return status.getLabel();
370 }
371 }else{
372 return result;
373 }
374 }
375
376 protected String getEstablishmentMeans(PresenceAbsenceTerm status) {
377 String result = CsvDemoExportTransformer.transformToGbifEstablishmentMeans(status);
378 if (result == null){
379 if (status == null){
380 return "";
381 }else{
382 return status.getLabel();
383 }
384 }else{
385 return result;
386 }
387 }
388
389
390
391 protected String getAgent(AgentBase<?> agent) {
392 if (agent == null){
393 return "";
394 }else{
395 //TODO
396 return agent.getTitleCache();
397 }
398 }
399
400
401 protected String getFeature(Feature feature) {
402 if (feature == null){
403 return "";
404 }else{
405 //TODO
406 return feature.getTitleCache();
407 }
408 }
409
410
411 protected String getTimePeriod(TimePeriod period) {
412 if (period == null){
413 return "";
414 }else{
415 //TODO
416 return period.toString();
417 }
418 }
419
420 protected String getTimePeriodPart(TimePeriod period, boolean useEnd) {
421 if (period == null){
422 return "";
423 }else{
424 Partial date = useEnd? period.getEnd(): period.getStart();
425 if (date == null){
426 return "";
427 }else{
428 //TODO
429 return date.toString();
430 }
431 }
432 }
433
434 private String getRights(Set<Rights> rights) {
435 if (rights == null || rights.isEmpty()){
436 return null;
437 }else{
438 String result = null;
439 for (Rights right: rights){
440 //TODO usi uri if available ??
441 String message = "Rights not yet fully implemented";
442 logger.warn(message);
443 result = CdmUtils.concat(COLLECTION_SEPARATOR, result, right.getAbbreviatedText());
444 }
445 return result;
446 }
447 }
448
449
450 protected String getDesignationType(TypeDesignationStatusBase<?> status) {
451 if (status == null){
452 return "";
453 }
454 String result;
455 if (status.isInstanceOf(SpecimenTypeDesignationStatus.class)){
456 SpecimenTypeDesignationStatus specStatus = CdmBase.deproxy(status, SpecimenTypeDesignationStatus.class);
457 result = CsvDemoExportTransformer.transformSpecimenTypeStatusToGbif(specStatus);
458 }else{
459 NameTypeDesignationStatus nameStatus = CdmBase.deproxy(status, NameTypeDesignationStatus.class);
460 result = CsvDemoExportTransformer.transformNameTypeStatusToGbif(nameStatus);
461 }
462 if (result == null){
463 return status.getLabel();
464 }else{
465 return result;
466 }
467 }
468
469
470 protected void addKnownField(String string, String uri) throws URISyntaxException {
471 this.knownFields.put(string, new URI(uri));
472 }
473
474 protected void addKnownField(TermUri term) throws URISyntaxException {
475 this.knownTermFields.add(term);
476 }
477 }