001    package railo.intergral.fusiondebug.server.util;
002    
003    
004    
005    
006    
007    
008    public class FDUtil {
009            
010            /**
011             * replace the last occurrence of from with to
012             * @param str
013             * @param from
014             * @param to
015             * @return changed string
016             */
017            private static String replaceLast(String str, char from, char to) {
018                    int index = str.lastIndexOf(from);
019                    if(index==-1)return str;
020                    return str.substring(0,index)+to+str.substring(index+1);
021            }
022            
023            /**
024             * if given string is a keyword it will be replaced with none keyword
025             * @param str
026             * @return corrected word
027             */
028            private static String correctReservedWord(String str) {
029                    char first=str.charAt(0);
030                    
031                    switch(first) {
032                    case 'a':
033                            if(str.equals("abstract")) return "_"+str;
034                    break;
035                    case 'b':
036                            if(str.equals("boolean")) return "_"+str;
037                            else if(str.equals("break")) return "_"+str;
038                            else if(str.equals("byte")) return "_"+str;
039                    break;
040                    case 'c':
041                            if(str.equals("case")) return "_"+str;
042                            else if(str.equals("catch")) return "_"+str;
043                            else if(str.equals("char")) return "_"+str;
044                            else if(str.equals("const")) return "_"+str;
045                            else if(str.equals("class")) return "_"+str;
046                            else if(str.equals("continue")) return "_"+str;
047                    break;
048                    case 'd':
049                            if(str.equals("default")) return "_"+str;
050                            else if(str.equals("do")) return "_"+str;
051                            else if(str.equals("double")) return "_"+str;
052                    break;
053                    case 'e':
054                            if(str.equals("else")) return "_"+str;
055                            else if(str.equals("extends")) return "_"+str;
056                            else if(str.equals("enum")) return "_"+str;
057                    break;
058                    case 'f':
059                            if(str.equals("false")) return "_"+str;
060                            else if(str.equals("final")) return "_"+str;
061                            else if(str.equals("finally")) return "_"+str;
062                            else if(str.equals("float")) return "_"+str;
063                            else if(str.equals("for")) return "_"+str;
064                    break;
065                    case 'g':
066                            if(str.equals("goto")) return "_"+str;
067                    break;
068                    case 'i':
069                            if(str.equals("if")) return "_"+str;
070                            else if(str.equals("implements")) return "_"+str;
071                            else if(str.equals("import")) return "_"+str;
072                            else if(str.equals("instanceof")) return "_"+str;
073                            else if(str.equals("int")) return "_"+str;
074                            else if(str.equals("interface")) return "_"+str;
075                    break;
076                    case 'n':
077                            if(str.equals("native")) return "_"+str;
078                            else if(str.equals("new")) return "_"+str;
079                            else if(str.equals("null")) return "_"+str;
080                    break;
081                    case 'p':
082                            if(str.equals("package")) return "_"+str;
083                            else if(str.equals("private")) return "_"+str;
084                            else if(str.equals("protected")) return "_"+str;
085                            else if(str.equals("public")) return "_"+str;
086                    break;
087                    case 'r':
088                            if(str.equals("return")) return "_"+str;
089                    break;
090                    case 's':
091                            if(str.equals("short")) return "_"+str;
092                            else if(str.equals("static")) return "_"+str;
093                            else if(str.equals("strictfp")) return "_"+str;
094                            else if(str.equals("super")) return "_"+str;
095                            else if(str.equals("switch")) return "_"+str;
096                            else if(str.equals("synchronized")) return "_"+str;
097                    break;
098                    case 't':
099                            if(str.equals("this")) return "_"+str;
100                            else if(str.equals("throw")) return "_"+str;
101                            else if(str.equals("throws")) return "_"+str;
102                            else if(str.equals("transient")) return "_"+str;
103                            else if(str.equals("true")) return "_"+str;
104                            else if(str.equals("try")) return "_"+str;
105                    break;
106                    case 'v':
107                            if(str.equals("void")) return "_"+str;
108                            else if(str.equals("volatile")) return "_"+str;
109                    break;
110                    case 'w':
111                            if(str.equals("while")) return "_"+str;
112                    break;
113                    }
114                    return str;
115                    
116            }
117            
118            /**
119             * translate a string to a valid variable string
120             * @param str string to translate
121             * @return translated String
122             */
123            private static String toVariableName(String str) {
124                    
125                    StringBuffer rtn=new StringBuffer();
126                    char[] chars=str.toCharArray();
127                    long changes=0;
128                    boolean doCorrect=true;
129                    for(int i=0;i<chars.length;i++) {
130                            char c=chars[i];
131                            if(i==0 && (c>='0' && c<='9'))rtn.append("_"+c);
132                            else if((c>='a' && c<='z') ||(c>='A' && c<='Z') ||(c>='0' && c<='9') || c=='_' || c=='$')
133                                    rtn.append(c);
134                            else {  
135                                doCorrect=false;
136                                    rtn.append('_');
137                                    //if(!(c=='.' && str.substring(i).equals(".cfm")))
138                                    changes+=(c*(i+1));
139                            }
140                    }
141                    
142                    if(changes>0)rtn.append(changes);
143                    
144                    if(doCorrect)return correctReservedWord(rtn.toString());
145                    return rtn.toString();
146            }
147            
148            /**
149             * creates a classbane from give source path
150             * @param str
151             * @return
152             */
153            public static String toClassName(String str) {
154                    StringBuffer javaName=new StringBuffer();
155                    String[] arr=railo.runtime.type.List.listToStringArray(str, '/');
156                    
157                    for(int i=0;i<arr.length;i++) {
158                            if(i==(arr.length-1)) arr[i]=replaceLast(arr[i],'.','$');
159                            if(i!=0)javaName.append('.');
160                            javaName.append(toVariableName(arr[i]));
161                    }
162                    return javaName.toString().toLowerCase();
163            }
164    }