/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.dataprocess.common.codec;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.lang.StringUtils;
/**
*
*/
public class ListCodec {
private String separator = ",";
private String openQuote = "'";
private String closeQuote = "'";
private boolean trim = false;
public void setTrim(boolean trim) {
this.trim = trim;
}
public String encode(List<String> parameters, String quoteOpenClose, String separatorParam) {
this.openQuote = quoteOpenClose;
this.closeQuote = quoteOpenClose;
this.separator = separatorParam;
return encode(parameters);
}
public String encode(List<String> parameters, Quote quote, String separatorParam) {
this.openQuote = quote.openQuote;
this.closeQuote = quote.closeQuote;
this.separator = separatorParam;
return encode(parameters);
}
public String encode(List<String> parameters) {
if (parameters == null) {
return "";
}
StringBuilder res = new StringBuilder();
for (String parameter : parameters) {
res.append(openQuote);
if (trim) {
res.append(parameter.trim());
}
else {
res.append(parameter);
}
res.append(closeQuote);
res.append(separator);
}
if (!parameters.isEmpty()) {
return res.toString().substring(0, res.length() - separator.length());
}
else {
return "";
}
}
public List<String> decode(String listAsString, String quoteOpenClose, String separatorParam) {
this.openQuote = quoteOpenClose;
this.closeQuote = quoteOpenClose;
this.separator = separatorParam;
return decode(listAsString);
}
public List<String> decode(String listAsString, Quote quote, String separatorParam) {
this.openQuote = quote.openQuote;
this.closeQuote = quote.closeQuote;
this.separator = separatorParam;
return decode(listAsString);
}
public List<String> decode(String listAsString) {
List<String> parameters = new ArrayList<String>();
if (StringUtils.isEmpty(listAsString)) {
return parameters;
}
StringBuilder partToken = new StringBuilder();
StringTokenizer listTokenizer = new StringTokenizer(listAsString, separator);
while (listTokenizer.hasMoreTokens()) {
String token = listTokenizer.nextToken();
if (proceedPartTok(parameters, partToken.toString())) {
partToken = new StringBuilder();
}
if (token.trim().startsWith(openQuote) && token.trim().endsWith(closeQuote)) {
token = removeQuote(token.trim());
if (trim) {
token = token.trim();
}
parameters.add(token);
}
else {
partToken.append(token);
if (!partToken.toString().trim().endsWith(closeQuote)) {
partToken.append(separator);
}
}
}
proceedPartTok(parameters, partToken.toString());
return parameters;
}
private boolean proceedPartTok(List<String> parameters, String partToken) {
if (partToken.length() != 0) {
if (partToken.trim().startsWith(openQuote)
&& partToken.trim().endsWith(closeQuote)) {
partToken = removeQuote(partToken.trim());
if (trim) {
partToken = partToken.trim();
}
parameters.add(partToken);
return true;
}
}
return false;
}
String removeQuote(String str) {
return str.substring(openQuote.length(), str.length() - closeQuote.length());
}
static class Quote {
private String openQuote;
private String closeQuote;
Quote(String openQuote, String closeQuote) {
this.openQuote = openQuote;
this.closeQuote = closeQuote;
}
}
}