Project

General

Profile

Download (14.8 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2009 EDIT
4
* European Distributed Institute of Taxonomy 
5
* http://www.e-taxonomy.eu
6
* 
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10
package eu.etaxonomy.cdm.io.csv.redlist.out;
11

    
12
import java.io.PrintWriter;
13
import java.net.URI;
14
import java.net.URISyntaxException;
15
import java.util.ArrayList;
16
import java.util.HashMap;
17
import java.util.HashSet;
18
import java.util.Map;
19
import java.util.Set;
20
import java.util.UUID;
21

    
22
import org.apache.commons.lang.StringUtils;
23
import org.apache.log4j.Logger;
24
import org.joda.time.DateTime;
25
import org.joda.time.Partial;
26

    
27
import eu.etaxonomy.cdm.common.CdmUtils;
28
import eu.etaxonomy.cdm.io.dwca.TermUri;
29
import eu.etaxonomy.cdm.model.agent.AgentBase;
30
import eu.etaxonomy.cdm.model.common.Annotation;
31
import eu.etaxonomy.cdm.model.common.CdmBase;
32
import eu.etaxonomy.cdm.model.common.DefinedTerm;
33
import eu.etaxonomy.cdm.model.common.LSID;
34
import eu.etaxonomy.cdm.model.common.Language;
35
import eu.etaxonomy.cdm.model.common.TimePeriod;
36
import eu.etaxonomy.cdm.model.description.Feature;
37
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
38
import eu.etaxonomy.cdm.model.location.Point;
39
import eu.etaxonomy.cdm.model.media.Rights;
40
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
41
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
42
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
43
import eu.etaxonomy.cdm.model.name.Rank;
44
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
45
import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
46

    
47
/**
48
 * @author a.mueller
49
 * @date 20.04.2011
50
 *
51
 */
52
/**
53
 * @author alex
54
 *
55
 */
56
public abstract class CsvRecordBaseRedlist {
57
	private static final Logger logger = Logger.getLogger(CsvRecordBaseRedlist.class);
58

    
59
	//TODO Collection_SEPARATOR
60
	protected static final CharSequence COLLECTION_SEPARATOR = "@";
61
//	protected static final String FIELD_ENCLOSER = "\"";
62
	protected static final boolean IS_FIRST = false;
63
	protected static final boolean IS_NOT_FIRST = true;
64
//	protected static final String SEP = ",";
65
	
66
	protected Map<String, URI> knownFields = new HashMap<String, URI>();
67
	protected Set<TermUri> knownTermFields = new HashSet<TermUri>();
68
	
69
	public abstract void write(PrintWriter writer);
70
	protected abstract void registerKnownFields();
71
	
72
	protected int count;
73
	private CsvMetaDataRecordRedlist metaDataRecord;
74
	protected CsvTaxExportConfiguratorRedlist config;
75

    
76
	private Integer id;
77
	private UUID uuid;
78

    
79
	
80
	protected CsvRecordBaseRedlist(CsvMetaDataRecordRedlist metaDataRecord, CsvTaxExportConfiguratorRedlist config){
81
		this.metaDataRecord = metaDataRecord;
82
		this.count = metaDataRecord.inc();
83
		this.config = config;
84
	}
85
	
86
	
87
	public void setId(Integer id) {
88
		this.id = id;
89
	}
90

    
91
	public Integer getId() {
92
		return id;
93
	}
94

    
95
	public void setUuid(UUID uuid) {
96
		this.uuid = uuid;
97
	}
98

    
99
	public UUID getUuid() {
100
		return uuid;
101
	}
102

    
103
	protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
104
		printNotes(notes, writer, addSeparator, fieldKey.getUriString());
105
	}
106
	protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, String fieldKey) {
107
		//FIXME handles annotations correctly
108
		String value = null;
109
		print(value, writer, addSeparator, fieldKey);
110
	}
111
	
112
//	protected void print(Object object, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
113
//		print(object == null ? null : object.toString(), writer, addSeparator, fieldKey);
114
//	}
115
	protected void print(CsvId dwcaId, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
116
		print(dwcaId == null ? null : dwcaId.getId(), writer, addSeparator, fieldKey);
117
	}
