/** * * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * **/ package lucee.runtime.functions.list; import lucee.commons.lang.StringUtil; import lucee.runtime.PageContext; import lucee.runtime.exp.FunctionException; import lucee.runtime.exp.PageException; import lucee.runtime.ext.function.BIF; import lucee.runtime.op.Caster; import lucee.runtime.op.Decision; import lucee.runtime.type.Array; import lucee.runtime.type.util.ListUtil; /** * Implements the CFML Function listqualify */ public final class ListQualify extends BIF { 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 lucee, 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) { StringBuilder rtn=new StringBuilder(); 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) { StringBuilder rtn=new StringBuilder(); 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) { StringBuilder rtn=new StringBuilder(); 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) { StringBuilder rtn=new StringBuilder(); 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(StringBuilder rtn,String value,String qualifier) { if(Decision.isNumber(value)) rtn.append(value); else { rtn.append(qualifier); rtn.append(value); rtn.append(qualifier); } } private static void qualifyString(StringBuilder rtn,String value,char qualifier) { if(Decision.isNumber(value)) rtn.append(value); else { rtn.append(qualifier); rtn.append(value); rtn.append(qualifier); } } @Override public Object invoke(PageContext pc, Object[] args) throws PageException { if(args.length==2) return call(pc, Caster.toString(args[0]), Caster.toString(args[1])); if(args.length==3) return call(pc, Caster.toString(args[0]), Caster.toString(args[1]), Caster.toString(args[2])); if(args.length==4) return call(pc, Caster.toString(args[0]), Caster.toString(args[1]), Caster.toString(args[2]), Caster.toString(args[3])); if(args.length==5) return call(pc, Caster.toString(args[0]), Caster.toString(args[1]), Caster.toString(args[2]), Caster.toString(args[3]), Caster.toBooleanValue(args[4])); throw new FunctionException(pc, "ListQualify", 2, 5, args.length); } }