comparison src/org/eclipse/jetty/util/TypeUtil.java @ 830:7c737c376bc3

remove Loader
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 15 Sep 2016 18:30:38 -0600
parents 8e9db0bbf4f9
children
comparison
equal deleted inserted replaced
829:dfa742c663f9 830:7c737c376bc3
42 * 42 *
43 * @since Jetty 4.1 43 * @since Jetty 4.1
44 */ 44 */
45 public class TypeUtil 45 public class TypeUtil
46 { 46 {
47 private static final Logger LOG = LoggerFactory.getLogger(TypeUtil.class); 47 private static final Logger LOG = LoggerFactory.getLogger(TypeUtil.class);
48 public static int CR = '\015'; 48 public static int CR = '\015';
49 public static int LF = '\012'; 49 public static int LF = '\012';
50 50
51 /* ------------------------------------------------------------ */ 51 /* ------------------------------------------------------------ */
52 private static final HashMap<String, Class<?>> name2Class=new HashMap<String, Class<?>>(); 52 private static final HashMap<String, Class<?>> name2Class=new HashMap<String, Class<?>>();
53 static 53 static
54 { 54 {
55 name2Class.put("boolean",java.lang.Boolean.TYPE); 55 name2Class.put("boolean",java.lang.Boolean.TYPE);
56 name2Class.put("byte",java.lang.Byte.TYPE); 56 name2Class.put("byte",java.lang.Byte.TYPE);
57 name2Class.put("char",java.lang.Character.TYPE); 57 name2Class.put("char",java.lang.Character.TYPE);
58 name2Class.put("double",java.lang.Double.TYPE); 58 name2Class.put("double",java.lang.Double.TYPE);
59 name2Class.put("float",java.lang.Float.TYPE); 59 name2Class.put("float",java.lang.Float.TYPE);
60 name2Class.put("int",java.lang.Integer.TYPE); 60 name2Class.put("int",java.lang.Integer.TYPE);
61 name2Class.put("long",java.lang.Long.TYPE); 61 name2Class.put("long",java.lang.Long.TYPE);
62 name2Class.put("short",java.lang.Short.TYPE); 62 name2Class.put("short",java.lang.Short.TYPE);
63 name2Class.put("void",java.lang.Void.TYPE); 63 name2Class.put("void",java.lang.Void.TYPE);
64 64
65 name2Class.put("java.lang.Boolean.TYPE",java.lang.Boolean.TYPE); 65 name2Class.put("java.lang.Boolean.TYPE",java.lang.Boolean.TYPE);
66 name2Class.put("java.lang.Byte.TYPE",java.lang.Byte.TYPE); 66 name2Class.put("java.lang.Byte.TYPE",java.lang.Byte.TYPE);
67 name2Class.put("java.lang.Character.TYPE",java.lang.Character.TYPE); 67 name2Class.put("java.lang.Character.TYPE",java.lang.Character.TYPE);
68 name2Class.put("java.lang.Double.TYPE",java.lang.Double.TYPE); 68 name2Class.put("java.lang.Double.TYPE",java.lang.Double.TYPE);
69 name2Class.put("java.lang.Float.TYPE",java.lang.Float.TYPE); 69 name2Class.put("java.lang.Float.TYPE",java.lang.Float.TYPE);
70 name2Class.put("java.lang.Integer.TYPE",java.lang.Integer.TYPE); 70 name2Class.put("java.lang.Integer.TYPE",java.lang.Integer.TYPE);
71 name2Class.put("java.lang.Long.TYPE",java.lang.Long.TYPE); 71 name2Class.put("java.lang.Long.TYPE",java.lang.Long.TYPE);
72 name2Class.put("java.lang.Short.TYPE",java.lang.Short.TYPE); 72 name2Class.put("java.lang.Short.TYPE",java.lang.Short.TYPE);
73 name2Class.put("java.lang.Void.TYPE",java.lang.Void.TYPE); 73 name2Class.put("java.lang.Void.TYPE",java.lang.Void.TYPE);
74 74
75 name2Class.put("java.lang.Boolean",java.lang.Boolean.class); 75 name2Class.put("java.lang.Boolean",java.lang.Boolean.class);
76 name2Class.put("java.lang.Byte",java.lang.Byte.class); 76 name2Class.put("java.lang.Byte",java.lang.Byte.class);
77 name2Class.put("java.lang.Character",java.lang.Character.class); 77 name2Class.put("java.lang.Character",java.lang.Character.class);
78 name2Class.put("java.lang.Double",java.lang.Double.class); 78 name2Class.put("java.lang.Double",java.lang.Double.class);
79 name2Class.put("java.lang.Float",java.lang.Float.class); 79 name2Class.put("java.lang.Float",java.lang.Float.class);
80 name2Class.put("java.lang.Integer",java.lang.Integer.class); 80 name2Class.put("java.lang.Integer",java.lang.Integer.class);
81 name2Class.put("java.lang.Long",java.lang.Long.class); 81 name2Class.put("java.lang.Long",java.lang.Long.class);
82 name2Class.put("java.lang.Short",java.lang.Short.class); 82 name2Class.put("java.lang.Short",java.lang.Short.class);
83 83
84 name2Class.put("Boolean",java.lang.Boolean.class); 84 name2Class.put("Boolean",java.lang.Boolean.class);
85 name2Class.put("Byte",java.lang.Byte.class); 85 name2Class.put("Byte",java.lang.Byte.class);
86 name2Class.put("Character",java.lang.Character.class); 86 name2Class.put("Character",java.lang.Character.class);
87 name2Class.put("Double",java.lang.Double.class); 87 name2Class.put("Double",java.lang.Double.class);
88 name2Class.put("Float",java.lang.Float.class); 88 name2Class.put("Float",java.lang.Float.class);
89 name2Class.put("Integer",java.lang.Integer.class); 89 name2Class.put("Integer",java.lang.Integer.class);
90 name2Class.put("Long",java.lang.Long.class); 90 name2Class.put("Long",java.lang.Long.class);
91 name2Class.put("Short",java.lang.Short.class); 91 name2Class.put("Short",java.lang.Short.class);
92 92
93 name2Class.put(null,java.lang.Void.TYPE); 93 name2Class.put(null,java.lang.Void.TYPE);
94 name2Class.put("string",java.lang.String.class); 94 name2Class.put("string",java.lang.String.class);
95 name2Class.put("String",java.lang.String.class); 95 name2Class.put("String",java.lang.String.class);
96 name2Class.put("java.lang.String",java.lang.String.class); 96 name2Class.put("java.lang.String",java.lang.String.class);
97 } 97 }
98 98
99 /* ------------------------------------------------------------ */ 99 /* ------------------------------------------------------------ */
100 private static final HashMap<Class<?>, String> class2Name=new HashMap<Class<?>, String>(); 100 private static final HashMap<Class<?>, String> class2Name=new HashMap<Class<?>, String>();
101 static 101 static
102 { 102 {
103 class2Name.put(java.lang.Boolean.TYPE,"boolean"); 103 class2Name.put(java.lang.Boolean.TYPE,"boolean");
104 class2Name.put(java.lang.Byte.TYPE,"byte"); 104 class2Name.put(java.lang.Byte.TYPE,"byte");
105 class2Name.put(java.lang.Character.TYPE,"char"); 105 class2Name.put(java.lang.Character.TYPE,"char");
106 class2Name.put(java.lang.Double.TYPE,"double"); 106 class2Name.put(java.lang.Double.TYPE,"double");
107 class2Name.put(java.lang.Float.TYPE,"float"); 107 class2Name.put(java.lang.Float.TYPE,"float");
108 class2Name.put(java.lang.Integer.TYPE,"int"); 108 class2Name.put(java.lang.Integer.TYPE,"int");
109 class2Name.put(java.lang.Long.TYPE,"long"); 109 class2Name.put(java.lang.Long.TYPE,"long");
110 class2Name.put(java.lang.Short.TYPE,"short"); 110 class2Name.put(java.lang.Short.TYPE,"short");
111 class2Name.put(java.lang.Void.TYPE,"void"); 111 class2Name.put(java.lang.Void.TYPE,"void");
112 112
113 class2Name.put(java.lang.Boolean.class,"java.lang.Boolean"); 113 class2Name.put(java.lang.Boolean.class,"java.lang.Boolean");
114 class2Name.put(java.lang.Byte.class,"java.lang.Byte"); 114 class2Name.put(java.lang.Byte.class,"java.lang.Byte");
115 class2Name.put(java.lang.Character.class,"java.lang.Character"); 115 class2Name.put(java.lang.Character.class,"java.lang.Character");
116 class2Name.put(java.lang.Double.class,"java.lang.Double"); 116 class2Name.put(java.lang.Double.class,"java.lang.Double");
117 class2Name.put(java.lang.Float.class,"java.lang.Float"); 117 class2Name.put(java.lang.Float.class,"java.lang.Float");
118 class2Name.put(java.lang.Integer.class,"java.lang.Integer"); 118 class2Name.put(java.lang.Integer.class,"java.lang.Integer");
119 class2Name.put(java.lang.Long.class,"java.lang.Long"); 119 class2Name.put(java.lang.Long.class,"java.lang.Long");
120 class2Name.put(java.lang.Short.class,"java.lang.Short"); 120 class2Name.put(java.lang.Short.class,"java.lang.Short");
121 121
122 class2Name.put(null,"void"); 122 class2Name.put(null,"void");
123 class2Name.put(java.lang.String.class,"java.lang.String"); 123 class2Name.put(java.lang.String.class,"java.lang.String");
124 } 124 }
125 125
126 /* ------------------------------------------------------------ */ 126 /* ------------------------------------------------------------ */
127 private static final HashMap<Class<?>, Method> class2Value=new HashMap<Class<?>, Method>(); 127 private static final HashMap<Class<?>, Method> class2Value=new HashMap<Class<?>, Method>();
128 static 128 static
129 { 129 {
130 try 130 try
131 { 131 {
132 Class<?>[] s ={java.lang.String.class}; 132 Class<?>[] s ={java.lang.String.class};
133 133
134 class2Value.put(java.lang.Boolean.TYPE, 134 class2Value.put(java.lang.Boolean.TYPE,
135 java.lang.Boolean.class.getMethod("valueOf",s)); 135 java.lang.Boolean.class.getMethod("valueOf",s));
136 class2Value.put(java.lang.Byte.TYPE, 136 class2Value.put(java.lang.Byte.TYPE,
137 java.lang.Byte.class.getMethod("valueOf",s)); 137 java.lang.Byte.class.getMethod("valueOf",s));
138 class2Value.put(java.lang.Double.TYPE, 138 class2Value.put(java.lang.Double.TYPE,
139 java.lang.Double.class.getMethod("valueOf",s)); 139 java.lang.Double.class.getMethod("valueOf",s));
140 class2Value.put(java.lang.Float.TYPE, 140 class2Value.put(java.lang.Float.TYPE,
141 java.lang.Float.class.getMethod("valueOf",s)); 141 java.lang.Float.class.getMethod("valueOf",s));
142 class2Value.put(java.lang.Integer.TYPE, 142 class2Value.put(java.lang.Integer.TYPE,
143 java.lang.Integer.class.getMethod("valueOf",s)); 143 java.lang.Integer.class.getMethod("valueOf",s));
144 class2Value.put(java.lang.Long.TYPE, 144 class2Value.put(java.lang.Long.TYPE,
145 java.lang.Long.class.getMethod("valueOf",s)); 145 java.lang.Long.class.getMethod("valueOf",s));
146 class2Value.put(java.lang.Short.TYPE, 146 class2Value.put(java.lang.Short.TYPE,
147 java.lang.Short.class.getMethod("valueOf",s)); 147 java.lang.Short.class.getMethod("valueOf",s));
148 148
149 class2Value.put(java.lang.Boolean.class, 149 class2Value.put(java.lang.Boolean.class,
150 java.lang.Boolean.class.getMethod("valueOf",s)); 150 java.lang.Boolean.class.getMethod("valueOf",s));
151 class2Value.put(java.lang.Byte.class, 151 class2Value.put(java.lang.Byte.class,
152 java.lang.Byte.class.getMethod("valueOf",s)); 152 java.lang.Byte.class.getMethod("valueOf",s));
153 class2Value.put(java.lang.Double.class, 153 class2Value.put(java.lang.Double.class,
154 java.lang.Double.class.getMethod("valueOf",s)); 154 java.lang.Double.class.getMethod("valueOf",s));
155 class2Value.put(java.lang.Float.class, 155 class2Value.put(java.lang.Float.class,
156 java.lang.Float.class.getMethod("valueOf",s)); 156 java.lang.Float.class.getMethod("valueOf",s));
157 class2Value.put(java.lang.Integer.class, 157 class2Value.put(java.lang.Integer.class,
158 java.lang.Integer.class.getMethod("valueOf",s)); 158 java.lang.Integer.class.getMethod("valueOf",s));
159 class2Value.put(java.lang.Long.class, 159 class2Value.put(java.lang.Long.class,
160 java.lang.Long.class.getMethod("valueOf",s)); 160 java.lang.Long.class.getMethod("valueOf",s));
161 class2Value.put(java.lang.Short.class, 161 class2Value.put(java.lang.Short.class,
162 java.lang.Short.class.getMethod("valueOf",s)); 162 java.lang.Short.class.getMethod("valueOf",s));
163 } 163 }
164 catch(Exception e) 164 catch(Exception e)
165 { 165 {
166 throw new Error(e); 166 throw new Error(e);
167 } 167 }
168 } 168 }
169 169
170 /* ------------------------------------------------------------ */ 170 /* ------------------------------------------------------------ */
171 /** Array to List. 171 /** Array to List.
172 * <p> 172 * <p>
173 * Works like {@link Arrays#asList(Object...)}, but handles null arrays. 173 * Works like {@link Arrays#asList(Object...)}, but handles null arrays.
174 * @return a list backed by the array. 174 * @return a list backed by the array.
175 */ 175 */
176 public static <T> List<T> asList(T[] a) 176 public static <T> List<T> asList(T[] a)
177 { 177 {
178 if (a==null) 178 if (a==null)
179 return Collections.emptyList(); 179 return Collections.emptyList();
180 return Arrays.asList(a); 180 return Arrays.asList(a);
181 } 181 }
182 182
183 /* ------------------------------------------------------------ */ 183 /* ------------------------------------------------------------ */
184 /** Class from a canonical name for a type. 184 /** Class from a canonical name for a type.
185 * @param name A class or type name. 185 * @param name A class or type name.
186 * @return A class , which may be a primitive TYPE field.. 186 * @return A class , which may be a primitive TYPE field..
187 */ 187 */
188 public static Class<?> fromName(String name) 188 public static Class<?> fromName(String name)
189 { 189 {
190 return name2Class.get(name); 190 return name2Class.get(name);
191 } 191 }
192 192
193 /* ------------------------------------------------------------ */ 193 /* ------------------------------------------------------------ */
194 /** Canonical name for a type. 194 /** Canonical name for a type.
195 * @param type A class , which may be a primitive TYPE field. 195 * @param type A class , which may be a primitive TYPE field.
196 * @return Canonical name. 196 * @return Canonical name.
197 */ 197 */
198 public static String toName(Class<?> type) 198 public static String toName(Class<?> type)
199 { 199 {
200 return class2Name.get(type); 200 return class2Name.get(type);
201 } 201 }
202 202
203 /* ------------------------------------------------------------ */ 203 /* ------------------------------------------------------------ */
204 /** Convert String value to instance. 204 /** Convert String value to instance.
205 * @param type The class of the instance, which may be a primitive TYPE field. 205 * @param type The class of the instance, which may be a primitive TYPE field.
206 * @param value The value as a string. 206 * @param value The value as a string.
207 * @return The value as an Object. 207 * @return The value as an Object.
208 */ 208 */
209 public static Object valueOf(Class<?> type, String value) 209 public static Object valueOf(Class<?> type, String value)
210 { 210 {
211 try 211 try
212 { 212 {
213 if (type.equals(java.lang.String.class)) 213 if (type.equals(java.lang.String.class))
214 return value; 214 return value;
215 215
216 Method m = class2Value.get(type); 216 Method m = class2Value.get(type);
217 if (m!=null) 217 if (m!=null)
218 return m.invoke(null, value); 218 return m.invoke(null, value);
219 219
220 if (type.equals(java.lang.Character.TYPE) || 220 if (type.equals(java.lang.Character.TYPE) ||
221 type.equals(java.lang.Character.class)) 221 type.equals(java.lang.Character.class))
222 return new Character(value.charAt(0)); 222 return new Character(value.charAt(0));
223 223
224 Constructor<?> c = type.getConstructor(java.lang.String.class); 224 Constructor<?> c = type.getConstructor(java.lang.String.class);
225 return c.newInstance(value); 225 return c.newInstance(value);
226 } 226 }
227 catch(NoSuchMethodException e) 227 catch(NoSuchMethodException e)
228 { 228 {
229 // LogSupport.ignore(log,e); 229 // LogSupport.ignore(log,e);
230 } 230 }
231 catch(IllegalAccessException e) 231 catch(IllegalAccessException e)
232 { 232 {
233 // LogSupport.ignore(log,e); 233 // LogSupport.ignore(log,e);
234 } 234 }
235 catch(InstantiationException e) 235 catch(InstantiationException e)
236 { 236 {
237 // LogSupport.ignore(log,e); 237 // LogSupport.ignore(log,e);
238 } 238 }
239 catch(InvocationTargetException e) 239 catch(InvocationTargetException e)
240 { 240 {
241 if (e.getTargetException() instanceof Error) 241 if (e.getTargetException() instanceof Error)
242 throw (Error)(e.getTargetException()); 242 throw (Error)(e.getTargetException());
243 // LogSupport.ignore(log,e); 243 // LogSupport.ignore(log,e);
244 } 244 }
245 return null; 245 return null;
246 } 246 }
247 247
248 /* ------------------------------------------------------------ */ 248 /* ------------------------------------------------------------ */
249 /** Convert String value to instance. 249 /** Convert String value to instance.
250 * @param type classname or type (eg int) 250 * @param type classname or type (eg int)
251 * @param value The value as a string. 251 * @param value The value as a string.
252 * @return The value as an Object. 252 * @return The value as an Object.
253 */ 253 */
254 public static Object valueOf(String type, String value) 254 public static Object valueOf(String type, String value)
255 { 255 {
256 return valueOf(fromName(type),value); 256 return valueOf(fromName(type),value);
257 } 257 }
258 258
259 /* ------------------------------------------------------------ */ 259 /* ------------------------------------------------------------ */
260 /** Parse an int from a substring. 260 /** Parse an int from a substring.
261 * Negative numbers are not handled. 261 * Negative numbers are not handled.
262 * @param s String 262 * @param s String
263 * @param offset Offset within string 263 * @param offset Offset within string
264 * @param length Length of integer or -1 for remainder of string 264 * @param length Length of integer or -1 for remainder of string
265 * @param base base of the integer 265 * @param base base of the integer
266 * @return the parsed integer 266 * @return the parsed integer
267 * @throws NumberFormatException if the string cannot be parsed 267 * @throws NumberFormatException if the string cannot be parsed
268 */ 268 */
269 public static int parseInt(String s, int offset, int length, int base) 269 public static int parseInt(String s, int offset, int length, int base)
270 throws NumberFormatException 270 throws NumberFormatException
271 { 271 {
272 int value=0; 272 int value=0;
273 273
274 if (length<0) 274 if (length<0)
275 length=s.length()-offset; 275 length=s.length()-offset;
276 276
277 for (int i=0;i<length;i++) 277 for (int i=0;i<length;i++)
278 { 278 {
279 char c=s.charAt(offset+i); 279 char c=s.charAt(offset+i);
280 280
281 int digit=convertHexDigit((int)c); 281 int digit=convertHexDigit((int)c);
282 if (digit<0 || digit>=base) 282 if (digit<0 || digit>=base)
283 throw new NumberFormatException(s.substring(offset,offset+length)); 283 throw new NumberFormatException(s.substring(offset,offset+length));
284 value=value*base+digit; 284 value=value*base+digit;
285 } 285 }
286 return value; 286 return value;
287 } 287 }
288 288
289 /* ------------------------------------------------------------ */ 289 /* ------------------------------------------------------------ */
290 /** Parse an int from a byte array of ascii characters. 290 /** Parse an int from a byte array of ascii characters.
291 * Negative numbers are not handled. 291 * Negative numbers are not handled.
292 * @param b byte array 292 * @param b byte array
293 * @param offset Offset within string 293 * @param offset Offset within string
294 * @param length Length of integer or -1 for remainder of string 294 * @param length Length of integer or -1 for remainder of string
295 * @param base base of the integer 295 * @param base base of the integer
296 * @return the parsed integer 296 * @return the parsed integer
297 * @throws NumberFormatException if the array cannot be parsed into an integer 297 * @throws NumberFormatException if the array cannot be parsed into an integer
298 */ 298 */
299 public static int parseInt(byte[] b, int offset, int length, int base) 299 public static int parseInt(byte[] b, int offset, int length, int base)
300 throws NumberFormatException 300 throws NumberFormatException
301 { 301 {
302 int value=0; 302 int value=0;
303 303
304 if (length<0) 304 if (length<0)
305 length=b.length-offset; 305 length=b.length-offset;
306 306
307 for (int i=0;i<length;i++) 307 for (int i=0;i<length;i++)
308 { 308 {
309 char c=(char)(0xff&b[offset+i]); 309 char c=(char)(0xff&b[offset+i]);
310 310
311 int digit=c-'0'; 311 int digit=c-'0';
312 if (digit<0 || digit>=base || digit>=10) 312 if (digit<0 || digit>=base || digit>=10)
313 { 313 {
314 digit=10+c-'A'; 314 digit=10+c-'A';
315 if (digit<10 || digit>=base) 315 if (digit<10 || digit>=base)
316 digit=10+c-'a'; 316 digit=10+c-'a';
317 } 317 }
318 if (digit<0 || digit>=base) 318 if (digit<0 || digit>=base)
319 throw new NumberFormatException(new String(b,offset,length)); 319 throw new NumberFormatException(new String(b,offset,length));
320 value=value*base+digit; 320 value=value*base+digit;
321 } 321 }
322 return value; 322 return value;
323 } 323 }
324 324
325 /* ------------------------------------------------------------ */ 325 /* ------------------------------------------------------------ */
326 public static byte[] parseBytes(String s, int base) 326 public static byte[] parseBytes(String s, int base)
327 { 327 {
328 byte[] bytes=new byte[s.length()/2]; 328 byte[] bytes=new byte[s.length()/2];
329 for (int i=0;i<s.length();i+=2) 329 for (int i=0;i<s.length();i+=2)
330 bytes[i/2]=(byte)TypeUtil.parseInt(s,i,2,base); 330 bytes[i/2]=(byte)TypeUtil.parseInt(s,i,2,base);
331 return bytes; 331 return bytes;
332 } 332 }
333 333
334 /* ------------------------------------------------------------ */ 334 /* ------------------------------------------------------------ */
335 public static String toString(byte[] bytes, int base) 335 public static String toString(byte[] bytes, int base)
336 { 336 {
337 StringBuilder buf = new StringBuilder(); 337 StringBuilder buf = new StringBuilder();
338 for (byte b : bytes) 338 for (byte b : bytes)
339 { 339 {
340 int bi=0xff&b; 340 int bi=0xff&b;
341 int c='0'+(bi/base)%base; 341 int c='0'+(bi/base)%base;
342 if (c>'9') 342 if (c>'9')
343 c= 'a'+(c-'0'-10); 343 c= 'a'+(c-'0'-10);
344 buf.append((char)c); 344 buf.append((char)c);
345 c='0'+bi%base; 345 c='0'+bi%base;
346 if (c>'9') 346 if (c>'9')
347 c= 'a'+(c-'0'-10); 347 c= 'a'+(c-'0'-10);
348 buf.append((char)c); 348 buf.append((char)c);
349 } 349 }
350 return buf.toString(); 350 return buf.toString();
351 } 351 }
352 352
353 /* ------------------------------------------------------------ */ 353 /* ------------------------------------------------------------ */
354 /** 354 /**
355 * @param c An ASCII encoded character 0-9 a-f A-F 355 * @param c An ASCII encoded character 0-9 a-f A-F
356 * @return The byte value of the character 0-16. 356 * @return The byte value of the character 0-16.
357 */ 357 */
358 public static byte convertHexDigit( byte c ) 358 public static byte convertHexDigit( byte c )
359 { 359 {
360 byte b = (byte)((c & 0x1f) + ((c >> 6) * 0x19) - 0x10); 360 byte b = (byte)((c & 0x1f) + ((c >> 6) * 0x19) - 0x10);
361 if (b<0 || b>15) 361 if (b<0 || b>15)
362 throw new IllegalArgumentException("!hex "+c); 362 throw new IllegalArgumentException("!hex "+c);
363 return b; 363 return b;
364 } 364 }
365 365
366 /* ------------------------------------------------------------ */ 366 /* ------------------------------------------------------------ */
367 /** 367 /**
368 * @param c An ASCII encoded character 0-9 a-f A-F 368 * @param c An ASCII encoded character 0-9 a-f A-F
369 * @return The byte value of the character 0-16. 369 * @return The byte value of the character 0-16.
370 */ 370 */
371 public static int convertHexDigit( int c ) 371 public static int convertHexDigit( int c )
372 { 372 {
373 int d= ((c & 0x1f) + ((c >> 6) * 0x19) - 0x10); 373 int d= ((c & 0x1f) + ((c >> 6) * 0x19) - 0x10);
374 if (d<0 || d>15) 374 if (d<0 || d>15)
375 throw new NumberFormatException("!hex "+c); 375 throw new NumberFormatException("!hex "+c);
376 return d; 376 return d;
377 } 377 }
378 378
379 /* ------------------------------------------------------------ */ 379 /* ------------------------------------------------------------ */
380 public static void toHex(byte b,Appendable buf) 380 public static void toHex(byte b,Appendable buf)
381 { 381 {
382 try 382 try
383 { 383 {
384 int d=0xf&((0xF0&b)>>4); 384 int d=0xf&((0xF0&b)>>4);
385 buf.append((char)((d>9?('A'-10):'0')+d)); 385 buf.append((char)((d>9?('A'-10):'0')+d));
386 d=0xf&b; 386 d=0xf&b;
387 buf.append((char)((d>9?('A'-10):'0')+d)); 387 buf.append((char)((d>9?('A'-10):'0')+d));
388 } 388 }
389 catch(IOException e) 389 catch(IOException e)
390 { 390 {
391 throw new RuntimeException(e); 391 throw new RuntimeException(e);
392 } 392 }
393 } 393 }
394 394
395 /* ------------------------------------------------------------ */ 395 /* ------------------------------------------------------------ */
396 public static void toHex(int value,Appendable buf) throws IOException 396 public static void toHex(int value,Appendable buf) throws IOException
397 { 397 {
398 int d=0xf&((0xF0000000&value)>>28); 398 int d=0xf&((0xF0000000&value)>>28);
399 buf.append((char)((d>9?('A'-10):'0')+d)); 399 buf.append((char)((d>9?('A'-10):'0')+d));
400 d=0xf&((0x0F000000&value)>>24); 400 d=0xf&((0x0F000000&value)>>24);
401 buf.append((char)((d>9?('A'-10):'0')+d)); 401 buf.append((char)((d>9?('A'-10):'0')+d));
402 d=0xf&((0x00F00000&value)>>20); 402 d=0xf&((0x00F00000&value)>>20);
403 buf.append((char)((d>9?('A'-10):'0')+d)); 403 buf.append((char)((d>9?('A'-10):'0')+d));
404 d=0xf&((0x000F0000&value)>>16); 404 d=0xf&((0x000F0000&value)>>16);
405 buf.append((char)((d>9?('A'-10):'0')+d)); 405 buf.append((char)((d>9?('A'-10):'0')+d));
406 d=0xf&((0x0000F000&value)>>12); 406 d=0xf&((0x0000F000&value)>>12);
407 buf.append((char)((d>9?('A'-10):'0')+d)); 407 buf.append((char)((d>9?('A'-10):'0')+d));
408 d=0xf&((0x00000F00&value)>>8); 408 d=0xf&((0x00000F00&value)>>8);
409 buf.append((char)((d>9?('A'-10):'0')+d)); 409 buf.append((char)((d>9?('A'-10):'0')+d));
410 d=0xf&((0x000000F0&value)>>4); 410 d=0xf&((0x000000F0&value)>>4);
411 buf.append((char)((d>9?('A'-10):'0')+d)); 411 buf.append((char)((d>9?('A'-10):'0')+d));
412 d=0xf&value; 412 d=0xf&value;
413 buf.append((char)((d>9?('A'-10):'0')+d)); 413 buf.append((char)((d>9?('A'-10):'0')+d));
414 414
415 Integer.toString(0,36); 415 Integer.toString(0,36);
416 } 416 }
417 417
418 418
419 /* ------------------------------------------------------------ */ 419 /* ------------------------------------------------------------ */
420 public static void toHex(long value,Appendable buf) throws IOException 420 public static void toHex(long value,Appendable buf) throws IOException
421 { 421 {
422 toHex((int)(value>>32),buf); 422 toHex((int)(value>>32),buf);
423 toHex((int)value,buf); 423 toHex((int)value,buf);
424 } 424 }
425 425
426 /* ------------------------------------------------------------ */ 426 /* ------------------------------------------------------------ */
427 public static String toHexString(byte b) 427 public static String toHexString(byte b)
428 { 428 {
429 return toHexString(new byte[]{b}, 0, 1); 429 return toHexString(new byte[]{b}, 0, 1);
430 } 430 }
431 431
432 /* ------------------------------------------------------------ */ 432 /* ------------------------------------------------------------ */
433 public static String toHexString(byte[] b) 433 public static String toHexString(byte[] b)
434 { 434 {
435 return toHexString(b, 0, b.length); 435 return toHexString(b, 0, b.length);
436 } 436 }
437 437
438 /* ------------------------------------------------------------ */ 438 /* ------------------------------------------------------------ */
439 public static String toHexString(byte[] b,int offset,int length) 439 public static String toHexString(byte[] b,int offset,int length)
440 { 440 {
441 StringBuilder buf = new StringBuilder(); 441 StringBuilder buf = new StringBuilder();
442 for (int i=offset;i<offset+length;i++) 442 for (int i=offset;i<offset+length;i++)
443 { 443 {
444 int bi=0xff&b[i]; 444 int bi=0xff&b[i];
445 int c='0'+(bi/16)%16; 445 int c='0'+(bi/16)%16;
446 if (c>'9') 446 if (c>'9')
447 c= 'A'+(c-'0'-10); 447 c= 'A'+(c-'0'-10);
448 buf.append((char)c); 448 buf.append((char)c);
449 c='0'+bi%16; 449 c='0'+bi%16;
450 if (c>'9') 450 if (c>'9')
451 c= 'a'+(c-'0'-10); 451 c= 'a'+(c-'0'-10);
452 buf.append((char)c); 452 buf.append((char)c);
453 } 453 }
454 return buf.toString(); 454 return buf.toString();
455 } 455 }
456 456
457 /* ------------------------------------------------------------ */ 457 /* ------------------------------------------------------------ */
458 public static byte[] fromHexString(String s) 458 public static byte[] fromHexString(String s)
459 { 459 {
460 if (s.length()%2!=0) 460 if (s.length()%2!=0)
461 throw new IllegalArgumentException(s); 461 throw new IllegalArgumentException(s);
462 byte[] array = new byte[s.length()/2]; 462 byte[] array = new byte[s.length()/2];
463 for (int i=0;i<array.length;i++) 463 for (int i=0;i<array.length;i++)
464 { 464 {
465 int b = Integer.parseInt(s.substring(i*2,i*2+2),16); 465 int b = Integer.parseInt(s.substring(i*2,i*2+2),16);
466 array[i]=(byte)(0xff&b); 466 array[i]=(byte)(0xff&b);
467 } 467 }
468 return array; 468 return array;
469 } 469 }
470 470
471 471
472 public static void dump(Class<?> c) 472 public static void dump(Class<?> c)
473 { 473 {
474 System.err.println("Dump: "+c); 474 System.err.println("Dump: "+c);
475 dump(c.getClassLoader()); 475 dump(c.getClassLoader());
476 } 476 }
477 477
478 public static void dump(ClassLoader cl) 478 public static void dump(ClassLoader cl)
479 { 479 {
480 System.err.println("Dump Loaders:"); 480 System.err.println("Dump Loaders:");
481 while(cl!=null) 481 while(cl!=null)
482 { 482 {
483 System.err.println(" loader "+cl); 483 System.err.println(" loader "+cl);
484 cl = cl.getParent(); 484 cl = cl.getParent();
485 } 485 }
486 } 486 }
487 487
488 488
489 /* ------------------------------------------------------------ */ 489 /* ------------------------------------------------------------ */
490 /** 490 /**
491 * @deprecated 491 * @deprecated
492 */ 492 */
493 public static byte[] readLine(InputStream in) throws IOException 493 public static byte[] readLine(InputStream in) throws IOException
494 { 494 {
495 byte[] buf = new byte[256]; 495 byte[] buf = new byte[256];
496 496
497 int i=0; 497 int i=0;
498 int loops=0; 498 int loops=0;
499 int ch=0; 499 int ch=0;
500 500
501 while (true) 501 while (true)
502 { 502 {
503 ch=in.read(); 503 ch=in.read();
504 if (ch<0) 504 if (ch<0)
505 break; 505 break;
506 loops++; 506 loops++;
507 507
508 // skip a leading LF's 508 // skip a leading LF's
509 if (loops==1 && ch==LF) 509 if (loops==1 && ch==LF)
510 continue; 510 continue;
511 511
512 if (ch==CR || ch==LF) 512 if (ch==CR || ch==LF)
513 break; 513 break;
514 514
515 if (i>=buf.length) 515 if (i>=buf.length)
516 { 516 {
517 byte[] old_buf=buf; 517 byte[] old_buf=buf;
518 buf=new byte[old_buf.length+256]; 518 buf=new byte[old_buf.length+256];
519 System.arraycopy(old_buf, 0, buf, 0, old_buf.length); 519 System.arraycopy(old_buf, 0, buf, 0, old_buf.length);
520 } 520 }
521 buf[i++]=(byte)ch; 521 buf[i++]=(byte)ch;
522 } 522 }
523 523
524 if (ch==-1 && i==0) 524 if (ch==-1 && i==0)
525 return null; 525 return null;
526 526
527 // skip a trailing LF if it exists 527 // skip a trailing LF if it exists
528 if (ch==CR && in.available()>=1 && in.markSupported()) 528 if (ch==CR && in.available()>=1 && in.markSupported())
529 { 529 {
530 in.mark(1); 530 in.mark(1);
531 ch=in.read(); 531 ch=in.read();
532 if (ch!=LF) 532 if (ch!=LF)
533 in.reset(); 533 in.reset();
534 } 534 }
535 535
536 byte[] old_buf=buf; 536 byte[] old_buf=buf;
537 buf=new byte[i]; 537 buf=new byte[i];
538 System.arraycopy(old_buf, 0, buf, 0, i); 538 System.arraycopy(old_buf, 0, buf, 0, i);
539 539
540 return buf; 540 return buf;
541 } 541 }
542 542
543 public static URL jarFor(String className) 543 public static Object call(Class<?> oClass, String method, Object obj, Object[] arg)
544 { 544 throws InvocationTargetException, NoSuchMethodException
545 try 545 {
546 { 546 // Lets just try all methods for now
547 className=className.replace('.','/')+".class"; 547 Method[] methods = oClass.getMethods();
548 // hack to discover jstl libraries 548 for (int c = 0; methods != null && c < methods.length; c++)
549 URL url = Loader.getResource(null,className,false); 549 {
550 String s=url.toString(); 550 if (!methods[c].getName().equals(method))
551 if (s.startsWith("jar:file:")) 551 continue;
552 return new URL(s.substring(4,s.indexOf("!/"))); 552 if (methods[c].getParameterTypes().length != arg.length)
553 } 553 continue;
554 catch(Exception e) 554 if (Modifier.isStatic(methods[c].getModifiers()) != (obj == null))
555 { 555 continue;
556 LOG.trace("",e); 556 if ((obj == null) && methods[c].getDeclaringClass() != oClass)
557 } 557 continue;
558 return null; 558
559 } 559 try
560 560 {
561 public static Object call(Class<?> oClass, String method, Object obj, Object[] arg) 561 return methods[c].invoke(obj,arg);
562 throws InvocationTargetException, NoSuchMethodException 562 }
563 { 563 catch (IllegalAccessException e)
564 // Lets just try all methods for now 564 {
565 Method[] methods = oClass.getMethods(); 565 LOG.trace("",e);
566 for (int c = 0; methods != null && c < methods.length; c++) 566 }
567 { 567 catch (IllegalArgumentException e)
568 if (!methods[c].getName().equals(method)) 568 {
569 continue; 569 LOG.trace("",e);
570 if (methods[c].getParameterTypes().length != arg.length) 570 }
571 continue; 571 }
572 if (Modifier.isStatic(methods[c].getModifiers()) != (obj == null)) 572
573 continue; 573 throw new NoSuchMethodException(method);
574 if ((obj == null) && methods[c].getDeclaringClass() != oClass) 574 }
575 continue;
576
577 try
578 {
579 return methods[c].invoke(obj,arg);
580 }
581 catch (IllegalAccessException e)
582 {
583 LOG.trace("",e);
584 }
585 catch (IllegalArgumentException e)
586 {
587 LOG.trace("",e);
588 }
589 }
590
591 throw new NoSuchMethodException(method);
592 }
593 } 575 }