118
	protected void print(UUID uuid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
119
		print(uuid == null ? null : uuid.toString(), writer, addSeparator, fieldKey);
120
	}
121
	protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
122
		print(agent, writer, addSeparator, fieldKey.getUriString());
123
	}
124
	protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, String fieldKey) {
125
		print(agent == null ? null : getAgent(agent), writer, addSeparator, fieldKey);
126
	}
127

    
128
	
129
	protected void print(Language language, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
130
		print(language, writer, addSeparator, fieldKey.getUriString());
131
	}
132
	protected void print(Language language, PrintWriter writer, boolean addSeparator, String fieldKey) {
133
		print(language == null ? null : getLanguage(language), writer, addSeparator, fieldKey);
134
	}
135
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
136
		print(lsid, writer, addSeparator, fieldKey.getUriString());
137
	}
138
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, String fieldKey) {
139
		print(lsid == null ? null : String.valueOf(lsid.toString()), writer, addSeparator, fieldKey);
140
	}
141
	
142
	protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
143
		print(rights, writer, addSeparator, fieldKey.getUriString());
144
	}
145
	protected void print(Set<Rights> rights, PrintWriter writer, boolean addSeparator, String fieldKey) {
146
		String rightsString = getRights(rights);
147
		print(rightsString, writer, addSeparator, fieldKey);
148
	}
149
	protected void print(URI uri, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
150
		print(uri, writer, addSeparator, fieldKey.getUriString());
151
	}
152
	protected void print(URI uri, PrintWriter writer, boolean addSeparator, String fieldKey) {
153
		print(uri == null ? null : String.valueOf(uri), writer, addSeparator, fieldKey);
154
	}
155
	
156
	protected void print(Point point, PrintWriter writer, boolean addSeparator, TermUri latitudeKey, TermUri longitudeKey) {
157
		print(point, writer, addSeparator, latitudeKey.getUriString(), longitudeKey.getUriString());
158
	}
159
	
160
	protected void print(Point point, PrintWriter writer, boolean addSeparator, String latitudeKey, String longitudeKey) {
161
		if (point == null){
162
			String toPrint = null;
163
			print(toPrint, writer, addSeparator, latitudeKey);
164
			print(toPrint, writer, addSeparator, longitudeKey);
165
		}else{
166
			String latitude = point.getLatitude().toString();
167
			String longitude = point.getLongitude().toString();
168
			print(latitude, writer, addSeparator, latitudeKey);
169
			print(longitude, writer, addSeparator, longitudeKey);
170
		}
171
	}
172
	protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
173
		print(boolValue, writer, addSeparator, fieldKey.getUriString());
174
	}	
175
	protected void print(Boolean boolValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
176
		print(boolValue == null ? null : String.valueOf(boolValue), writer, addSeparator, fieldKey);
177
	}
178

    
179
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
180
		print(intValue, writer, addSeparator, fieldKey.getUriString());
181
	}
182
	protected void print(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
183
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
184
	}
185
	
186
	protected void printId(Integer intValue, PrintWriter writer, boolean addSeparator, String fieldKey) {
187
		print(intValue == null ? null : String.valueOf(intValue), writer, addSeparator, fieldKey);
188
	}
189
	protected void printId(UUID uuid, PrintWriter writer, boolean addSeparator, String fieldKey) {
190
		print(uuid == null ? null : String.valueOf(uuid), writer, addSeparator, fieldKey);
191
	}
192

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

    
197
	protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey, String defaultValue) {
198
		print(value, writer, addSeparator, fieldKey.getUriString(), defaultValue);
199
	}
200
	
201
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey) {
202
		print(value, writer, addSeparator, fieldKey, null);
203
	}
204
	
