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    }