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
public abstract class CsvDemoRecordBase {
51

    
52
	private static final Logger logger = Logger.getLogger(CsvDemoRecordBase.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<String, URI>();
62
	protected Set<TermUri> knownTermFields = new HashSet<TermUri>();
63

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

    
67
	protected int count;
68
	private final CsvDemoMetaDataRecord metaDataRecord;
69
	protected CsvDemoExportConfigurator config;
70

    
71
	private Integer id;
72
	private UUID uuid;
73

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

    
80
	public void setId(Integer id) {
81
		this.id = id;
82
	}
83

    
84
	public Integer getId() {
85
		return id;
86
	}
87

    
88
	public void setUuid(UUID uuid) {
89
		this.uuid = uuid;
90
	}
91

    
92
/*	public UUID getUuid() {
93
		return uuid;
94
	}*/
95

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
263
				}
264
			}
265
		}
266
	}
267

    
268

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

    
273

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

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

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

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

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

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

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

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

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

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

    
388

    
389

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

    
399

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

    
409

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

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

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

    
448

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