Project

General

Profile

Download (14.7 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.csv.redlist.out;
10

    
11
import java.io.PrintWriter;
12
import java.net.URISyntaxException;
13
import java.util.ArrayList;
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.common.URI;
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
48
 * @author alex
49
 * @since 20.04.2011
50
 */
51
public abstract class CsvRecordBaseRedlist {
52

    
53
	private static final Logger logger = Logger.getLogger(CsvRecordBaseRedlist.class);
54

    
55
	//TODO Collection_SEPARATOR
56
	protected static final CharSequence COLLECTION_SEPARATOR = "@";
57
//	protected static final String FIELD_ENCLOSER = "\"";
58
	protected static final boolean IS_FIRST = false;
59
	protected static final boolean IS_NOT_FIRST = true;
60
//	protected static final String SEP = ",";
61

    
62
	protected Map<String, URI> knownFields = new HashMap<String, URI>();
63
	protected Set<TermUri> knownTermFields = new HashSet<TermUri>();
64

    
65
	public abstract void write(PrintWriter writer);
66
	protected abstract void registerKnownFields();
67

    
68
	protected int count;
69
	private CsvMetaDataRecordRedlist metaDataRecord;
70
	protected CsvTaxExportConfiguratorRedlist config;
71

    
72
	private Integer id;
73
	private UUID uuid;
74

    
75
	protected CsvRecordBaseRedlist(CsvMetaDataRecordRedlist metaDataRecord, CsvTaxExportConfiguratorRedlist config){
76
		this.metaDataRecord = metaDataRecord;
77
		this.count = metaDataRecord.inc();
78
		this.config = config;
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(CsvId 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
	protected void print(Language language, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
123
		print(language, writer, addSeparator, fieldKey.getUriString());
124
	}
125
	protected void print(Language language, PrintWriter writer, boolean addSeparator, String fieldKey) {
126
		print(language == null ? null : getLanguage(language), writer, addSeparator, fieldKey);
127
	}
128
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
129
		print(lsid, writer, addSeparator, fieldKey.getUriString());
130
	}
131
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, String fieldKey) {
132
		print(lsid == null ? null : String.valueOf(lsid.toString()), writer, addSeparator, fieldKey);
133
	}
134

    
135
	protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
136
		print(rights, writer, addSeparator, fieldKey.getUriString());
137
	}
138
	protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, String fieldKey) {
139
		String rightsString = getRights(rights);
140
		print(rightsString, writer, addSeparator, fieldKey);
141
	}
142
	protected void print(URI uri, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
143
		print(uri, writer, addSeparator, fieldKey.getUriString());
144
	}
145
	protected void print(URI uri, PrintWriter writer, boolean addSeparator, String fieldKey) {
146
		print(uri == null ? null : String.valueOf(uri), writer, addSeparator, fieldKey);
147
	}
148

    
149
	protected void print(Point point, PrintWriter writer, boolean addSeparator, TermUri latitudeKey, TermUri longitudeKey) {
150
		print(point, writer, addSeparator, latitudeKey.getUriString(), longitudeKey.getUriString());
151
	}
152

    
153
	protected void print(Point point, PrintWriter writer, boolean addSeparator, String latitudeKey, String longitudeKey) {
154
		if (point == null){
155
			String toPrint = null;
156
			print(toPrint, writer, addSeparator, latitudeKey);
157
			print(toPrint, writer, addSeparator, longitudeKey);
158
		}else{
159
			String latitude = point.getLatitude().toString();
160
			String longitude = point.getLongitude().toString();
161
			print(latitude, writer, addSeparator, latitudeKey);
162
			print(longitude, writer, addSeparator, longitudeKey);
163
		}
164
	}
165
	protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
166
		print(boolValue, writer, addSeparator, fieldKey.getUriString());
167
	}
168
	protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
169
		print(boolValue == null ? null : String.valueOf(boolValue), writer, addSeparator, fieldKey);
170
	}
171

    
172
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
173
		print(intValue, writer, addSeparator, fieldKey.getUriString());
174
	}
175
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
176
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
177
	}
178

    
179
	protected void printId(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
180
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
181
	}
182
	protected void printId(UUID uuid, PrintWriter writer, boolean addSeparator, String fieldKey) {
183
		print(uuid == null ? null : String.valueOf(uuid), writer, addSeparator, fieldKey);
184
	}
