Project

General

Profile

Download (16.9 KB) Statistics
| Branch: | Tag: | Revision:
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.stream.terms.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.ICdmBase;
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
48
 * @since 20.04.2011
49
 */
50
public abstract class DwcaRecordBase {
51

    
52
	private static final Logger logger = Logger.getLogger(DwcaRecordBase.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<>();
62
	protected Set<TermUri> knownTermFields = new HashSet<>();
63

    
64
	protected abstract void doWrite(DwcaTaxExportState state, PrintWriter writer);
65

    
66
	public void write(DwcaTaxExportState state, PrintWriter writer){
67
	    if(writer == null){
68
            writeCsv(state);
69
            return;
70
        }
71
        if (this.count == 1 && state.getConfig().isHasHeaderLines() & this.isWritingHeader == false){
72
            this.isWritingHeader = true;
73
            write(state, writer);
74
            this.isWritingHeader = false;
75
        }
76
	    doWrite(state, writer);
77
	}
78

    
79
	public void writeCsv(DwcaTaxExportState state){
80
	    state.getResult().addWarning(this.getClass().getName() + ".writeCsv() not yet implemented!");
81
	}
82

    
83
	protected abstract void registerKnownFields();
84

    
85
	protected int count;
86
	protected boolean isWritingHeader; //should better be moved in state
87
	private DwcaMetaDataRecord metaDataRecord;
88
	protected DwcaTaxExportConfigurator config;
89

    
90
	private Integer id;
91
	private UUID uuid;
92

    
93
	protected DwcaRecordBase(DwcaMetaDataRecord metaDataRecord, DwcaTaxExportConfigurator config){
94
		this.metaDataRecord = metaDataRecord;
95
		this.count = metaDataRecord.inc();
96
		this.config = config;
97
	}
98

    
99
	public void setId(Integer id) {
100
		this.id = id;
101
	}
102
	public Integer getId() {
103
		return id;
104
	}
105

    
106
	public void setUuid(UUID uuid) {
107
		this.uuid = uuid;
108
	}
109
	public UUID getUuid() {
110
		return uuid;
111
	}
112

    
113
	protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
114
		printNotes(notes, writer, addSeparator, fieldKey.getUriString());
115
	}
116
	protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, String fieldKey) {
117
		//FIXME handles annotations correctly
118
		String value = null;
119
		print(value, writer, addSeparator, fieldKey);
120
	}
121

    
122
//	protected void print(Object object, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
123
//		print(object == null ? null : object.toString(), writer, addSeparator, fieldKey);
124
//	}
125
	protected void print(DwcaId dwcaId, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
126
		print(dwcaId == null ? null : dwcaId.getId(), writer, addSeparator, fieldKey);
127
	}
128
	protected void print(UUID uuid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
129
		print(uuid == null ? null : uuid.toString(), writer, addSeparator, fieldKey);
130
	}
131
	protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
132
		print(agent, writer, addSeparator, fieldKey.getUriString());
133
	}
134
	protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, String fieldKey) {
135
		print(agent == null ? null : getAgent(agent), writer, addSeparator, fieldKey);
136
	}
137

    
138

    
139
	protected void print(Language language, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
140
		print(language, writer, addSeparator, fieldKey.getUriString());
141
	}
142
	protected void print(Language language, PrintWriter writer, boolean addSeparator, String fieldKey) {
143
		print(language == null ? null : getLanguage(language), writer, addSeparator, fieldKey);
144
	}
145
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
146
		print(lsid, writer, addSeparator, fieldKey.getUriString());
147
	}
148
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, String fieldKey) {
149
		print(lsid == null ? null : String.valueOf(lsid.toString()), writer, addSeparator, fieldKey);
150
	}
151

    
152
	protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
153
		print(rights, writer, addSeparator, fieldKey.getUriString());
154
	}
155
	protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, String fieldKey) {
156
		String rightsString = getRights(rights);
157
		print(rightsString, writer, addSeparator, fieldKey);
158
	}
159
	protected void print(URI uri, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
160
		print(uri, writer, addSeparator, fieldKey.getUriString());
161
	}
