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 }