Project

General

Profile

Download (13.4 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.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
}
(13-13/29)