162
	protected void print(URI uri, PrintWriter writer, boolean addSeparator, String fieldKey) {
163
		print(uri == null ? null : String.valueOf(uri), writer, addSeparator, fieldKey);
164
	}
165

    
166
	protected void print(Point point, PrintWriter writer, boolean addSeparator, TermUri latitudeKey, TermUri longitudeKey) {
167
		print(point, writer, addSeparator, latitudeKey.getUriString(), longitudeKey.getUriString());
168
	}
169

    
170
	protected void print(Point point, PrintWriter writer, boolean addSeparator, String latitudeKey, String longitudeKey) {
171
		if (point == null){
172
			String toPrint = null;
173
			print(toPrint, writer, addSeparator, latitudeKey);
174
			print(toPrint, writer, addSeparator, longitudeKey);
175
		}else{
176
			String latitude = point.getLatitude().toString();
177
			String longitude = point.getLongitude().toString();
178
			print(latitude, writer, addSeparator, latitudeKey);
179
			print(longitude, writer, addSeparator, longitudeKey);
180
		}
181
	}
182
	protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
183
		print(boolValue, writer, addSeparator, fieldKey.getUriString());
184
	}
185
	protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
186
		print(boolValue == null ? null : String.valueOf(boolValue), writer, addSeparator, fieldKey);
187
	}
188

    
189
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
190
		print(intValue, writer, addSeparator, fieldKey.getUriString());
191
	}
192
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
193
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
194
	}
195

    
196
	protected void printId(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
197
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
198
	}
199
	protected void printId(UUID uuid, PrintWriter writer, boolean addSeparator, String fieldKey) {
200
		print(uuid == null ? null : String.valueOf(uuid), writer, addSeparator, fieldKey);
201
	}
202

    
203
	protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
204
		print(value, writer, addSeparator, fieldKey, null);
205
	}
206

    
207
	protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey, String defaultValue) {
208
		print(value, writer, addSeparator, fieldKey.getUriString(), defaultValue);
209
	}
210

    
211
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey) {
212
		print(value, writer, addSeparator, fieldKey, null);
213
	}
214

    
215
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey, String defaultValue) {
216
        if (isWritingHeader == true){
217
            printHeader(writer, addSeparator, fieldKey, defaultValue);
218
            return;
219
        }
220
		if (count == 1 && addSeparator == IS_NOT_FIRST){
221
			registerFieldKey(URI.create(fieldKey), defaultValue);
222
		}
223
		if (StringUtils.isBlank(defaultValue)){
224
			String strToPrint = addSeparator ? config.getFieldsTerminatedBy() : "";
225
			if (StringUtils.isNotBlank(value)){
226
				//Replace quotes by double quotes
227
				value = value.replace("\"", "\"\"");
228

    
229
				value = value.replace(config.getLinesTerminatedBy(), "\\r");
230

    
231
				//replace all line brakes according to best practices: http://code.google.com/p/gbif-ecat/wiki/BestPractices
232
				value = value.replace("\r\n", "\\r");
233
				value = value.replace("\r", "\\r");
234
				value = value.replace("\n", "\\r");
235

    
236
				strToPrint += config.getFieldsEnclosedBy() + value + config.getFieldsEnclosedBy();
237
			}
238
			writer.print(strToPrint);
239
		}
240
	}
241

    
242
	/**
243
     * @param writer
244
     * @param addSeparator
245
     * @param fieldKey
246
     */
247
    private void printHeader(PrintWriter writer, boolean addSeparator, String fieldKey, String defaultValue) {
248
        if (StringUtils.isBlank(defaultValue)){
249
            String strToPrint = addSeparator ? config.getFieldsTerminatedBy() : "";
250
            int pos = fieldKey.lastIndexOf("/");
251
            if (pos != -1){
252
                fieldKey = fieldKey.substring(pos + 1);
253
            }
254
            strToPrint += fieldKey ;
255
            writer.print(strToPrint);
256
        }
257
    }
