home *** CD-ROM | disk | FTP | other *** search
/ Apple Developer Connection Student Program / ADC Tools Sampler CD Disk 3 1999.iso / Metrowerks CodeWarrior / Java Support / Java_Source / IFC_112 / netscape / util / PrimitiveCoder.java < prev    next >
Encoding:
Text File  |  1999-05-28  |  8.5 KB  |  213 lines  |  [TEXT/CWIE]

  1. // PrimitiveCoder.java
  2. // By Ned Etcode
  3. // Copyright 1995, 1996, 1997 Netscape Communications Corp.  All rights reserved.
  4.  
  5. package netscape.util;
  6.  
  7. /** This class knows how to encode/decode all the primitive data types. We
  8.   * can't properly recreate "arrays of arrays of ... TYPE" in the current
  9.   * java language and APIs so we have to punt. The two Codable types which
  10.   * are not considered "primitive" are OBJECT_TYPE and OBJECT_ARRAY_TYPE.
  11.   * Take a look at this again when we get the reflection APIs. ALERT!
  12.   */
  13. class PrimitiveCoder implements ExternalCoder {
  14.     byte type;
  15.  
  16.     /** Constructs a PrimitiveCoder for a given type.
  17.       * @see Codable
  18.       */
  19.     PrimitiveCoder(byte type) {
  20.         super();
  21.         this.type = type;
  22.     }
  23.  
  24.     /** This just returns the null. We will call replaceObject() during
  25.       * decode with the real value.
  26.       */
  27.     public Object newInstance(String className) throws CodingException {
  28.         return null;
  29.     }
  30.  
  31.     static String classNameForType(byte type) {
  32.         // These are the class names for all the primitive types.  Some of
  33.         // these classes won't exist until JDK 1.1.
  34.  
  35.         switch (type) {
  36.             case Codable.BOOLEAN_TYPE:       return "java.lang.Boolean";
  37.             case Codable.BOOLEAN_ARRAY_TYPE: return "[Z";
  38.             case Codable.CHAR_TYPE:          return "java.lang.Character";
  39.             case Codable.CHAR_ARRAY_TYPE:    return "[C";
  40.             case Codable.BYTE_TYPE:          return "java.lang.Byte";
  41.             case Codable.BYTE_ARRAY_TYPE:    return "[B";
  42.             case Codable.SHORT_TYPE:         return "java.lang.Short";
  43.             case Codable.SHORT_ARRAY_TYPE:   return "[S";
  44.             case Codable.INT_TYPE:           return "java.lang.Integer";
  45.             case Codable.INT_ARRAY_TYPE:     return "[I";
  46.             case Codable.LONG_TYPE:          return "java.lang.Long";
  47.             case Codable.LONG_ARRAY_TYPE:    return "[J";
  48.             case Codable.FLOAT_TYPE:         return "java.lang.Float";
  49.             case Codable.FLOAT_ARRAY_TYPE:   return "[F";
  50.             case Codable.DOUBLE_TYPE:        return "java.lang.Double";
  51.             case Codable.DOUBLE_ARRAY_TYPE:  return "[D";
  52.             case Codable.STRING_TYPE:        return "java.lang.String";
  53.             case Codable.STRING_ARRAY_TYPE:  return "[Ljava.lang.String;";
  54.             case Codable.OBJECT_TYPE:
  55.             case Codable.OBJECT_ARRAY_TYPE:
  56.             default:
  57.                 throw new InconsistencyException("Non-primitive type!");
  58.         }
  59.     }
  60.  
  61.     String className() {
  62.         return classNameForType(type);
  63.     }
  64.  
  65.     public void describeClassInfo(Object object, ClassInfo info) {
  66.         info.addClass(classNameForType(type), 1);
  67.         info.addField("value", type);
  68.     }
  69.  
  70.     public void encode(Object object, Encoder encoder) throws CodingException {
  71.         switch (type) {
  72.             case Codable.BOOLEAN_TYPE:
  73.                 encoder.encodeBoolean("value",
  74.                     ((Boolean)object).booleanValue());
  75.                 break;
  76.             case Codable.BOOLEAN_ARRAY_TYPE:
  77.                 encoder.encodeBooleanArray("value", (boolean[])object,
  78.                     0, ((boolean[])object).length);
  79.                 break;
  80.             case Codable.CHAR_TYPE:
  81.                 encoder.encodeChar("value",
  82.                     ((Character)object).charValue());
  83.                 break;
  84.             case Codable.CHAR_ARRAY_TYPE:
  85.                 encoder.encodeCharArray("value", (char[])object,
  86.                     0, ((char[])object).length);
  87.                 break;
  88.             case Codable.BYTE_TYPE:
  89.                 throw new CodingException("java.lang.Byte not supported");
  90.             case Codable.BYTE_ARRAY_TYPE:
  91.                 encoder.encodeByteArray("value", (byte[])object,
  92.                     0, ((byte[])object).length);
  93.                 break;
  94.             case Codable.SHORT_TYPE:
  95.                 throw new CodingException("java.lang.Short not supported");
  96.             case Codable.SHORT_ARRAY_TYPE:
  97.                 encoder.encodeShortArray("value", (short[])object,
  98.                     0, ((short[])object).length);
  99.                 break;
  100.             case Codable.INT_TYPE:
  101.                 encoder.encodeInt("value", ((Integer)object).intValue());
  102.                 break;
  103.             case Codable.INT_ARRAY_TYPE:
  104.                 encoder.encodeIntArray("value", (int[])object,
  105.                     0, ((int[])object).length);
  106.                 break;
  107.             case Codable.LONG_TYPE:
  108.                 encoder.encodeLong("value", ((Long)object).longValue());
  109.                 break;
  110.             case Codable.LONG_ARRAY_TYPE:
  111.                 encoder.encodeLongArray("value", (long[])object,
  112.                     0, ((long[])object).length);
  113.                 break;
  114.             case Codable.FLOAT_TYPE:
  115.                 encoder.encodeFloat("value", ((Float)object).floatValue());
  116.                 break;
  117.             case Codable.FLOAT_ARRAY_TYPE:
  118.                 encoder.encodeFloatArray("value", (float[])object,
  119.                     0, ((float[])object).length);
  120.                 break;
  121.             case Codable.DOUBLE_TYPE:
  122.                 encoder.encodeDouble("value", ((Double)object).doubleValue());
  123.                 break;
  124.             case Codable.DOUBLE_ARRAY_TYPE:
  125.                 encoder.encodeDoubleArray("value", (double[])object,
  126.                     0, ((double[])object).length);
  127.                 break;
  128.             case Codable.STRING_TYPE:
  129.                 encoder.encodeString("value", (String)object);
  130.                 break;
  131.             case Codable.STRING_ARRAY_TYPE:
  132.                 encoder.encodeStringArray("value", (String[])object,
  133.                     0, ((String[])object).length);
  134.                 break;
  135.             case Codable.OBJECT_TYPE:
  136.             case Codable.OBJECT_ARRAY_TYPE:
  137.             default:
  138.                 throw new CodingException("Non-primitive type!");
  139.         }
  140.     }
  141.  
  142.     public void decode(Object object, Decoder decoder) throws CodingException {
  143.         Object value;
  144.  
  145.         switch (type) {
  146.             case Codable.BOOLEAN_TYPE:
  147.                 if (decoder.decodeBoolean("value"))
  148.                     value = Boolean.TRUE;
  149.                 else
  150.                     value = Boolean.FALSE;
  151.                 break;
  152.             case Codable.BOOLEAN_ARRAY_TYPE:
  153.                 value = decoder.decodeBooleanArray("value");
  154.                 break;
  155.             case Codable.CHAR_TYPE:
  156.                 value = new Character(decoder.decodeChar("value"));
  157.                 break;
  158.             case Codable.CHAR_ARRAY_TYPE:
  159.                 value = decoder.decodeCharArray("value");
  160.                 break;
  161.             case Codable.BYTE_TYPE:
  162.                 throw new CodingException("java.lang.Byte not supported");
  163.             case Codable.BYTE_ARRAY_TYPE:
  164.                 value = decoder.decodeByteArray("value");
  165.                 break;
  166.             case Codable.SHORT_TYPE:
  167.                 throw new CodingException("java.lang.Short not supported");
  168.             case Codable.SHORT_ARRAY_TYPE:
  169.                 value = decoder.decodeShortArray("value");
  170.                 break;
  171.             case Codable.INT_TYPE:
  172.                 value = new Integer(decoder.decodeInt("value"));
  173.                 break;
  174.             case Codable.INT_ARRAY_TYPE:
  175.                 value = decoder.decodeIntArray("value");
  176.                 break;
  177.             case Codable.LONG_TYPE:
  178.                 value = new Long(decoder.decodeLong("value"));
  179.                 break;
  180.             case Codable.LONG_ARRAY_TYPE:
  181.                 value = decoder.decodeLongArray("value");
  182.                 break;
  183.             case Codable.FLOAT_TYPE:
  184.                 value = new Float(decoder.decodeFloat("value"));
  185.                 break;
  186.             case Codable.FLOAT_ARRAY_TYPE:
  187.                 value = decoder.decodeFloatArray("value");
  188.                 break;
  189.             case Codable.DOUBLE_TYPE:
  190.                 value = new Double(decoder.decodeDouble("value"));
  191.                 break;
  192.             case Codable.DOUBLE_ARRAY_TYPE:
  193.                 value = decoder.decodeDoubleArray("value");
  194.                 break;
  195.             case Codable.STRING_TYPE:
  196.                 value = decoder.decodeString("value");
  197.                 break;
  198.             case Codable.STRING_ARRAY_TYPE:
  199.                 value = decoder.decodeStringArray("value");
  200.                 break;
  201.             case Codable.OBJECT_TYPE:
  202.             case Codable.OBJECT_ARRAY_TYPE:
  203.             default:
  204.                 throw new CodingException("Non-primitive type!");
  205.         }
  206.  
  207.         decoder.replaceObject(value);
  208.     }
  209.  
  210.     public void finishDecoding(Object object) throws CodingException {
  211.     }
  212. }
  213.