/**
* Copyright 2006 by Know-Center, Graz, Austria
* PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a
* joint initiative of the Federal Chancellery Austria and Graz University of
* Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* http://www.osor.eu/eupl/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
package at.gv.egiz.pdfas.utils;
import org.apache.commons.lang.StringUtils;
/**
* Methods in order to create valid delimiter separated data, where the semicolon as used as delimiter, also known as
* the German version of CSV.
*
* @author Datentechnik Innovation GmbH
* @see RFC 4180
*/
public class CsvUtils {
/**
* The delimiter char used instead of COMMA.
*/
public static final char DEFAULT_DELIMITER = ';';
private static final char QUOTE_CHAR = '"';
private static final char LF_CHAR = '\n';
private static final char CR_CHAR = '\r';
private static final char[] SHOULD_BE_QUOTED = { LF_CHAR, CR_CHAR, DEFAULT_DELIMITER, QUOTE_CHAR };
private static final String CSV_QUOTE = String.valueOf(QUOTE_CHAR);
/**
* Returns an DSV escapted representation of the given object using the default delimiter character (
* {@link #DEFAULT_DELIMITER}).
*
* @param obj
* The object.
* @return An escapted representation of the given object.
*/
public static String escapeCsvValue(Object obj) {
// null value should be printed as empty column
if (obj == null) {
return "";
}
// get String representation of object
String asString = String.valueOf(obj);
// do we need to escape anything?
if (StringUtils.containsNone(asString, SHOULD_BE_QUOTED)) {
return asString;
}
// RFC 4180 (7): If double-quotes are used to enclose fields, then a double-quote
// appearing inside a field must be escaped by preceding it with
// another double quote.
asString = StringUtils.replace(asString, CSV_QUOTE, CSV_QUOTE + CSV_QUOTE);
// RFC 4180 (6): Fields containing line breaks (CRLF), double quotes, and commas
// should be enclosed in double-quotes.
if (StringUtils.containsAny(asString, SHOULD_BE_QUOTED)) {
return QUOTE_CHAR + asString + QUOTE_CHAR;
}
return asString;
}
}