| 1 55 56 package org.jboss.axis.utils; 57 58 import org.jboss.axis.attachments.AttachmentPartImpl; 59 import org.jboss.axis.attachments.OctetStream; 60 import org.jboss.axis.components.image.ImageIO; 61 import org.jboss.axis.components.image.ImageIOFactory; 62 import org.jboss.axis.types.HexBinary; 63 import org.jboss.logging.Logger; 64 65 import javax.activation.DataHandler ; 66 import javax.xml.namespace.QName ; 67 import javax.xml.rpc.holders.*; 68 import javax.xml.soap.SOAPException ; 69 import javax.xml.transform.Source ; 70 import javax.xml.transform.stream.StreamSource ; 71 import java.awt.*; 72 import java.beans.Introspector ; 73 import java.io.ByteArrayOutputStream ; 74 import java.io.IOException ; 75 import java.io.InputStream ; 76 import java.io.StringReader ; 77 import java.lang.reflect.Array ; 78 import java.lang.reflect.Constructor ; 79 import java.lang.reflect.Field ; 80 import java.lang.reflect.Method ; 81 import java.math.BigDecimal ; 82 import java.math.BigInteger ; 83 import java.text.Collator ; 84 import java.util.ArrayList ; 85 import java.util.Arrays ; 86 import java.util.Calendar ; 87 import java.util.Collection ; 88 import java.util.GregorianCalendar ; 89 import java.util.HashMap ; 90 import java.util.HashSet ; 91 import java.util.Hashtable ; 92 import java.util.Iterator ; 93 import java.util.List ; 94 import java.util.Locale ; 95 import java.util.Set ; 96 97 103 public class JavaUtils 104 { 105 private static Logger log = Logger.getLogger(JavaUtils.class.getName()); 106 107 public static final char NL = '\n'; 108 109 public static final char CR = '\r'; 110 111 114 public static final String LS = System.getProperty("line.separator", 115 (new Character (NL)).toString()); 116 117 118 public static Class getWrapperClass(Class primitive) 119 { 120 if (primitive == int.class) 121 return java.lang.Integer .class; 122 else if (primitive == short.class) 123 return java.lang.Short .class; 124 else if (primitive == boolean.class) 125 return java.lang.Boolean .class; 126 else if (primitive == byte.class) 127 return java.lang.Byte .class; 128 else if (primitive == long.class) 129 return java.lang.Long .class; 130 else if (primitive == double.class) 131 return java.lang.Double .class; 132 else if (primitive == float.class) 133 return java.lang.Float .class; 134 else if (primitive == char.class) 135 return java.lang.Character .class; 136 137 return null; 138 } 139 140 public static String getWrapper(String primitive) 141 { 142 if (primitive.equals("int")) 143 return "Integer"; 144 else if (primitive.equals("short")) 145 return "Short"; 146 else if (primitive.equals("boolean")) 147 return "Boolean"; 148 else if (primitive.equals("byte")) 149 return "Byte"; 150 else if (primitive.equals("long")) 151 return "Long"; 152 else if (primitive.equals("double")) 153 return "Double"; 154 else if (primitive.equals("float")) 155 return "Float"; 156 else if (primitive.equals("char")) 157 return "Character"; 158 159 return null; 160 } 161 162 public static Class getPrimitiveClass(Class wrapper) 163 { 164 if (wrapper == java.lang.Integer .class) 165 return int.class; 166 else if (wrapper == java.lang.Short .class) 167 return short.class; 168 else if (wrapper == java.lang.Boolean .class) 169 return boolean.class; 170 else if (wrapper == java.lang.Byte .class) 171 return byte.class; 172 else if (wrapper == java.lang.Long .class) 173 return long.class; 174 else if (wrapper == java.lang.Double .class) 175 return double.class; 176 else if (wrapper == java.lang.Float .class) 177 return float.class; 178 else if (wrapper == java.lang.Character .class) 179 return char.class; 180 181 return null; 182 } 183 184 public static Class getPrimitiveClass(String javaType) 185 { 186 if ("int".equals(javaType)) 187 return int.class; 188 else if ("short".equals(javaType)) 189 return short.class; 190 else if ("boolean".equals(javaType)) 191 return boolean.class; 192 else if ("byte".equals(javaType)) 193 return byte.class; 194 else if ("long".equals(javaType)) 195 return long.class; 196 else if ("double".equals(javaType)) 197 return double.class; 198 else if ("float".equals(javaType)) 199 return float.class; 200 else if ("char".equals(javaType)) 201 return char.class; 202 203 return null; 204 } 205 206 212 public interface ConvertCache 213 { 214 217 public void setConvertedValue(Class cls, Object value); 218 219 public Object getConvertedValue(Class cls); 220 221 224 public Class getDestClass(); 225 } 226 227 237 public static Object convert(Object arg, Class destClass) 238 { 239 if (destClass == null) 240 { 241 return arg; 242 } 243 244 Class argHeldType = null; 245 if (arg != null) 246 { 247 argHeldType = getHolderValueType(arg.getClass()); 248 } 249 250 if (arg != null && argHeldType == null && destClass.isAssignableFrom(arg.getClass())) 251 { 252 return arg; 253 } 254 255 if (arg != null && destClass != null) 256 assertClassLoaders(arg.getClass(), destClass); 257 258 if (log.isDebugEnabled()) 259 { 260 String clsName = "null"; 261 if (arg != null) clsName = arg.getClass().getName(); 262 log.debug(Messages.getMessage("convert00", clsName, destClass.getName())); 263 } 264 265 Object destValue = null; 267 if (arg instanceof ConvertCache) 268 { 269 destValue = ((ConvertCache)arg).getConvertedValue(destClass); 270 if (destValue != null) 271 return destValue; 272 } 273 274 Class destHeldType = getHolderValueType(destClass); 276 277 if (arg instanceof HexBinary && destClass == byte[].class) 279 return ((HexBinary)arg).getBytes(); 280 if (arg instanceof byte[] && destClass == HexBinary.class) 281 return new HexBinary((byte[])arg); 282 if (arg instanceof HexBinary && destClass == Byte [].class) 283 return convert(((HexBinary)arg).getBytes(), Byte [].class); 284 if (arg instanceof Byte [] && destClass == HexBinary.class) 285 return new HexBinary((Byte [])arg); 286 287 if (arg instanceof Calendar && destClass.isAssignableFrom(java.util.Date .class)) 289 { 290 return ((Calendar )arg).getTime(); 291 } 292 if (arg instanceof java.util.Date && destClass.isAssignableFrom(Calendar .class)) 293 { 294 GregorianCalendar gregorianCalendar = new GregorianCalendar (); 295 gregorianCalendar.setTime((java.util.Date )arg); 296 return gregorianCalendar; 297 } 298 299 if (arg instanceof Calendar && destClass.isAssignableFrom(org.jboss.axis.types.Time.class)) 301 return new org.jboss.axis.types.Time((Calendar )arg); 302 if (arg instanceof org.jboss.axis.types.Time && destClass.isAssignableFrom(Calendar .class)) 303 return ((org.jboss.axis.types.Time)arg).getAsCalendar(); 304 305 if (arg instanceof HashMap && destClass == Hashtable .class) 307 { 308 return new Hashtable ((HashMap )arg); 309 } 310 311 if (arg instanceof org.jboss.axis.types.Language && destClass == String .class) 313 return arg.toString(); 314 if (arg instanceof String && destClass == org.jboss.axis.types.Language.class) 315 return new org.jboss.axis.types.Language((String )arg); 316 317 if (arg instanceof org.jboss.axis.types.Token && destClass == String .class) 319 return arg.toString(); 320 if (arg instanceof String && destClass == org.jboss.axis.types.Token.class) 321 return new org.jboss.axis.types.Token((String )arg); 322 323 if (arg != null && isBeanCompatible(destClass)) 325 { 326 try 327 { 328 Constructor ctor = getConstructorForClass(destClass, arg.getClass()); 329 Object ctorArg = convert(arg, ctor.getParameterTypes()[0]); 330 return ctor.newInstance(new Object []{ctorArg}); 331 } 332 catch (Exception ignore) 333 { 334 } 336 } 337 if (arg != null && isBeanCompatible(arg.getClass())) 339 { 340 try 341 { 342 Method getter = getAccessorForClass(arg.getClass(), destClass); 343 return getter.invoke(arg, null); 344 } 345 catch (Exception ignore) 346 { 347 } 349 } 350 351 if (isAttachmentSupported() && 353 (arg instanceof InputStream || arg instanceof AttachmentPartImpl || arg instanceof DataHandler )) 354 { 355 try 356 { 357 String destName = destClass.getName(); 358 if (destClass == String .class 359 || destClass == OctetStream.class 360 || destClass == byte[].class 361 || destClass == Image.class 362 || destClass == Source .class 363 || destClass == DataHandler .class 364 || destName.equals("javax.mail.internet.MimeMultipart")) 365 { 366 DataHandler handler = null; 367 if (arg instanceof AttachmentPartImpl) 368 { 369 handler = ((AttachmentPartImpl)arg).getDataHandler(); 370 } 371 else if (arg instanceof DataHandler ) 372 { 373 handler = (DataHandler )arg; 374 } 375 if (destClass == Image.class) 376 { 377 InputStream is = (InputStream )handler.getContent(); 382 if (is.available() == 0) 383 { 384 return null; 385 } 386 else 387 { 388 ImageIO imageIO = ImageIOFactory.getImageIO(); 389 if (imageIO != null) 390 { 391 return getImageFromStream(is); 392 } 393 else 394 { 395 log.info(Messages.getMessage("needImageIO")); 396 return arg; 397 } 398 } 399 } 400 else if (destClass == Source .class) 401 { 402 return new StreamSource (new StringReader ((String )handler.getContent())); 406 } 407 else if ((arg instanceof InputStream ) && (destClass == OctetStream.class || destClass == byte[].class)) 408 { 409 InputStream in = (InputStream )arg; 410 ByteArrayOutputStream baos = new ByteArrayOutputStream (); 411 int byte1 = -1; 412 while ((byte1 = in.read()) != -1) 413 baos.write(byte1); 414 return new OctetStream(baos.toByteArray()); 415 } 416 else if (destClass == DataHandler .class) 417 { 418 return handler; 419 } 420 else 421 { 422 return handler.getContent(); 423 } 424 } 425 } 426 catch (IOException ioe) 427 { 428 } 429 catch (SOAPException se) 430 { 431 } 432 } 433 434 if (arg != null && 438 destClass.isArray() && 439 !destClass.getComponentType().equals(Object .class) && 440 !destClass.getComponentType().isArray() && 441 destClass.getComponentType().isAssignableFrom(arg.getClass())) 442 { 443 Object array = 444 Array.newInstance(destClass.getComponentType(), 1); 445 Array.set(array, 0, arg); 446 return array; 447 } 448 449 if (!(arg instanceof Collection || 451 (arg != null && arg.getClass().isArray())) && 452 ((destHeldType == null && argHeldType == null) || 453 (destHeldType != null && argHeldType != null))) 454 { 455 return arg; 456 } 457 458 if (destHeldType != null) 460 { 461 Object newArg = convert(arg, destHeldType); 463 Object argHolder = null; 464 try 465 { 466 argHolder = destClass.newInstance(); 467 setHolderValue(argHolder, newArg); 468 return argHolder; 469 } 470 catch (Exception e) 471 { 472 return arg; 473 } 474 } 475 else if (argHeldType != null) 476 { 477 try 479 { 480 Object newArg = getHolderValue(arg); 481 return convert(newArg, destClass); 482 } 483 catch (HolderException e) 484 { 485 return arg; 486 } 487 } 488 489 491 if (arg instanceof ConvertCache && 493 ((ConvertCache)arg).getDestClass() != destClass) 494 { 495 Class hintClass = ((ConvertCache)arg).getDestClass(); 496 if (hintClass != null && 497 hintClass.isArray() && 498 destClass.isArray() && 499 destClass.isAssignableFrom(hintClass)) 500 { 501 destClass = hintClass; 502 destValue = ((ConvertCache)arg).getConvertedValue(destClass); 503 if (destValue != null) 504 return destValue; 505 } 506 } 507 508 if (arg == null) 509 { 510 return arg; 511 } 512 513 int length = 0; 515 if (arg.getClass().isArray()) 516 { 517 length = Array.getLength(arg); 518 } 519 else 520 { 521 length = ((Collection )arg).size(); 522 } 523 if (destClass.isArray()) 524 { 525 Class componentType = destClass.getComponentType(); 526 if (componentType.isPrimitive()) 527 { 528 529 Object array = Array.newInstance(componentType, length); 530 if (arg.getClass().isArray()) 532 { 533 for (int i = 0; i < length; i++) 534 { 535 Object srcObj = Array.get(arg, i); 536 Object valObj = convert(srcObj, componentType); 537 Array.set(array, i, valObj); 538 } 539 } 540 else 541 { 542 int idx = 0; 543 for (Iterator i = ((Collection )arg).iterator(); 544 i.hasNext();) 545 { 546 Array.set(array, idx++, i.next()); 547 } 548 } 549 destValue = array; 550 551 } 552 else 553 { 554 Object [] array; 555 try 556 { 557 array = (Object [])Array.newInstance(destClass.getComponentType(), 558 length); 559 } 560 catch (Exception e) 561 { 562 return arg; 563 } 564 565 if (arg.getClass().isArray()) 567 { 568 for (int i = 0; i < length; i++) 569 { 570 array[i] = convert(Array.get(arg, i), 571 destClass.getComponentType()); 572 } 573 } 574 else 575 { 576 int idx = 0; 577 for (Iterator i = ((Collection )arg).iterator(); 578 i.hasNext();) 579 { 580 array[idx++] = convert(i.next(), 581 destClass.getComponentType()); 582 } 583 } 584 destValue = array; 585 } 586 } 587 else if (Collection .class.isAssignableFrom(destClass)) 588 { 589 Collection newList = null; 590 try 591 { 592 if (destClass == Collection .class || destClass == List .class) 595 { 596 newList = new ArrayList (); 597 } 598 else if (destClass == Set .class) 599 { 600 newList = new HashSet (); 601 } 602 else 603 { 604 newList = (Collection )destClass.newInstance(); 605 } 606 } 607 catch (Exception e) 608 { 609 return arg; 611 } 612 613 if (arg.getClass().isArray()) 614 { 615 for (int j = 0; j < length; j++) 616 { 617 newList.add(Array.get(arg, j)); 618 } 619 } 620 else 621 { 622 for (Iterator j = ((Collection )arg).iterator(); 623 j.hasNext();) 624 { 625 newList.add(j.next()); 626 } 627 } 628 destValue = newList; 629 } 630 else 631 { 632 destValue = arg; 633 } 634 635 if (arg instanceof ConvertCache) 637 { 638 ((ConvertCache)arg).setConvertedValue(destClass, destValue); 639 } 640 return destValue; 641 } 642 643 public static boolean isConvertable(Object obj, Class dest) 644 { 645 return isConvertable(obj, dest, false); 646 } 647 648 public static boolean isConvertable(Object obj, Class dest, boolean isEncoded) 649 { 650 Class src = null; 651 652 if (obj != null) 653 { 654 if (obj instanceof Class ) 655 { 656 src = (Class )obj; 657 } 658 else 659 { 660 src = obj.getClass(); 661 } 662 } 663 else 664 { 665 if (!dest.isPrimitive()) 666 return true; 667 } 668 669 if (dest == null) 670 return false; 671 672 if (src != null) 673 { 674 if (dest.isAssignableFrom(src)) 676 return true; 677 678 assertClassLoaders(src, dest); 679 680 if (src.getName().equals(dest.getName())) 681 { 682 log.error("Conflicting classloaders detected: [src=" + src.getClassLoader() + ",dest=" + dest.getClassLoader() + "]"); 683 return false; 684 } 685 686 if (java.util.Map .class.isAssignableFrom(dest) && 688 java.util.Map .class.isAssignableFrom(src)) 689 { 690 return true; 691 } 692 693 if (getWrapperClass(src) == dest) 695 return true; 696 if (getWrapperClass(dest) == src) 697 return true; 698 699 if ((Collection .class.isAssignableFrom(src) || src.isArray()) && 701 (Collection .class.isAssignableFrom(dest) || dest.isArray()) && 702 (src.getComponentType() == Object .class || 703 src.getComponentType() == null || 704 dest.getComponentType() == Object .class || 705 dest.getComponentType() == null || 706 isConvertable(src.getComponentType(), dest.getComponentType()))) 707 return true; 708 709 if (!isEncoded && dest.isArray() && 712 !dest.getComponentType().equals(Object .class) && 713 dest.getComponentType().isAssignableFrom(src)) 714 return true; 715 716 if (src == HexBinary.class && dest == byte[].class) 717 return true; 718 if (src == byte[].class && dest == HexBinary.class) 719 return true; 720 if (src == HexBinary.class && dest == Byte [].class) 721 return true; 722
|