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