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.DefinedTerm;
31
import eu.etaxonomy.cdm.model.common.ICdmBase;
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

    
46
/**
47
 * @author a.mueller
48
 \* @since 20.04.2011
49
 *
50
 */
51
public abstract class DwcaRecordBase {
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

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

    
84

    
85
	protected abstract void registerKnownFields();
86

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

    
92
	private Integer id;
93
	private UUID uuid;
94

    
95

    
96
	protected DwcaRecordBase(DwcaMetaDataRecord metaDataRecord, DwcaTaxExportConfigurator config){
97
		this.metaDataRecord = metaDataRecord;
98
		this.count = metaDataRecord.inc();
99
		this.config = config;
100
	}
101

    
102

    
103
	public void setId(Integer id) {
104
		this.id = id;
105
	}
106
	public Integer getId() {
107
		return id;
108
	}
109

    
110
	public void setUuid(UUID uuid) {
111
		this.uuid = uuid;
112
	}
113
	public UUID getUuid() {
114
		return uuid;
115
	}
116

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

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

    
142

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

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

    
170
	protected void print(Point point, PrintWriter writer, boolean addSeparator, TermUri latitudeKey, TermUri longitudeKey) {
171
		print(point, writer, addSeparator, latitudeKey.getUriString(), longitudeKey.getUriString());
172
	}
173

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

    
193
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
194
		print(intValue, writer, addSeparator, fieldKey.getUriString());
195
	}
196
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
197
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
198
	}
199

    
200
	protected void printId(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
201
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
202
	}
203
	protected void printId(UUID uuid, PrintWriter writer, boolean addSeparator, String fieldKey) {
204
		print(uuid == null ? null : String.valueOf(uuid), writer, addSeparator, fieldKey);
205
	}
206

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

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

    
215
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey) {
216
		print(value, writer, addSeparator, fieldKey, null);
217
	}
218

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

    
233
				value = value.replace(config.getLinesTerminatedBy(), "\\r");
234

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

    
240
				strToPrint += config.getFieldsEnclosedBy() + value + config.getFieldsEnclosedBy();
241
			}
242
			writer.print(strToPrint);
243
		}
244
	}
245

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

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

    
291
	protected void registerFieldKey(URI key, String defaultValue) {
292
		this.metaDataRecord.addFieldEntry(key, defaultValue);
293
	}
294

    
295

    
296
	protected String getRights(Rights rights) {
297
		if (rights == null){
298
			return "";
299
		}else{
300
			//TODO
301
			return rights.getAbbreviatedText();
302
		}
303
	}
304

    
305
	protected String getLanguage(Language language) {
306
		if (language == null){
307
			return "";
308
		}else{
309
			//TODO
310
			return language.getIso639_2();
311
		}
312
	}
313

    
314
	protected String getDate(DateTime date) {
315
		if (date == null){
316
			return "";
317
		}else{
318
			//TODO
319
			return date.toString();
320
		}
321
	}
322

    
323
	protected String getNomStatus(NomenclaturalStatusType nomStatus) {
324
		String result = DwcaTaxExportTransformer.transformToGbifNomStatus(nomStatus);
325
		if (result == null){
326
			if (nomStatus == null){
327
				return "";
328
			}else{
329
				return nomStatus.getLabel();
330
			}
331
		}else{
332
			return result;
333
		}
334
	}
335

    
336
	protected String getNomCode(NomenclaturalCode nomCode) {
337
		if (nomCode == null){
338
			return "";
339
		}else{
340
			//TODO
341
			return nomCode.getTitleCache();
342
		}
343
	}
344

    
345
	protected String getRank(Rank rank) {
346
		String result = DwcaTaxExportTransformer.transformToGbifRank(rank);
347
		if (result == null){
348
			if (rank == null){
349
				return "";
350
			}else{
351
				return rank.getLabel();
352
			}
353
		}else{
354
			return result;
355
		}
356
	}
357

    
358
	protected String getSex(DefinedTerm sex) {
359
		String result = DwcaTaxExportTransformer.transformToGbifSex(sex);
360
		if (result == null){
361
			if (sex == null){
362
				return "";
363
			}else{
364
				return sex.getLabel();
365
			}
366
		}else{
367
			return result;
368
		}
369
	}
370

    
371
	protected String getLifeStage(DefinedTerm stage) {
372
		String result = DwcaTaxExportTransformer.transformToGbifLifeStage(stage);
373
		if (result == null){
374
			if (stage == null){
375
				return "";
376
			}else{
377
				return stage.getLabel();
378
			}
379
		}else{
380
			return result;
381
		}
382
	}
383

    
384
	protected String getOccurrenceStatus(PresenceAbsenceTerm status) {
385
		String result = DwcaTaxExportTransformer.transformToGbifOccStatus(status);
386
		if (result == null){
387
			if (status == null){
388
				return "";
389
			}else{
390
				return status.getLabel();
391
			}
392
		}else{
393
			return result;
394
		}
395
	}
396

    
397
	protected String getEstablishmentMeans(PresenceAbsenceTerm status) {
398
		String result = DwcaTaxExportTransformer.transformToGbifEstablishmentMeans(status);
399
		if (result == null){
400
			if (status == null){
401
				return "";
402
			}else{
403
				return status.getLabel();
404
			}
405
		}else{
406
			return result;
407
		}
408
	}
409

    
410

    
411

    
412
	protected String getAgent(AgentBase<?> agent) {
413
		if (agent == null){
414
			return "";
415
		}else{
416
			//TODO
417
			return agent.getTitleCache();
418
		}
419
	}
420

    
421

    
422
	protected String getFeature(Feature feature) {
423
		if (feature == null){
424
			return "";
425
		}else{
426
			//TODO
427
			return feature.getTitleCache();
428
		}
429
	}
430

    
431

    
432
	protected String getTimePeriod(TimePeriod period) {
433
		if (period == null){
434
			return "";
435
		}else{
436
			//TODO
437
			return period.toString();
438
		}
439
	}
440

    
441
	protected String getTimePeriodPart(TimePeriod period, boolean useEnd) {
442
		if (period == null){
443
			return "";
444
		}else{
445
			Partial date = useEnd? period.getEnd(): period.getStart();
446
			if (date == null){
447
				return "";
448
			}else{
449
				//TODO
450
				return date.toString();
451
			}
452
		}
453
	}
454

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

    
470

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

    
490

    
491

    
492

    
493
	protected void addKnownField(String string, String uri) throws URISyntaxException {
494
		this.knownFields.put(string, new URI(uri));
495
	}
496

    
497
	protected void addKnownField(TermUri term) throws URISyntaxException {
498
		this.knownTermFields.add(term);
499
	}
500

    
501

    
502
	//*************** CSV Methods ******************/
503

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