185

    
186
	protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
187
		print(value, writer, addSeparator, fieldKey, null);
188
	}
189

    
190
	protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey, String defaultValue) {
191
		print(value, writer, addSeparator, fieldKey.getUriString(), defaultValue);
192
	}
193

    
194
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey) {
195
		print(value, writer, addSeparator, fieldKey, null);
196
	}
197

    
198
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey, String defaultValue) {
199
		if (count == 1 && addSeparator == IS_NOT_FIRST){
200
			registerFieldKey(URI.create(fieldKey), defaultValue);
201
		}
202
		if (StringUtils.isBlank(defaultValue)){
203
			String strToPrint = addSeparator ? config.getFieldsTerminatedBy() : "";
204
			if (StringUtils.isNotBlank(value)){
205
				//Replace quotes by double quotes
206
				value = value.replace("\"", "\"\"");
207

    
208
				value = value.replace(config.getLinesTerminatedBy(), "\\r");
209

    
210
				//replace all line brakes according to best practices: http://code.google.com/p/gbif-ecat/wiki/BestPractices
211
				value = value.replace("\r\n", "\\r");
212
				value = value.replace("\r", "\\r");
213
				value = value.replace("\n", "\\r");
214

    
215
				strToPrint += config.getFieldsEnclosedBy() + value + config.getFieldsEnclosedBy();
216
			}
217
			writer.print(strToPrint);
218
		}
219
	}
220

    
221
	/**
222
	 * @param writer
223
	 * @param list
224
	 * @param termUri
225
	 */
226
	protected void printHeadline(PrintWriter writer, ArrayList<String> list, TermUri termUri){
227
		for(String element:list){
228
			if(list.get(0).equals(element)){
229
				print(element, writer, IS_FIRST, termUri);
230
			}
231
			else{
232
				print(element, writer, IS_NOT_FIRST, termUri);
233
			}
234
		}
235
		writer.println();
236
	}
237

    
238
	/**
239
	 * @param list
240
	 * @param termUri
241
	 * @param writer
242
	 *
243
	 * Method for concatenating strings, especially for the red list use case
244
	 */
245
	protected void print(ArrayList<String> list, TermUri termUri, PrintWriter writer){
246
		if(list == null||list.isEmpty()){
247
			print("", writer, IS_NOT_FIRST, termUri);
248
		}else{
249
			for (String element:list){
250
				if(list.get(0).equals(element)){
251
					writer.write("\t");
252
					print(element, writer, IS_FIRST, termUri);
253
					if(list.size()>1){
254
						writer.write(",");
255
						logger.info(element);
256
					}
257
				}else if(list.get(list.size()-1).equals(element)){
258
					print(element, writer, IS_FIRST, termUri);
259
				}else{
260
					print(element, writer, IS_FIRST, termUri);
261
					writer.write(",");
262
					logger.info(element);
263

    
264
				}
265
			}
266
		}
267
	}
268

    
269

    
270
	private void registerFieldKey(URI key, String defaultValue) {
271
		this.metaDataRecord.addFieldEntry(key, defaultValue);
272
	}
273

    
274

    
275
	protected String getRights(Rights rights) {
276
		if (rights == null){
277
			return "";
278
		}else{
279
			//TODO
280
			return rights.getAbbreviatedText();
281
		}
282
	}
283

    
284
	protected String getLanguage(Language language) {
285
		if (language == null){
286
			return "";
287
		}else{
288
			//TODO
289
			return language.getIso639_2();
290
		}
291
	}
292

    
293
	protected String getDate(DateTime date) {
294
		if (date == null){
295
			return "";
296
		}else{
297
			//TODO
298
			return date.toString();
299
		}
300
	}
301

    
302
	protected String getNomStatus(NomenclaturalStatusType nomStatus) {
303
		String result = CsvTaxExportTransformerRedlist.transformToGbifNomStatus(nomStatus);
304
		if (result == null){
305
			if (nomStatus == null){
306
				return "";
307
			}else{
308
				return nomStatus.getLabel();
309
			}
310
		}else{
311
			return result;
312
		}
313
	}
314

    
315
	protected String getNomCode(NomenclaturalCode nomCode) {
316
		if (nomCode == null){
317
			return "";
318
		}else{
319
			//TODO
320
			return nomCode.getTitleCache();
321
		}
322
	}
