1 25 package com.yworks.yguard; 26 27 import com.yworks.yguard.obf.ClassTree; 28 import java.util.StringTokenizer ; 29 30 34 public class Conversion 35 { 36 37 38 protected Conversion(){} 39 40 public static String toJavaClass(String className){ 41 if (className.endsWith(".class")){ 42 className = className.substring(0, className.length()- 6); 43 } 44 return className.replace('/','.'); 45 } 46 47 48 public static String toJavaType(String type){ 49 StringBuffer nat = new StringBuffer (30); 50 int arraydim = 0; 51 while (type.charAt(arraydim)=='[') arraydim++; 52 type = type.substring(arraydim); 53 switch (type.charAt(0)){ 54 default: 55 throw new IllegalArgumentException ("unknown native type:"+type); 56 case 'B': 57 nat.append("byte"); 58 break; 59 case 'C': 60 nat.append("char"); 61 break; 62 case 'D': 63 nat.append("double"); 64 break; 65 case 'F': 66 nat.append("float"); 67 break; 68 case 'I': 69 nat.append("int"); 70 break; 71 case 'J': 72 nat.append("long"); 73 break; 74 case 'S': 75 nat.append("short"); 76 break; 77 case 'Z': 78 nat.append("boolean"); 79 break; 80 case 'V': 81 nat.append("void"); 82 break; 83 case 'L': 84 String className = type.substring(1, type.length()-1); 85 if (className.indexOf('<') >= 0){ 86 String parameters = type.substring(className.indexOf('<') + 2, className.lastIndexOf('>') - 1); 87 className = className.substring(0, className.indexOf('<') ); 88 nat.append(className.replace('/','.')); 89 nat.append('<'); 90 nat.append(toJavaParameters(parameters)); 91 nat.append('>'); 92 } else { 93 nat.append(className.replace('/','.')); 94 } 95 break; 96 } 97 for (int i = 0; i < arraydim; i++){ 98 nat.append("[]"); 99 } 100 return nat.toString(); 101 } 102 103 105 public static String mapSignature(String signature){ 106 return new ClassTree().mapSignature(signature); 107 } 108 109 110 public static String toJavaParameters(String parameters){ 111 StringBuffer nat = new StringBuffer (30); 112 switch (parameters.charAt(0)){ 113 default: 114 throw new IllegalArgumentException ("unknown native type:"+parameters.charAt(0)); 115 case '+': 116 nat.append("? extends ").append(toJavaParameters(parameters.substring(1))); 117 break; 118 case '-': 119 nat.append("? super ").append(toJavaParameters(parameters.substring(1))); 120 break; 121 case '*': 122 nat.append("*"); 123 if (parameters.length() > 1){ 124 nat.append(", ").append(toJavaParameters(parameters.substring(1))); 125 } 126 break; 127 case 'B': 128 nat.append("byte"); 129 break; 130 case 'C': 131 nat.append("char"); 132 break; 133 case 'D': 134 nat.append("double"); 135 break; 136 case 'F': 137 nat.append("float"); 138 break; 139 case 'I': 140 nat.append("int"); 141 break; 142 case 'J': 143 nat.append("long"); 144 break; 145 case 'S': 146 nat.append("short"); 147 break; 148 case 'Z': 149 nat.append("boolean"); 150 break; 151 case 'V': 152 nat.append("void"); 153 break; 154 case 'L': 155 int len = parameters.indexOf('<'); 156 if (len >= 0){ 157 len = Math.min(len, parameters.indexOf(';')); 158 } 159 break; 160 case 'T': 161 int index = parameters.indexOf(';'); 162 nat.append(parameters.substring(1, index)); 163 if (parameters.length() > index){ 164 nat.append(", "); 165 nat.append(parameters.substring(index)); 166 } 167 break; 168 } 169 return nat.toString(); 170 } 171 172 public static String toJavaMethod(String name, String signature){ 173 String argsonly = signature.substring(signature.indexOf('(')+1); 174 String ret = signature.substring(signature.indexOf(')')+1); 175 ret = toJavaType(ret); 176 StringBuffer args = new StringBuffer (); 177 args.append('('); 178 if (argsonly.indexOf(')')>0){ 179 argsonly = argsonly.substring(0,argsonly.indexOf(')')); 180 toJavaArguments(argsonly, args); 181 } 182 args.append(')'); 183 return ret+" "+name+args.toString(); 184 } 185 186 public static String toJavaArguments(String args){ 187 StringBuffer b= new StringBuffer (args.length() + 32); 188 toJavaArguments(args, b); 189 return b.toString(); 190 } 191 192 private static void toJavaArguments(String argsonly, StringBuffer args) { 193 int argcount = 0; 194 int pos = 0; 195 StringBuffer arg = new StringBuffer (20); 196 while (pos < argsonly.length()){ 197 while (argsonly.charAt(pos) == '['){ 198 arg.append('['); 199 pos++; 200 } 201 if (argsonly.charAt(pos) == 'L'){ 202 while (argsonly.charAt(pos) != ';'){ 203 arg.append(argsonly.charAt(pos)); 204 pos++; 205 } 206 arg.append(';'); 207 if (argcount > 0){ 208 args.append(','); 209 args.append(' '); 210 } 211 args.append(toJavaType(arg.toString())); 212 argcount++; 213 arg.setLength(0); 214 pos++; 215 } else { 216 arg.append(argsonly.charAt(pos)); 217 if (argcount > 0){ 218 args.append(','); 219 args.append(' '); 220 } 221 args.append(toJavaType(arg.toString())); 222 argcount++; 223 arg.setLength(0); 224 pos++; 225 } 226 } 227 } 228 } 229 | Popular Tags |