Merge branch 'release/4.5.0'
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / dwca / out / DwcaRecordBase.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.dwca.out;
10
11 import java.io.PrintWriter;
12 import java.net.URI;
13 import java.net.URISyntaxException;
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.lang.StringUtils;
21 import org.apache.log4j.Logger;
22 import org.joda.time.DateTime;
23 import org.joda.time.Partial;
24
25 import eu.etaxonomy.cdm.common.CdmUtils;
26 import eu.etaxonomy.cdm.io.dwca.TermUri;
27 import eu.etaxonomy.cdm.model.agent.AgentBase;
28 import eu.etaxonomy.cdm.model.common.Annotation;
29 import eu.etaxonomy.cdm.model.common.CdmBase;
30 import eu.etaxonomy.cdm.model.common.DefinedTerm;
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
45 /**
46 * @author a.mueller
47 * @date 20.04.2011
48 *
49 */
50 public abstract class DwcaRecordBase {
51 private static final Logger logger = Logger.getLogger(DwcaRecordBase.class);
52
53 //TODO Collection_SEPARATOR
54 protected static final CharSequence COLLECTION_SEPARATOR = "@";
55 // protected static final String FIELD_ENCLOSER = "\"";
56 protected static final boolean IS_FIRST = false;
57 protected static final boolean IS_NOT_FIRST = true;
58 // protected static final String SEP = ",";
59
60 protected Map<String, URI> knownFields = new HashMap<String, URI>();
61 protected Set<TermUri> knownTermFields = new HashSet<TermUri>();
62
63 public abstract void write(PrintWriter writer);
64 protected abstract void registerKnownFields();
65
66 protected int count;
67 private DwcaMetaDataRecord metaDataRecord;
68 protected DwcaTaxExportConfigurator config;
69
70 private Integer id;
71 private UUID uuid;
72
73
74 protected DwcaRecordBase(DwcaMetaDataRecord metaDataRecord, DwcaTaxExportConfigurator config){
75 this.metaDataRecord = metaDataRecord;
76 this.count = metaDataRecord.inc();
77 this.config = config;
78 }
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(DwcaId 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
123 protected void print(Language language, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
124 print(language, writer, addSeparator, fieldKey.getUriString());
125 }
126 protected void print(Language language, PrintWriter writer, boolean addSeparator, String fieldKey) {
127 print(language == null ? null : getLanguage(language), writer, addSeparator, fieldKey);
128 }
129 protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
130 print(lsid, writer, addSeparator, fieldKey.getUriString());
131 }
132 protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, String fieldKey) {
133 print(lsid == null ? null : String.valueOf(lsid.toString()), writer, addSeparator, fieldKey);
134 }
135
136 protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
137 print(rights, writer, addSeparator, fieldKey.getUriString());
138 }
139 protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, String fieldKey) {
140 String rightsString = getRights(rights);
141 print(rightsString, writer, addSeparator, fieldKey);
142 }
143 protected void print(URI uri, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
144 print(uri, writer, addSeparator, fieldKey.getUriString());
145 }
146 protected void print(URI uri, PrintWriter writer, boolean addSeparator, String fieldKey) {
147 print(uri == null ? null : String.valueOf(uri), writer, addSeparator, fieldKey);
148 }
149
150 protected void print(Point point, PrintWriter writer, boolean addSeparator, TermUri latitudeKey, TermUri longitudeKey) {
151 print(point, writer, addSeparator, latitudeKey.getUriString(), longitudeKey.getUriString());
152 }
153
154 protected void print(Point point, PrintWriter writer, boolean addSeparator, String latitudeKey, String longitudeKey) {
155 if (point == null){
156 String toPrint = null;
157 print(toPrint, writer, addSeparator, latitudeKey);
158 print(toPrint, writer, addSeparator, longitudeKey);
159 }else{
160 String latitude = point.getLatitude().toString();
161 String longitude = point.getLongitude().toString();
162 print(latitude, writer, addSeparator, latitudeKey);
163 print(longitude, writer, addSeparator, longitudeKey);
164 }
165 }
166 protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
167 print(boolValue, writer, addSeparator, fieldKey.getUriString());
168 }
169 protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
170 print(boolValue == null ? null : String.valueOf(boolValue), writer, addSeparator, fieldKey);
171 }
172
173 protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
174 print(intValue, writer, addSeparator, fieldKey.getUriString());
175 }
176 protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
177 print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
178 }
179
180 protected void printId(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
181 print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
182 }
183 protected void printId(UUID uuid, PrintWriter writer, boolean addSeparator, String fieldKey) {
184 print(uuid == null ? null : String.valueOf(uuid), writer, addSeparator, fieldKey);
185 }
186
187 protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
188 print(value, writer, addSeparator, fieldKey, null);
189 }
190
191 protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey, String defaultValue) {
192 print(value, writer, addSeparator, fieldKey.getUriString(), defaultValue);
193 }
194
195 protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey) {
196 print(value, writer, addSeparator, fieldKey, null);
197 }
198
199 protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey, String defaultValue) {
200 if (count == 1 && addSeparator == IS_NOT_FIRST){
201 registerFieldKey(URI.create(fieldKey), defaultValue);
202 }
203 if (StringUtils.isBlank(defaultValue)){
204 String strToPrint = addSeparator ? config.getFieldsTerminatedBy() : "";
205 if (StringUtils.isNotBlank(value)){
206 //Replace quotes by double quotes
207 value = value.replace("\"", "\"\"");
208
209 value = value.replace(config.getLinesTerminatedBy(), "\\r");
210
211 //replace all line brakes according to best practices: http://code.google.com/p/gbif-ecat/wiki/BestPractices
212 value = value.replace("\r\n", "\\r");
213 value = value.replace("\r", "\\r");
214 value = value.replace("\n", "\\r");
215
216 strToPrint += config.getFieldsEnclosedBy() + value + config.getFieldsEnclosedBy();
217 }
218 writer.print(strToPrint);
219 }
220 }
221
222 private void registerFieldKey(URI key, String defaultValue) {
223 this.metaDataRecord.addFieldEntry(key, defaultValue);
224 }
225
226
227 protected String getRights(Rights rights) {
228 if (rights == null){
229 return "";
230 }else{
231 //TODO
232 return rights.getAbbreviatedText();
233 }
234 }
235
236 protected String getLanguage(Language language) {
237 if (language == null){
238 return "";
239 }else{
240 //TODO
241 return language.getIso639_2();
242 }
243 }
244
245 protected String getDate(DateTime date) {
246 if (date == null){
247 return "";
248 }else{
249 //TODO
250 return date.toString();
251 }
252 }
253
254 protected String getNomStatus(NomenclaturalStatusType nomStatus) {
255 String result = DwcaTaxExportTransformer.transformToGbifNomStatus(nomStatus);
256 if (result == null){
257 if (nomStatus == null){
258 return "";
259 }else{
260 return nomStatus.getLabel();
261 }
262 }else{
263 return result;
264 }
265 }
266
267 protected String getNomCode(NomenclaturalCode nomCode) {
268 if (nomCode == null){
269 return "";
270 }else{
271 //TODO
272 return nomCode.getTitleCache();
273 }
274 }
275
276 protected String getRank(Rank rank) {
277 String result = DwcaTaxExportTransformer.transformToGbifRank(rank);
278 if (result == null){
279 if (rank == null){
280 return "";
281 }else{
282 return rank.getLabel();
283 }
284 }else{
285 return result;
286 }
287 }
288
289 protected String getSex(DefinedTerm sex) {
290 String result = DwcaTaxExportTransformer.transformToGbifSex(sex);
291 if (result == null){
292 if (sex == null){
293 return "";
294 }else{
295 return sex.getLabel();
296 }
297 }else{
298 return result;
299 }
300 }
301
302 protected String getLifeStage(DefinedTerm stage) {
303 String result = DwcaTaxExportTransformer.transformToGbifLifeStage(stage);
304 if (result == null){
305 if (stage == null){
306 return "";
307 }else{
308 return stage.getLabel();
309 }
310 }else{
311 return result;
312 }
313 }
314
315 protected String getOccurrenceStatus(PresenceAbsenceTerm status) {
316 String result = DwcaTaxExportTransformer.transformToGbifOccStatus(status);
317 if (result == null){
318 if (status == null){
319 return "";
320 }else{
321 return status.getLabel();
322 }
323 }else{
324 return result;
325 }
326 }
327
328 protected String getEstablishmentMeans(PresenceAbsenceTerm status) {
329 String result = DwcaTaxExportTransformer.transformToGbifEstablishmentMeans(status);
330 if (result == null){
331 if (status == null){
332 return "";
333 }else{
334 return status.getLabel();
335 }
336 }else{
337 return result;
338 }
339 }
340
341
342
343 protected String getAgent(AgentBase<?> agent) {
344 if (agent == null){
345 return "";
346 }else{
347 //TODO
348 return agent.getTitleCache();
349 }
350 }
351
352
353 protected String getFeature(Feature feature) {
354 if (feature == null){
355 return "";
356 }else{
357 //TODO
358 return feature.getTitleCache();
359 }
360 }
361
362
363 protected String getTimePeriod(TimePeriod period) {
364 if (period == null){
365 return "";
366 }else{
367 //TODO
368 return period.toString();
369 }
370 }
371
372 protected String getTimePeriodPart(TimePeriod period, boolean useEnd) {
373 if (period == null){
374 return "";
375 }else{
376 Partial date = useEnd? period.getEnd(): period.getStart();
377 if (date == null){
378 return "";
379 }else{
380 //TODO
381 return date.toString();
382 }
383 }
384 }
385
386 private String getRights(Set<Rights> rights) {
387 if (rights == null || rights.isEmpty()){
388 return null;
389 }else{
390 String result = null;
391 for (Rights right: rights){
392 //TODO usi uri if available ??
393 String message = "Rights not yet fully implemented";
394 logger.warn(message);
395 result = CdmUtils.concat(COLLECTION_SEPARATOR, result, right.getAbbreviatedText());
396 }
397 return result;
398 }
399 }
400
401
402 protected String getDesignationType(TypeDesignationStatusBase<?> status) {
403 if (status == null){
404 return "";
405 }
406 String result;
407 if (status.isInstanceOf(SpecimenTypeDesignationStatus.class)){
408 SpecimenTypeDesignationStatus specStatus = CdmBase.deproxy(status, SpecimenTypeDesignationStatus.class);
409 result = DwcaTaxExportTransformer.transformSpecimenTypeStatusToGbif(specStatus);
410 }else{
411 NameTypeDesignationStatus nameStatus = CdmBase.deproxy(status, NameTypeDesignationStatus.class);
412 result = DwcaTaxExportTransformer.transformNameTypeStatusToGbif(nameStatus);
413 }
414 if (result == null){
415 return status.getLabel();
416 }else{
417 return result;
418 }
419 }
420
421
422 protected void addKnownField(String string, String uri) throws URISyntaxException {
423 this.knownFields.put(string, new URI(uri));
424 }
425
426 protected void addKnownField(TermUri term) throws URISyntaxException {
427 this.knownTermFields.add(term);
428 }
429 }