package railo.runtime.functions.list;
import railo.commons.lang.StringUtil;
import railo.runtime.PageContext;
import railo.runtime.ext.function.Function;
import railo.runtime.op.Decision;
import railo.runtime.type.Array;
import railo.runtime.type.util.ListUtil;
/**
* Implements the CFML Function listqualify
*/
public final class ListQualify implements Function {
private static final long serialVersionUID = -7450079285934992224L;
public static String call(PageContext pc , String list, String qualifier) {
return call(pc,list,qualifier,",","all", false, false);
}
public static String call(PageContext pc , String list, String qualifier, String delimiter) {
return call(pc,list,qualifier,delimiter,"all", false, false);
}
public static String call(PageContext pc , String list, String qualifier, String delimiter, String elements) {
return call(pc, list, qualifier, delimiter, elements, false, false);
}
public static String call(PageContext pc , String list, String qualifier, String delimiter, String elements, boolean includeEmptyFields) {
return call(pc, list, qualifier, delimiter, elements, includeEmptyFields, false);
}
public static String call(PageContext pc , String list, String qualifier, String delimiter, String elements, boolean includeEmptyFields,
boolean psq // this is used only internally by railo, search for "PSQ-BIF" in code
) {
if(list.length()==0) return "";
if(psq)list=StringUtil.replace(list, "'", "''", false);
Array arr=includeEmptyFields?ListUtil.listToArray(list,delimiter):ListUtil.listToArrayRemoveEmpty(list,delimiter);
boolean isQChar=qualifier.length()==1;
boolean isDChar=delimiter.length()==1;
if(isQChar && isDChar) return doIt(arr,qualifier.charAt(0),delimiter.charAt(0),elements);
else if(isQChar && !isDChar) return doIt(arr,qualifier.charAt(0),delimiter,elements);
else if(!isQChar && isDChar) return doIt(arr,qualifier,delimiter.charAt(0),elements);
else return doIt(arr,qualifier,delimiter,elements);
}
private static String doIt(Array arr, char qualifier, char delimiter, String elements) {
StringBuffer rtn=new StringBuffer();
int len=arr.size();
if(StringUtil.toLowerCase(elements).equals("all")) {
rtn.append(qualifier);
rtn.append(arr.get(1,""));
rtn.append(qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
rtn.append(qualifier);
rtn.append(arr.get(i,""));
rtn.append(qualifier);
}
}
else {
qualifyString(rtn,arr.get(1,"").toString(),qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
qualifyString(rtn,arr.get(i,"").toString(),qualifier);
}
}
return rtn.toString();
}
private static String doIt(Array arr, char qualifier, String delimiter, String scope) {
StringBuffer rtn=new StringBuffer();
int len=arr.size();
if(StringUtil.toLowerCase(scope).equals("all")) {
rtn.append(qualifier);
rtn.append(arr.get(1,""));
rtn.append(qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
rtn.append(qualifier);
rtn.append(arr.get(i,""));
rtn.append(qualifier);
}
}
else {
qualifyString(rtn,arr.get(1,"").toString(),qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
qualifyString(rtn,arr.get(i,"").toString(),qualifier);
}
}
return rtn.toString();
}
private static String doIt(Array arr, String qualifier, char delimiter, String scope) {
StringBuffer rtn=new StringBuffer();
int len=arr.size();
if(StringUtil.toLowerCase(scope).equals("all")) {
rtn.append(qualifier);
rtn.append(arr.get(1,""));
rtn.append(qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
rtn.append(qualifier);
rtn.append(arr.get(i,""));
rtn.append(qualifier);
}
}
else {
qualifyString(rtn,arr.get(1,"").toString(),qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
qualifyString(rtn,arr.get(i,"").toString(),qualifier);
}
}
return rtn.toString();
}
private static String doIt(Array arr, String qualifier, String delimiter, String scope) {
StringBuffer rtn=new StringBuffer();
int len=arr.size();
if(StringUtil.toLowerCase(scope).equals("all")) {
rtn.append(qualifier);
rtn.append(arr.get(1,""));
rtn.append(qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
rtn.append(qualifier);
rtn.append(arr.get(i,""));
rtn.append(qualifier);
}
}
else {
qualifyString(rtn,arr.get(1,"").toString(),qualifier);
for(int i=2;i<=len;i++) {
rtn.append(delimiter);
qualifyString(rtn,arr.get(i,"").toString(),qualifier);
}
}
return rtn.toString();
}
private static void qualifyString(StringBuffer rtn,String value,String qualifier) {
if(Decision.isNumeric(value)) rtn.append(value);
else {
rtn.append(qualifier);
rtn.append(value);
rtn.append(qualifier);
}
}
private static void qualifyString(StringBuffer rtn,String value,char qualifier) {
if(Decision.isNumeric(value)) rtn.append(value);
else {
rtn.append(qualifier);
rtn.append(value);
rtn.append(qualifier);
}
}
}