258

    
259
    protected void line(DwcaTaxExportState state, String[] csvLine, DwcaTaxExportFile table, TermUri termUri, Set<Rights> rights) {
260
        String rightsStr = getRights(rights);
261
        if (rights != null){ line(state, csvLine, table, termUri, rightsStr);}
262
    }
263
    protected void line(DwcaTaxExportState state, String[] csvLine, DwcaTaxExportFile table, TermUri termUri, Language language) {
264
        if (language != null){ line(state, csvLine, table, termUri, getLanguage(language));}
265
    }
266
    protected void line(DwcaTaxExportState state, String[] csvLine, DwcaTaxExportFile table, TermUri termUri, DwcaId id) {
267
        if (id != null){ line(state, csvLine, table, termUri, id.getId());}
268
    }
269
    protected void line(DwcaTaxExportState state, String[] csvLine, DwcaTaxExportFile table, TermUri termUri, UUID uuid) {
270
        if (uuid != null){ line(state, csvLine, table, termUri, uuid.toString());}
271
    }
272
    protected void line(DwcaTaxExportState state, String[] csvLine, DwcaTaxExportFile table, TermUri termUri, String string) {
273
        line(state, csvLine, table, termUri, string, null);
274
    }
275
    protected void line(DwcaTaxExportState state, String[] csvLine, DwcaTaxExportFile table, TermUri termUri, String string, String defaultValue) {
276
        try {
277
            csvLine[table.getIndex(termUri)] = string;
278
            if (count == 1 && table.getIndex(termUri) != 0){
279
                registerFieldKey(termUri.getUri(), defaultValue);
280
            }
281
        } catch (Exception e) {
282
            String message = "Unhandled exception when handling " + (termUri != null ? termUri.getUriString() : "undefined") + ": " + e.getMessage();
283
            state.getResult().addException(e, message);
284
        }
285
    }
286

    
287
	protected void registerFieldKey(URI key, String defaultValue) {
288
		this.metaDataRecord.addFieldEntry(key, defaultValue);
289
	}
290

    
291

    
292
	protected String getRights(Rights rights) {
293
		if (rights == null){
294
			return "";
295
		}else{
296
			//TODO
297
			return rights.getAbbreviatedText();
298
		}
299
	}
300

    
301
	protected String getLanguage(Language language) {
302
		if (language == null){
303
			return "";
304
		}else{
305
			//TODO
306
			return language.getIso639_2();
307
		}
308
	}
309

    
310
	protected String getDate(DateTime date) {
311
		if (date == null){
312
			return "";
313
		}else{
314
		    //TODO
315
			return date.toString();
316
		}
317
	}
318

    
319
	protected String getNomStatus(NomenclaturalStatusType nomStatus) {
320
		String result = DwcaTaxExportTransformer.transformToGbifNomStatus(nomStatus);
321
		if (result == null){
322
			if (nomStatus == null){
323
				return "";
324
			}else{
325
				return nomStatus.getLabel();
326
			}
327
		}else{
328
			return result;
329
		}
330
	}
331

    
332
	protected String getNomCode(NomenclaturalCode nomCode) {
333
		if (nomCode == null){
334
			return "";
335
		}else{
336
			//TODO
337
			return nomCode.getTitleCache();
338
		}
339
	}
340

    
341
	protected String getRank(Rank rank) {
342
		String result = DwcaTaxExportTransformer.transformToGbifRank(rank);
343
		if (result == null){
344
			if (rank == null){
345
				return "";
346
			}else{
347
				return rank.getLabel();
348
			}
349
		}else{
350
			return result;
351
		}
352
	}
353

    
354
	protected String getSex(DefinedTerm sex) {
355
		String result = DwcaTaxExportTransformer.transformToGbifSex(sex);
356
		if (result == null){
357
			if (sex == null){
358
				return "";
359
			}else{
360
				return sex.getLabel();
361
			}
362
		}else{
363
			return result;
364
		}
365
	}
366

    
367
	protected String getLifeStage(DefinedTerm stage) {
368
		String result = DwcaTaxExportTransformer.transformToGbifLifeStage(stage);
369
		if (result == null){
370
			if (stage == null){
371
				return "";
372
			}else{
373
				return stage.getLabel();
374
			}
375
		}else{
376
			return result;
377
		}
378
	}
