Project

General

Profile

Download (14.6 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.demo;
10

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

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

    
26
import eu.etaxonomy.cdm.common.CdmUtils;
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, a.oppermann
48
 * @since 20.04.2011
49
 *
50
 */
51

    
52
public abstract class CsvDemoRecordBase {
53
	private static final Logger logger = Logger.getLogger(CsvDemoRecordBase.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 final CsvDemoMetaDataRecord metaDataRecord;
70
	protected CsvDemoExportConfigurator config;
71

    
72
	private Integer id;
73
	private UUID uuid;
74

    
75

    
76
	protected CsvDemoRecordBase(CsvDemoMetaDataRecord metaDataRecord, CsvDemoExportConfigurator config){
77
		this.metaDataRecord = metaDataRecord;
78
		this.count = metaDataRecord.inc();
79
		this.config = config;
80
	}
81

    
82

    
83
	public void setId(Integer id) {
84
		this.id = id;
85
	}
86

    
87
	public Integer getId() {
88
		return id;
89
	}
90

    
91
	public void setUuid(UUID uuid) {
92
		this.uuid = uuid;
93
	}
94

    
95
/*	public UUID getUuid() {
96
		return uuid;
97
	}*/
98

    
99
	protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
100
		printNotes(notes, writer, addSeparator, fieldKey.getUriString());
101
	}
102
	protected void printNotes(Set<Annotation> notes, PrintWriter writer, boolean addSeparator, String fieldKey) {
103
		//FIXME handles annotations correctly
104
		String value = null;
105
		print(value, writer, addSeparator, fieldKey);
106
	}
107

    
108
//	protected void print(Object object, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
109
//		print(object == null ? null : object.toString(), writer, addSeparator, fieldKey);
110
//	}
111
	protected void print(CsvDemoId dwcaId, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
112
		print(dwcaId == null ? null : dwcaId.getId(), writer, addSeparator, fieldKey);
113
	}
114
	protected void print(UUID uuid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
115
		print(uuid == null ? null : uuid.toString(), writer, addSeparator, fieldKey);
116
	}
117
	protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
118
		print(agent, writer, addSeparator, fieldKey.getUriString());
119
	}
120
	protected void print(AgentBase<?> agent, PrintWriter writer, boolean addSeparator, String fieldKey) {
121
		print(agent == null ? null : getAgent(agent), writer, addSeparator, fieldKey);
122
	}
123

    
124

    
125
	protected void print(Language language, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
126
		print(language, writer, addSeparator, fieldKey.getUriString());
127
	}
128
	protected void print(Language language, PrintWriter writer, boolean addSeparator, String fieldKey) {
129
		print(language == null ? null : getLanguage(language), writer, addSeparator, fieldKey);
130
	}
131
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
132
		print(lsid, writer, addSeparator, fieldKey.getUriString());
133
	}
134
	protected void print(LSID lsid, PrintWriter writer, boolean addSeparator, String fieldKey) {
135
		print(lsid == null ? null : String.valueOf(lsid.toString()), writer, addSeparator, fieldKey);
136
	}
137

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

    
152
	protected void print(Point point, PrintWriter writer, boolean addSeparator, TermUri latitudeKey, TermUri longitudeKey) {
153
		print(point, writer, addSeparator, latitudeKey.getUriString(), longitudeKey.getUriString());
154
	}
155

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

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

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

    
189
	protected void print(String value, PrintWriter writer, boolean addSeparator, TermUri fieldKey) {
190
		print(value, writer, addSeparator, fieldKey, null);
191
	}
192

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

    
197
	protected void print(String value, PrintWriter writer, boolean addSeparator, String fieldKey) {
198
		print(value, writer, addSeparator, fieldKey, null);
199
	}
200

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

    
211
				value = value.replace(config.getLinesTerminatedBy(), "\\r");
212

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

    
218
				strToPrint += config.getFieldsEnclosedBy() + value + config.getFieldsEnclosedBy();
219
			}
220
			writer.print(strToPrint);
221
		}
222
	}
223

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

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

    
267
				}
268
			}
269
		}
270
	}
271

    
272

    
273
	private void registerFieldKey(URI key, String defaultValue) {
274
		this.metaDataRecord.addFieldEntry(key, defaultValue);
275
	}
276

    
277

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

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

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

    
305
	protected String getNomStatus(NomenclaturalStatusType nomStatus) {
306
		String result = CsvDemoExportTransformer.transformToGbifNomStatus(nomStatus);
307
		if (result == null){
308
			if (nomStatus == null){
309
				return "";
310
			}else{
311
				return nomStatus.getLabel();
312
			}
313
		}else{
314
			return result;
315
		}
316
	}
317

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

    
327
	protected String getRank(Rank rank) {
328
		String result = CsvDemoExportTransformer.transformToGbifRank(rank);
329
		if (result == null){
330
			if (rank == null){
331
				return "";
332
			}else{
333
				return rank.getLabel();
334
			}
335
		}else{
336
			return result;
337
		}
338
	}
339

    
340
	protected String getSex(DefinedTerm sex) {
341
		String result = CsvDemoExportTransformer.transformToGbifSex(sex);
342
		if (result == null){
343
			if (sex == null){
344
				return "";
345
			}else{
346
				return sex.getLabel();
347
			}
348
		}else{
349
			return result;
350
		}
351
	}
352

    
353
	protected String getLifeStage(DefinedTerm stage) {
354
		String result = CsvDemoExportTransformer.transformToGbifLifeStage(stage);
355
		if (result == null){
356
			if (stage == null){
357
				return "";
358
			}else{
359
				return stage.getLabel();
360
			}
361
		}else{
362
			return result;
363
		}
364
	}
365

    
366
	protected String getOccurrenceStatus(PresenceAbsenceTerm status) {
367
		String result = CsvDemoExportTransformer.transformToGbifOccStatus(status);
368
		if (result == null){
369
			if (status == null){
370
				return "";
371
			}else{
372
				return status.getLabel();
373
			}
374
		}else{
375
			return result;
376
		}
377
	}
378

    
379
	protected String getEstablishmentMeans(PresenceAbsenceTerm status) {
380
		String result = CsvDemoExportTransformer.transformToGbifEstablishmentMeans(status);
381
		if (result == null){
382
			if (status == null){
383
				return "";
384
			}else{
385
				return status.getLabel();
386
			}
387
		}else{
388
			return result;
389
		}
390
	}
391

    
392

    
393

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

    
403

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

    
413

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

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

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

    
452

    
453
	protected String getDesignationType(TypeDesignationStatusBase<?> status) {
454
		if (status == null){
455
			return "";
456
		}
457
		String result;
458
		if (status.isInstanceOf(SpecimenTypeDesignationStatus.class)){
459
			SpecimenTypeDesignationStatus specStatus = CdmBase.deproxy(status, SpecimenTypeDesignationStatus.class);
460
			result = CsvDemoExportTransformer.transformSpecimenTypeStatusToGbif(specStatus);
461
		}else{
462
			NameTypeDesignationStatus nameStatus = CdmBase.deproxy(status, NameTypeDesignationStatus.class);
463
			result = CsvDemoExportTransformer.transformNameTypeStatusToGbif(nameStatus);
464
		}
465
		if (result == null){
466
			return status.getLabel();
467
		}else{
468
			return result;
469
		}
470
	}
471

    
472

    
473
	protected void addKnownField(String string, String uri) throws URISyntaxException {
474
		this.knownFields.put(string, new URI(uri));
475
	}
476

    
477
	protected void addKnownField(TermUri term) throws URISyntaxException {
478
		this.knownTermFields.add(term);
479
	}
480
}
(9-9/10)