1. /*
  2. * @(#)MLetObjectInputStream.java 1.14 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.management.loading;
  8. // java import
  9. import java.io.*;
  10. import java.lang.reflect.Array;
  11. /**
  12. * This subclass of ObjectInputStream delegates loading of classes to
  13. * an existing MLetClassLoader.
  14. *
  15. * @since 1.5
  16. */
  17. class MLetObjectInputStream extends ObjectInputStream {
  18. private MLet loader;
  19. /**
  20. * Loader must be non-null;
  21. */
  22. public MLetObjectInputStream(InputStream in, MLet loader)
  23. throws IOException, StreamCorruptedException {
  24. super(in);
  25. if (loader == null) {
  26. throw new IllegalArgumentException("Illegal null argument to MLetObjectInputStream");
  27. }
  28. this.loader = loader;
  29. }
  30. private Class primitiveType(char c) {
  31. switch(c) {
  32. case 66: /* 'B' */
  33. return Byte.TYPE;
  34. case 67: /* 'C' */
  35. return Character.TYPE;
  36. case 68: /* 'D' */
  37. return Double.TYPE;
  38. case 70: /* 'F' */
  39. return Float.TYPE;
  40. case 73: /* 'I' */
  41. return Integer.TYPE;
  42. case 74: /* 'J' */
  43. return Long.TYPE;
  44. case 83: /* 'S' */
  45. return Short.TYPE;
  46. case 90: /* 'Z' */
  47. return Boolean.TYPE;
  48. }
  49. return null;
  50. }
  51. /**
  52. * Use the given ClassLoader rather than using the system class
  53. */
  54. protected Class resolveClass(ObjectStreamClass objectstreamclass)
  55. throws IOException, ClassNotFoundException {
  56. String s = objectstreamclass.getName();
  57. if (s.startsWith("[")) {
  58. int i;
  59. for (i = 1; s.charAt(i) == '['; i++);
  60. Class class1;
  61. if (s.charAt(i) == 'L') {
  62. class1 = loader.loadClass(s.substring(i + 1, s.length() - 1));
  63. } else {
  64. if (s.length() != i + 1)
  65. throw new ClassNotFoundException(s);
  66. class1 = primitiveType(s.charAt(i));
  67. }
  68. int ai[] = new int[i];
  69. for (int j = 0; j < i; j++)
  70. ai[j] = 0;
  71. return Array.newInstance(class1, ai).getClass();
  72. } else {
  73. return loader.loadClass(s);
  74. }
  75. }
  76. /**
  77. * Returns the ClassLoader being used
  78. */
  79. public ClassLoader getClassLoader() {
  80. return loader;
  81. }
  82. }