/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.deidentifier.arx.io;
import java.io.Serializable;
import java.util.Arrays;
/**
* Syntax for a CSV file.
*
* @author Florian Kohlmayer
* @author Fabian Prasser
*/
public class CSVSyntax implements Serializable{
/** SVUID */
private static final long serialVersionUID = -3978502790060734961L;
/** The delimiter. */
private char delimiter;
/** The quote. */
private char quote;
/** The escape. */
private char escape;
/** The linebreak. */
private char[] linebreak;
/** Default values. */
public static final char DEFAULT_DELIMITER = ';';
/** Default values. */
public static final char DEFAULT_QUOTE = '\"';
/** Default values. */
public static final char DEFAULT_ESCAPE = '\"';
/** Default values. */
public static final char[] DEFAULT_LINEBREAK = { '\n' };
/** Supported line breaks. */
private static final char[][] linebreaks = { { '\n' }, { '\r', '\n' }, { '\r' } };
/** Labels for supported line breaks. */
private static final String[] linebreaklabels = { "Unix", "Windows", "Mac OS"};
/**
* Returns the available line breaks
* @return
*/
public static String[] getAvailableLinebreaks() {
return linebreaklabels.clone();
}
/**
* Returns a label for a linebreak
* @param linebreak
* @return
*/
public static String getLabelForLinebreak(char[] linebreak) {
int idx = 0;
for (char[] c : linebreaks) {
if (Arrays.equals(c, linebreak)) {
return linebreaklabels[idx];
} else {
idx++;
}
}
return linebreaklabels[0];
}
/**
* Returns a linebreak for a label
* @param label
* @return
*/
public static char[] getLinebreakForLabel(String label) {
int idx = 0;
for (String c : linebreaklabels) {
if (c.equals(label)) {
return linebreaks[idx];
} else {
idx++;
}
}
return linebreaks[0];
}
/**
* Gets the normalized line break character.
*
* @param linebreak the line break
* @return the normalized line break character
*/
public static char getNormalizedLinebreak(char[] linebreak) {
if (linebreak[0] == '\n') {
return '\n';
} else if ((linebreak[0] == '\r') && (linebreak.length < 2)) {
return '\r';
} else {
return '\n';
}
}
/**
* Instantiates a new syntax for a CSV file.
*/
public CSVSyntax() {
this(DEFAULT_DELIMITER);
}
/**
* Instantiates a new syntax for a CSV file.
*
* @param delimiter the delimiter
*/
public CSVSyntax(final char delimiter) {
this(delimiter, DEFAULT_QUOTE);
}
/**
* Instantiates a new syntax for a CSV file.
*
* @param delimiter the delimiter
* @param quote the quote
*/
public CSVSyntax(final char delimiter, final char quote) {
this(delimiter, quote, DEFAULT_ESCAPE);
}
/**
* Instantiates a new syntax for a CSV file.
*
* @param delimiter the delimiter
* @param quote the quote
* @param escape the escape
*/
public CSVSyntax(final char delimiter, final char quote, final char escape) {
this(delimiter, quote, escape, DEFAULT_LINEBREAK);
}
/**
* Instantiates a new syntax for a CSV file.
*
* @param delimiter the delimiter
* @param quote the quote
* @param escape the escape
* @param linebreak the line break
*/
public CSVSyntax(final char delimiter, final char quote, final char escape, final char[] linebreak) {
this.delimiter = delimiter;
this.quote = quote;
this.escape = escape;
this.linebreak = linebreak;
}
/**
* Instantiates a new syntax for a CSV file.
*
* @param delimiter the delimiter
* @param quote the quote
* @param escape the escape
* @param linebreak the line break
*/
public CSVSyntax(final char delimiter, final char quote, final char escape, final String linebreak) {
this.delimiter = delimiter;
this.quote = quote;
this.escape = escape;
if (linebreak.length() > 2) {
throw new IllegalArgumentException("Line break too large");
}
this.linebreak = linebreak.toCharArray();
}
/**
* Gets the delimiter.
*
* @return the delimiter
*/
public char getDelimiter() {
return delimiter;
}
/**
* Gets the escape.
*
* @return the escape
*/
public char getEscape() {
return escape;
}
/**
* Gets the line break.
*
* @return the line break
*/
public char[] getLinebreak() {
return linebreak;
}
/**
* Gets the quote.
*
* @return the quote
*/
public char getQuote() {
return quote;
}
/**
* Sets the delimiter.
*
* @param delimiter the new delimiter
*/
public void setDelimiter(char delimiter) {
this.delimiter = delimiter;
}
/**
* Sets the escape.
*
* @param escape the new escape
*/
public void setEscape(char escape) {
this.escape = escape;
}
/**
* Sets the line break.
*
* @param linebreak the new line break
*/
public void setLinebreak(char[] linebreak) {
this.linebreak = linebreak;
}
/**
* Sets the line break.
*
* @param linebreak the new line break
*/
public void setLinebreak(String linebreak) {
if (linebreak.length() > 2) {
throw new IllegalArgumentException("Line break too large");
}
this.linebreak = linebreak.toCharArray();
}
/**
* Sets the quote.
*
* @param quote the new quote
*/
public void setQuote(char quote) {
this.quote = quote;
}
}