001 package railo.runtime.functions.list; 002 003 import railo.commons.lang.StringUtil; 004 import railo.runtime.PageContext; 005 import railo.runtime.ext.function.Function; 006 import railo.runtime.op.Decision; 007 import railo.runtime.type.Array; 008 import railo.runtime.type.List; 009 010 /** 011 * Implements the Cold Fusion Function listqualify 012 */ 013 public final class ListQualify implements Function { 014 015 private static final long serialVersionUID = -7450079285934992224L; 016 017 public static String call(PageContext pc , String list, String qualifier) { 018 return call(pc,list,qualifier,",","all", false, false); 019 } 020 021 public static String call(PageContext pc , String list, String qualifier, String delimeter) { 022 return call(pc,list,qualifier,delimeter,"all", false, false); 023 } 024 025 public static String call(PageContext pc , String list, String qualifier, String delimeter, String elements) { 026 return call(pc, list, qualifier, delimeter, elements, false, false); 027 } 028 029 public static String call(PageContext pc , String list, String qualifier, String delimeter, String elements, boolean includeEmptyFields) { 030 return call(pc, list, qualifier, delimeter, elements, includeEmptyFields, false); 031 } 032 033 public static String call(PageContext pc , String list, String qualifier, String delimeter, String elements, boolean includeEmptyFields, 034 boolean psq // this is used only internally by railo, search for "PSQ-BIF" in code 035 ) { 036 037 if(list.length()==0) return ""; 038 if(psq)list=StringUtil.replace(list, "'", "''", false); 039 040 Array arr=includeEmptyFields?List.listToArray(list,delimeter):List.listToArrayRemoveEmpty(list,delimeter); 041 042 boolean isQChar=qualifier.length()==1; 043 boolean isDChar=delimeter.length()==1; 044 045 if(isQChar && isDChar) return doIt(arr,qualifier.charAt(0),delimeter.charAt(0),elements); 046 else if(isQChar && !isDChar) return doIt(arr,qualifier.charAt(0),delimeter,elements); 047 else if(!isQChar && isDChar) return doIt(arr,qualifier,delimeter.charAt(0),elements); 048 else return doIt(arr,qualifier,delimeter,elements); 049 050 } 051 052 private static String doIt(Array arr, char qualifier, char delimeter, String elements) { 053 StringBuffer rtn=new StringBuffer(); 054 int len=arr.size(); 055 056 if(StringUtil.toLowerCase(elements).equals("all")) { 057 rtn.append(qualifier); 058 rtn.append(arr.get(1,"")); 059 rtn.append(qualifier); 060 for(int i=2;i<=len;i++) { 061 rtn.append(delimeter); 062 rtn.append(qualifier); 063 rtn.append(arr.get(i,"")); 064 rtn.append(qualifier); 065 } 066 } 067 else { 068 qualifyString(rtn,arr.get(1,"").toString(),qualifier); 069 for(int i=2;i<=len;i++) { 070 rtn.append(delimeter); 071 qualifyString(rtn,arr.get(i,"").toString(),qualifier); 072 } 073 } 074 return rtn.toString(); 075 } 076 private static String doIt(Array arr, char qualifier, String delimeter, String scope) { 077 StringBuffer rtn=new StringBuffer(); 078 int len=arr.size(); 079 080 if(StringUtil.toLowerCase(scope).equals("all")) { 081 rtn.append(qualifier); 082 rtn.append(arr.get(1,"")); 083 rtn.append(qualifier); 084 for(int i=2;i<=len;i++) { 085 rtn.append(delimeter); 086 rtn.append(qualifier); 087 rtn.append(arr.get(i,"")); 088 rtn.append(qualifier); 089 } 090 } 091 else { 092 qualifyString(rtn,arr.get(1,"").toString(),qualifier); 093 for(int i=2;i<=len;i++) { 094 rtn.append(delimeter); 095 qualifyString(rtn,arr.get(i,"").toString(),qualifier); 096 } 097 } 098 return rtn.toString(); 099 } 100 private static String doIt(Array arr, String qualifier, char delimeter, String scope) { 101 StringBuffer rtn=new StringBuffer(); 102 int len=arr.size(); 103 104 if(StringUtil.toLowerCase(scope).equals("all")) { 105 rtn.append(qualifier); 106 rtn.append(arr.get(1,"")); 107 rtn.append(qualifier); 108 for(int i=2;i<=len;i++) { 109 rtn.append(delimeter); 110 rtn.append(qualifier); 111 rtn.append(arr.get(i,"")); 112 rtn.append(qualifier); 113 } 114 } 115 else { 116 qualifyString(rtn,arr.get(1,"").toString(),qualifier); 117 for(int i=2;i<=len;i++) { 118 rtn.append(delimeter); 119 qualifyString(rtn,arr.get(i,"").toString(),qualifier); 120 } 121 } 122 return rtn.toString(); 123 } 124 private static String doIt(Array arr, String qualifier, String delimeter, String scope) { 125 StringBuffer rtn=new StringBuffer(); 126 int len=arr.size(); 127 128 if(StringUtil.toLowerCase(scope).equals("all")) { 129 rtn.append(qualifier); 130 rtn.append(arr.get(1,"")); 131 rtn.append(qualifier); 132 for(int i=2;i<=len;i++) { 133 rtn.append(delimeter); 134 rtn.append(qualifier); 135 rtn.append(arr.get(i,"")); 136 rtn.append(qualifier); 137 } 138 } 139 else { 140 qualifyString(rtn,arr.get(1,"").toString(),qualifier); 141 for(int i=2;i<=len;i++) { 142 rtn.append(delimeter); 143 qualifyString(rtn,arr.get(i,"").toString(),qualifier); 144 } 145 } 146 return rtn.toString(); 147 } 148 149 150 private static void qualifyString(StringBuffer rtn,String value,String qualifier) { 151 if(Decision.isNumeric(value)) rtn.append(value); 152 else { 153 rtn.append(qualifier); 154 rtn.append(value); 155 rtn.append(qualifier); 156 } 157 } 158 private static void qualifyString(StringBuffer rtn,String value,char qualifier) { 159 if(Decision.isNumeric(value)) rtn.append(value); 160 else { 161 rtn.append(qualifier); 162 rtn.append(value); 163 rtn.append(qualifier); 164 } 165 } 166 }