379

    
380
	protected String getOccurrenceStatus(PresenceAbsenceTerm status) {
381
		String result = DwcaTaxExportTransformer.transformToGbifOccStatus(status);
382
		if (result == null){
383
			if (status == null){
384
				return "";
385
			}else{
386
				return status.getLabel();
387
			}
388
		}else{
389
			return result;
390
		}
391
	}
392

    
393
	protected String getEstablishmentMeans(PresenceAbsenceTerm status) {
394
		String result = DwcaTaxExportTransformer.transformToGbifEstablishmentMeans(status);
395
		if (result == null){
396
			if (status == null){
397
				return "";
398
			}else{
399
				return status.getLabel();
400
			}
401
		}else{
402
			return result;
403
		}
404
	}
405

    
406

    
407

    
408
	protected String getAgent(AgentBase<?> agent) {
409
		if (agent == null){
410
			return "";
411
		}else{
412
			//TODO
413
			return agent.getTitleCache();
414
		}
415
	}
416

    
417

    
418
	protected String getFeature(Feature feature) {
419
		if (feature == null){
420
			return "";
421
		}else{
422
			//TODO
423
			return feature.getTitleCache();
424
		}
425
	}
426

    
427

    
428
	protected String getTimePeriod(TimePeriod period) {
429
		if (period == null){
430
			return "";
431
		}else{
432
			return period.toString();
433
		}
434
	}
435

    
436
	protected String getTimePeriodPart(TimePeriod period, boolean useEnd) {
437
		if (period == null){
438
			return "";
439
		}else{
440
			Partial date = useEnd? period.getEnd(): period.getStart();
441
			if (date == null){
442
				return "";
443
			}else{
444
				//TODO
445
				return date.toString();
446
			}
447
		}
448
	}
449

    
450
	protected String getRights(Set<Rights> rights) {
451
		if (rights == null || rights.isEmpty()){
452
			return null;
453
		}else{
454
			String result = null;
455
			for (Rights right: rights){
456
				//TODO usi uri if available ??
457
				String message = "Rights not yet fully implemented";
458
				logger.warn(message);
459
				result = CdmUtils.concat(COLLECTION_SEPARATOR, result, right.getAbbreviatedText());
460
			}
461
			return result;
462
		}
463
	}
464

    
465

    
466
	protected String getDesignationType(TypeDesignationStatusBase<?> status) {
467
		if (status == null){
468
			return "";
469
		}
470
		String result;
471
		if (status.isInstanceOf(SpecimenTypeDesignationStatus.class)){
472
			SpecimenTypeDesignationStatus specStatus = CdmBase.deproxy(status, SpecimenTypeDesignationStatus.class);
473
			result = DwcaTaxExportTransformer.transformSpecimenTypeStatusToGbif(specStatus);
474
		}else{
475
			NameTypeDesignationStatus nameStatus = CdmBase.deproxy(status, NameTypeDesignationStatus.class);
476
			result = DwcaTaxExportTransformer.transformNameTypeStatusToGbif(nameStatus);
477
		}
478
		if (result == null){
479
			return status.getLabel();
480
		}else{
481
			return result;
482
		}
483
	}
484

    
485

    
486

    
487

    
488
	protected void addKnownField(String string, String uri) throws URISyntaxException {
489
		this.knownFields.put(string, new URI(uri));
490
	}
491

    
492
	protected void addKnownField(TermUri term) throws URISyntaxException {
493
		this.knownTermFields.add(term);
494
	}
495

    
496

    
497
	//*************** CSV Methods ******************/
498

    
499
    /**
500
     * @param state
501
     * @param taxon
502
     * @return
503
     */
504
    protected String getId(DwcaTaxExportState state, ICdmBase cdmBase) {
505
        if (cdmBase == null){
506
            return "";
507
        }
508
        //TODO make configurable
509
        return cdmBase.getUuid().toString();
510
    }
511
}
(14-14/33)