323

    
324
	protected String getRank(Rank rank) {
325
		String result = CsvTaxExportTransformerRedlist.transformToGbifRank(rank);
326
		if (result == null){
327
			if (rank == null){
328
				return "";
329
			}else{
330
				return rank.getLabel();
331
			}
332
		}else{
333
			return result;
334
		}
335
	}
336

    
337
	protected String getSex(DefinedTerm sex) {
338
		String result = CsvTaxExportTransformerRedlist.transformToGbifSex(sex);
339
		if (result == null){
340
			if (sex == null){
341
				return "";
342
			}else{
343
				return sex.getLabel();
344
			}
345
		}else{
346
			return result;
347
		}
348
	}
349

    
350
	protected String getLifeStage(DefinedTerm stage) {
351
		String result = CsvTaxExportTransformerRedlist.transformToGbifLifeStage(stage);
352
		if (result == null){
353
			if (stage == null){
354
				return "";
355
			}else{
356
				return stage.getLabel();
357
			}
358
		}else{
359
			return result;
360
		}
361
	}
362

    
363
	protected String getOccurrenceStatus(PresenceAbsenceTerm status) {
364
		String result = CsvTaxExportTransformerRedlist.transformToGbifOccStatus(status);
365
		if (result == null){
366
			if (status == null){
367
				return "";
368
			}else{
369
				return status.getLabel();
370
			}
371
		}else{
372
			return result;
373
		}
374
	}
375

    
376
	protected String getEstablishmentMeans(PresenceAbsenceTerm status) {
377
		String result = CsvTaxExportTransformerRedlist.transformToGbifEstablishmentMeans(status);
378
		if (result == null){
379
			if (status == null){
380
				return "";
381
			}else{
382
				return status.getLabel();
383
			}
384
		}else{
385
			return result;
386
		}
387
	}
388

    
389

    
390

    
391
	protected String getAgent(AgentBase<?> agent) {
392
		if (agent == null){
393
			return "";
394
		}else{
395
			//TODO
396
			return agent.getTitleCache();
397
		}
398
	}
399

    
400

    
401
	protected String getFeature(Feature feature) {
402
		if (feature == null){
403
			return "";
404
		}else{
405
			//TODO
406
			return feature.getTitleCache();
407
		}
408
	}
409

    
410

    
411
	protected String getTimePeriod(TimePeriod period) {
412
		if (period == null){
413
			return "";
414
		}else{
415
			//TODO
416
			return period.toString();
417
		}
418
	}
419

    
420
	protected String getTimePeriodPart(TimePeriod period, boolean useEnd) {
421
		if (period == null){
422
			return "";
423
		}else{
424
			Partial date = useEnd? period.getEnd(): period.getStart();
425
			if (date == null){
426
				return "";
427
			}else{
428
				//TODO
429
				return date.toString();
430
			}
431
		}
432
	}
433

    
434
	private String getRights(Set<Rights> rights) {
435
		if (rights == null || rights.isEmpty()){
436
			return null;
437
		}else{
438
			String result = null;
439
			for (Rights right: rights){
440
				//TODO usi uri if available ??
441
				String message = "Rights not yet fully implemented";
442
				logger.warn(message);
443
				result = CdmUtils.concat(COLLECTION_SEPARATOR, result, right.getAbbreviatedText());
444
			}
445
			return result;
446
		}
447
	}
448

    
449

    
450
	protected String getDesignationType(TypeDesignationStatusBase<?> status) {
451
		if (status == null){
452
			return "";
453
		}
454
		String result;
455
		if (status.isInstanceOf(SpecimenTypeDesignationStatus.class)){
456
			SpecimenTypeDesignationStatus specStatus = CdmBase.deproxy(status, SpecimenTypeDesignationStatus.class);
457
			result = CsvTaxExportTransformerRedlist.transformSpecimenTypeStatusToGbif(specStatus);
458
		}else{
459
			NameTypeDesignationStatus nameStatus = CdmBase.deproxy(status, NameTypeDesignationStatus.class);
460
			result = CsvTaxExportTransformerRedlist.transformNameTypeStatusToGbif(nameStatus);
461
		}
462
		if (result == null){
463
			return status.getLabel();
464
		}else{
465
			return result;
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) {
474
		this.knownTermFields.add(term);
475
	}
476
}
(4-4/10)