/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.widget.searchandfilter.service.csv;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import org.geomajas.widget.searchandfilter.command.dto.CsvMetadata;
/**
* Not threadsafe!
*
* @author Kristof Heirwegh
*/
public class CsvBuilder {
private static final String EOL = "\r\n";
private final DateFormat dateFormatter;
private final NumberFormat numberFormatter;
private final StringBuilder sb = new StringBuilder();
private final String separatorChar;
private final String escapeChar;
private boolean first = true;
// ------------------------------------------------------------------
/**
* Default values: delimiter = ";", locale = "EN", escapeChar = "\"".
*/
public CsvBuilder() {
this.separatorChar = ";";
this.escapeChar = "\"";
this.dateFormatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.ENGLISH);
this.numberFormatter = DecimalFormat.getNumberInstance(Locale.ENGLISH);
}
public CsvBuilder(CsvMetadata meta) {
if (meta == null) {
throw new IllegalArgumentException("Meta cannot be null");
}
this.separatorChar = meta.getSeparatorChar();
this.escapeChar = meta.getQuoteChar();
Locale locale = new Locale(meta.getLocale());
this.dateFormatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
this.numberFormatter = DecimalFormat.getNumberInstance(locale);
}
// ------------------------------------------------------------------
public void addField(String value) {
addDelimiter();
sb.append(escape(value));
}
public void addField(boolean value) {
addDelimiter();
sb.append(Boolean.toString(value));
}
public void addField(long value) {
addDelimiter();
sb.append(value);
}
public void addField(double value) {
addDelimiter();
sb.append(numberFormatter.format(value));
}
public void addField(Date value) {
addDelimiter();
if (value != null) {
sb.append(dateFormatter.format(value));
}
}
public void addField(Calendar value) {
addDelimiter();
if (value != null) {
sb.append(dateFormatter.format(value.getTime()));
}
}
public void endRecord() {
sb.append(EOL);
first = true;
}
public StringBuilder getBuffer() {
return sb;
}
// ------------------------------------------------------------------
private void addDelimiter() {
if (first) {
first = false;
} else {
sb.append(separatorChar);
}
}
private String escape(String value) {
if (value == null) {
return "";
} else if ("".equals(value)) {
return escapeChar + escapeChar;
} else {
String tmp = value.replaceAll("\\" + escapeChar, escapeChar + escapeChar);
if (tmp.contains(escapeChar) || tmp.contains(separatorChar) || tmp.contains("\n")) {
return escapeChar + tmp + escapeChar;
} else {
return value;
}
}
}
}