205
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey, String defaultValue) {
206
		if (count == 1 && addSeparator == IS_NOT_FIRST){
207
			registerFieldKey(URI.create(fieldKey), defaultValue);
208
		}
209
		if (StringUtils.isBlank(defaultValue)){
210
			String strToPrint = addSeparator ? config.getFieldsTerminatedBy() : "";
211
			if (StringUtils.isNotBlank(value)){
212
				//Replace quotes by double quotes
213
				value = value.replace("\"", "\"\"");
214
				
215
				value = value.replace(config.getLinesTerminatedBy(), "\\r");
216
				
217
				//replace all line brakes according to best practices: http://code.google.com/p/gbif-ecat/wiki/BestPractices
218
				value = value.replace("\r\n", "\\r");
219
				value = value.replace("\r", "\\r");
220
				value = value.replace("\n", "\\r");
221
				
222
				strToPrint += config.getFieldsEnclosedBy() + value + config.getFieldsEnclosedBy();
223
			}
224
			writer.print(strToPrint);
225
		}
226
	}
227
	
228
	/**
229
	 * @param writer
230
	 * @param list
231
	 * @param termUri
232
	 */
233
	protected void printHeadline(PrintWriter writer, ArrayList<String> list, TermUri termUri){
234
		for(String element:list){
235
			if(list.get(0).equals(element)){
236
				print(element, writer, IS_FIRST, termUri);
237
			}
238
			else{
239
				print(element, writer, IS_NOT_FIRST, termUri);
240
			}
241
		}
242
		writer.println();
243
	}
244

    
245
	/**
246
	 * @param list
247
	 * @param termUri
248
	 * @param writer
249
	 * 
250
	 * Method for concatenating strings, especially for the red list use case
251
	 */
252
	protected void print(ArrayList<String> list, TermUri termUri, PrintWriter writer){
253
		if(list == null||list.isEmpty()){
254
			print("", writer, IS_NOT_FIRST, termUri);
255
		}else{
256
			for (String element:list){
257
				if(list.get(0).equals(element)){
258
					writer.write("\t");
259
					print(element, writer, IS_FIRST, termUri);
260
					if(list.size()>1){
261
						writer.write(",");
262
						logger.info(element);
263
					}
264
				}else if(list.get(list.size()-1).equals(element)){
265
					print(element, writer, IS_FIRST, termUri);
266
				}else{
267
					print(element, writer, IS_FIRST, termUri);
268
					writer.write(",");
269
					logger.info(element);
270
					
271
				}
272
			}
273
		}
274
	}
275
	
276
	
277
	private void registerFieldKey(URI key, String defaultValue) {
278
		this.metaDataRecord.addFieldEntry(key, defaultValue);
279
	}
280

    
281
	
282
	protected String getRights(Rights rights) {
283
		if (rights == null){
284
			return "";
285
		}else{
286
			//TODO
287
			return rights.getAbbreviatedText();
288
		}
289
	}
290

    
291
	protected String getLanguage(Language language) {
292
		if (language == null){
293
			return "";
294
		}else{
295
			//TODO
296
			return language.getIso639_2();
297
		}
298
	}
299

    
300
	protected String getDate(DateTime date) {
301
		if (date == null){
302
			return "";
303
		}else{
304
			//TODO
305
			return date.toString();
306
		}
307
	}
308

    
309
	protected String getNomStatus(NomenclaturalStatusType nomStatus) {
310
		String result = CsvTaxExportTransformerRedlist.transformToGbifNomStatus(nomStatus);
311
		if (result == null){
312
			if (nomStatus == null){
313
				return "";
314
			}else{
315
				return nomStatus.getLabel();
316
			}
317
		}else{
318
			return result;
319
		}
320
	}
321

    
322
	protected String getNomCode(NomenclaturalCode nomCode) {
323
		if (nomCode == null){
324
			return "";
325
		}else{
326
			//TODO
327
			return nomCode.getTitleCache();
328
		}
329
	}
330

    
331
	protected String getRank(Rank rank) {
332
		String result = CsvTaxExportTransformerRedlist.transformToGbifRank(rank);
333
		if (result == null){
334
			if (rank == null){
335
				return "";
336
			}else{
337
				return rank.getLabel();
338
			}
339
		}else{
340
			return result;
341
		}
342
	}
343
	
344
	protected String getSex(DefinedTerm sex) {
345
		String result = CsvTaxExportTransformerRedlist.transformToGbifSex(sex);
346
		if (result == null){
347
			if (sex == null){
348
				return "";
349
			}else{
350
				return sex.getLabel();
351
			}
352
		}else{
353
			return result;
354
		}
355
	}
356
	
357
	protected String getLifeStage(DefinedTerm stage) {
358
		String result = CsvTaxExportTransformerRedlist.transformToGbifLifeStage(stage);
359
		if (result == null){
360
			if (stage == null){
361
				return "";
362
			}else{
363
				return stage.getLabel();
364
			}
365
		}else{
366
			return result;
367
		}
368
	}
369

    
370
	protected String getOccurrenceStatus(PresenceAbsenceTerm status) {
371
		String result = CsvTaxExportTransformerRedlist.transformToGbifOccStatus(status);
372
		if (result == null){
373
			if (status == null){
374
				return "";
375
			}else{
376
				return status.getLabel();
377
			}
378
		}else{
379
			return result;
380
		}
381
	}
382
	
383
	protected String getEstablishmentMeans(PresenceAbsenceTerm status) {
384
		String result = CsvTaxExportTransformerRedlist.transformToGbifEstablishmentMeans(status);
385
		if (result == null){
386
			if (status == null){
387
				return "";
388
			}else{
389
				return status.getLabel();
390
			}
391
		}else{
392
			return result;
393
		}
394
	}
395

    
396
	
397
	
398
	protected String getAgent(AgentBase<?> agent) {
399
		if (agent == null){
400
			return "";
401
		}else{
402
			//TODO
403
			return agent.getTitleCache();
404
		}
405
	}
406
	
407

    
408
	protected String getFeature(Feature feature) {
409
		if (feature == null){
410
			return "";
411
		}else{
412
			//TODO
413
			return feature.getTitleCache();
414
		}
415
	}
416

    
417
	
418
	protected String getTimePeriod(TimePeriod period) {
419
		if (period == null){
420
			return "";
421
		}else{
422
			//TODO
423
			return period.toString();
424
		}
425
	}
426
	
427
	protected String getTimePeriodPart(TimePeriod period, boolean useEnd) {
428
		if (period == null){
429
			return "";
430
		}else{
431
			Partial date = useEnd? period.getEnd(): period.getStart();
432
			if (date == null){
433
				return "";
434
			}else{
435
				//TODO
436
				return date.toString();
437
			}
438
		}
439
	}
440

    
441
	private String getRights(Set<Rights> rights) {
442
		if (rights == null || rights.isEmpty()){
443
			return null;
444
		}else{
445
			String result = null;
446
			for (Rights right: rights){
447
				//TODO usi uri if available ??
448
				String message = "Rights not yet fully implemented";
449
				logger.warn(message);
450
				result = CdmUtils.concat(COLLECTION_SEPARATOR, result, right.getAbbreviatedText());
451
			}
452
			return result;
453
		}
454
	}
455
	
456

    
457
	protected String getDesignationType(TypeDesignationStatusBase<?> status) {
458
		if (status == null){
459
			return "";
460
		}
461
		String result;
462
		if (status.isInstanceOf(SpecimenTypeDesignationStatus.class)){
463
			SpecimenTypeDesignationStatus specStatus = CdmBase.deproxy(status, SpecimenTypeDesignationStatus.class);
464
			result = CsvTaxExportTransformerRedlist.transformSpecimenTypeStatusToGbif(specStatus);
465
		}else{
466
			NameTypeDesignationStatus nameStatus = CdmBase.deproxy(status, NameTypeDesignationStatus.class);
467
			result = CsvTaxExportTransformerRedlist.transformNameTypeStatusToGbif(nameStatus);
468
		}
469
		if (result == null){
470
			return status.getLabel();
471
		}else{
472
			return result;
473
		}
474
	}
475
	
476
	
477
	protected void addKnownField(String string, String uri) throws URISyntaxException {
478
		this.knownFields.put(string, new URI(uri));
479
	}
480
	
481
	protected void addKnownField(TermUri term) throws URISyntaxException {
482
		this.knownTermFields.add(term);
483
	}
484
}
(4-4/10)