home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Java / netscape / util / Deserializer.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-12  |  5.2 KB  |  361 lines

  1. package netscape.util;
  2.  
  3. import java.io.FilterInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.StringBufferInputStream;
  7.  
  8. public class Deserializer extends FilterInputStream {
  9.    private TokenGenerator tokenGenerator;
  10.  
  11.    public static Object readObject(InputStream var0) {
  12.       Object var1;
  13.       try {
  14.          Deserializer var2 = new Deserializer(var0);
  15.          var1 = var2.readObject();
  16.       } catch (IOException var3) {
  17.          var1 = null;
  18.       } catch (DeserializationException var4) {
  19.          var1 = null;
  20.       }
  21.  
  22.       return var1;
  23.    }
  24.  
  25.    public Deserializer(InputStream var1) {
  26.       super(var1);
  27.       this.tokenGenerator = new TokenGenerator(var1);
  28.    }
  29.  
  30.    public static Object deserializeObject(String var0) {
  31.       if (var0 == null) {
  32.          return null;
  33.       } else {
  34.          StringBufferInputStream var1 = new StringBufferInputStream(var0);
  35.          return readObject(var1);
  36.       }
  37.    }
  38.  
  39.    public Object readObject() throws IOException, DeserializationException {
  40.       return this.readObjectInternal();
  41.    }
  42.  
  43.    private final Object readObjectInternal() throws IOException, DeserializationException {
  44.       if (!this.tokenGenerator.hasMoreTokens()) {
  45.          return null;
  46.       } else {
  47.          int var1 = this.tokenGenerator.nextToken();
  48.          switch (var1) {
  49.             case 1:
  50.                return this.stringForToken();
  51.             case 2:
  52.                return this.readArray();
  53.             case 3:
  54.             case 5:
  55.             default:
  56.                this.syntaxError();
  57.                return null;
  58.             case 4:
  59.                return this.readVector();
  60.             case 6:
  61.                return this.readHashtable();
  62.          }
  63.       }
  64.    }
  65.  
  66.    private final void readKeyValuePair(Hashtable var1) throws IOException, DeserializationException {
  67.       Object var2 = this.readObjectInternal();
  68.       if (var2 == null) {
  69.          this.unterminatedExpression();
  70.       }
  71.  
  72.       if (!this.tokenGenerator.hasMoreTokens()) {
  73.          this.unterminatedExpression();
  74.       }
  75.  
  76.       int var4 = this.tokenGenerator.nextToken();
  77.       if (var4 != 7) {
  78.          this.syntaxError();
  79.       }
  80.  
  81.       if (!this.tokenGenerator.hasMoreTokens()) {
  82.          this.unterminatedExpression();
  83.       }
  84.  
  85.       Object var3 = this.readObjectInternal();
  86.       if (var3 == null) {
  87.          this.unterminatedExpression();
  88.       }
  89.  
  90.       var1.put(var2, var3);
  91.       if (!this.tokenGenerator.hasMoreTokens()) {
  92.          this.unterminatedExpression();
  93.       }
  94.  
  95.       var4 = this.tokenGenerator.peekNextToken();
  96.       if (var4 == 8 || var4 == 10) {
  97.          this.tokenGenerator.nextToken();
  98.       }
  99.  
  100.    }
  101.  
  102.    private final Hashtable readHashtable() throws IOException, DeserializationException {
  103.       Hashtable var1 = new Hashtable();
  104.  
  105.       while(true) {
  106.          if (!this.tokenGenerator.hasMoreTokens()) {
  107.             this.unterminatedExpression();
  108.          }
  109.  
  110.          int var2 = this.tokenGenerator.peekNextToken();
  111.          if (var2 == 9) {
  112.             this.tokenGenerator.nextToken();
  113.             return var1;
  114.          }
  115.  
  116.          this.readKeyValuePair(var1);
  117.       }
  118.    }
  119.  
  120.    private final Vector readVector() throws IOException, DeserializationException {
  121.       Vector var1 = new Vector();
  122.       boolean var3 = false;
  123.  
  124.       while(true) {
  125.          if (!this.tokenGenerator.hasMoreTokens()) {
  126.             this.unterminatedExpression();
  127.          }
  128.  
  129.          int var2 = this.tokenGenerator.peekNextToken();
  130.          if (var2 == 5) {
  131.             this.tokenGenerator.nextToken();
  132.             return var1;
  133.          }
  134.  
  135.          if (var2 == 10) {
  136.             this.tokenGenerator.nextToken();
  137.             if (var3) {
  138.                var3 = false;
  139.             } else {
  140.                this.syntaxError();
  141.             }
  142.          } else if (var3) {
  143.             this.syntaxError();
  144.          }
  145.  
  146.          Object var4 = this.readObjectInternal();
  147.          if (var4 != null) {
  148.             var1.addElement(var4);
  149.             var3 = true;
  150.          }
  151.       }
  152.    }
  153.  
  154.    private final Object[] readArray() throws IOException, DeserializationException {
  155.       Object[] var1 = new Object[16];
  156.       int var2 = 0;
  157.       boolean var5 = false;
  158.  
  159.       while(true) {
  160.          if (!this.tokenGenerator.hasMoreTokens()) {
  161.             this.unterminatedExpression();
  162.          }
  163.  
  164.          int var4 = this.tokenGenerator.peekNextToken();
  165.          if (var4 == 3) {
  166.             this.tokenGenerator.nextToken();
  167.             Object[] var9 = new Object[var2];
  168.             System.arraycopy(var1, 0, var9, 0, var2);
  169.             return var9;
  170.          }
  171.  
  172.          if (var4 == 10) {
  173.             this.tokenGenerator.nextToken();
  174.             if (var5) {
  175.                var5 = false;
  176.             } else {
  177.                this.syntaxError();
  178.             }
  179.          } else if (var5) {
  180.             this.syntaxError();
  181.          }
  182.  
  183.          var4 = this.tokenGenerator.peekNextToken();
  184.          Object var3;
  185.          if (var4 == 11) {
  186.             this.tokenGenerator.nextToken();
  187.             var3 = null;
  188.          } else {
  189.             var3 = this.readObjectInternal();
  190.          }
  191.  
  192.          var1[var2++] = var3;
  193.          if (var2 == var1.length) {
  194.             Object[] var6 = new Object[var1.length * 2];
  195.             System.arraycopy(var1, 0, var6, 0, var1.length);
  196.             var1 = var6;
  197.          }
  198.  
  199.          var5 = true;
  200.       }
  201.    }
  202.  
  203.    private final String stringForToken() throws DeserializationException {
  204.       byte[] var1 = this.tokenGenerator.bytesForLastToken();
  205.       if (var1 == null || var1.length == 0) {
  206.          this.internalInconsistency("empty string");
  207.       }
  208.  
  209.       if (var1[0] != 34) {
  210.          return new String(var1, 0);
  211.       } else {
  212.          char[] var3 = new char[32];
  213.          int var4 = 0;
  214.          int var5 = 1;
  215.  
  216.          for(int var6 = var1.length - 1; var5 < var6; ++var5) {
  217.             byte var2 = var1[var5];
  218.             if (var2 == 92) {
  219.                byte var7 = 0;
  220.                char var8 = 0;
  221.                ++var5;
  222.                if (var5 < var6) {
  223.                   var7 = var1[var5];
  224.                } else {
  225.                   this.malformedString();
  226.                }
  227.  
  228.                switch (var7) {
  229.                   case 34:
  230.                      var8 = (char)var7;
  231.                      break;
  232.                   case 92:
  233.                      var8 = '\\';
  234.                      break;
  235.                   case 110:
  236.                      var8 = '\n';
  237.                      break;
  238.                   case 114:
  239.                      var8 = '\r';
  240.                      break;
  241.                   case 116:
  242.                      var8 = '\t';
  243.                      break;
  244.                   case 117:
  245.                      byte var9 = 0;
  246.                      byte var10 = 0;
  247.                      byte var11 = 0;
  248.                      byte var12 = 0;
  249.                      ++var5;
  250.                      if (var5 < var6) {
  251.                         var9 = var1[var5];
  252.                      } else {
  253.                         this.malformedString();
  254.                      }
  255.  
  256.                      ++var5;
  257.                      if (var5 < var6) {
  258.                         var10 = var1[var5];
  259.                      } else {
  260.                         this.malformedString();
  261.                      }
  262.  
  263.                      ++var5;
  264.                      if (var5 < var6) {
  265.                         var11 = var1[var5];
  266.                      } else {
  267.                         this.malformedString();
  268.                      }
  269.  
  270.                      ++var5;
  271.                      if (var5 < var6) {
  272.                         var12 = var1[var5];
  273.                      } else {
  274.                         this.malformedString();
  275.                      }
  276.  
  277.                      if (this.isHexa(var9) && this.isHexa(var10) && this.isHexa(var11) && this.isHexa(var12)) {
  278.                         var8 = (char)(this.asciiToFourBits(var9) << 12 | this.asciiToFourBits(var10) << 8 | this.asciiToFourBits(var11) << 4 | this.asciiToFourBits(var12));
  279.                         break;
  280.                      }
  281.  
  282.                      this.malformedString();
  283.                      break;
  284.                   default:
  285.                      boolean var13 = false;
  286.                      byte var14 = 0;
  287.                      byte var15 = 0;
  288.                      ++var5;
  289.                      if (var5 < var6) {
  290.                         var14 = var1[var5];
  291.                      } else {
  292.                         --var5;
  293.                      }
  294.  
  295.                      ++var5;
  296.                      if (var5 < var6) {
  297.                         var15 = var1[var5];
  298.                      } else {
  299.                         --var5;
  300.                      }
  301.  
  302.                      if (var7 >= 48 && var7 <= 55 && var14 >= 48 && var14 <= 55 && var15 >= 48 && var15 <= 55) {
  303.                         var8 = (char)(var7 - 48 << 6 | var14 - 48 << 3 | var15 - 48);
  304.                      } else {
  305.                         this.malformedString();
  306.                      }
  307.                }
  308.  
  309.                var3[var4++] = var8;
  310.                if (var4 == var3.length) {
  311.                   char[] var21 = new char[var3.length * 2];
  312.                   System.arraycopy(var3, 0, var21, 0, var3.length);
  313.                   var3 = var21;
  314.                }
  315.             } else {
  316.                var3[var4++] = (char)var2;
  317.                if (var4 == var3.length) {
  318.                   char[] var20 = new char[var3.length * 2];
  319.                   System.arraycopy(var3, 0, var20, 0, var3.length);
  320.                   var3 = var20;
  321.                }
  322.             }
  323.          }
  324.  
  325.          return new String(var3, 0, var4);
  326.       }
  327.    }
  328.  
  329.    private final boolean isHexa(byte var1) {
  330.       return var1 >= 48 && var1 <= 57 || var1 >= 97 && var1 <= 102 || var1 >= 65 && var1 <= 70;
  331.    }
  332.  
  333.    private final byte asciiToFourBits(byte var1) {
  334.       if (var1 >= 48 && var1 <= 57) {
  335.          return (byte)(var1 - 48);
  336.       } else {
  337.          return var1 >= 97 && var1 <= 102 ? (byte)(var1 - 97 + 10) : (byte)(var1 - 65 + 10);
  338.       }
  339.    }
  340.  
  341.    private void malformedString() throws DeserializationException {
  342.       int var1 = this.tokenGenerator.lineForLastToken();
  343.       throw new DeserializationException("Malformed string at line " + var1 + ":" + new String(this.tokenGenerator.bytesForLastToken(), 0), var1);
  344.    }
  345.  
  346.    private void syntaxError() throws DeserializationException {
  347.       int var1 = this.tokenGenerator.lineForLastToken();
  348.       throw new DeserializationException("Syntax error at line " + var1, var1);
  349.    }
  350.  
  351.    private void internalInconsistency(String var1) throws DeserializationException {
  352.       int var2 = this.tokenGenerator.lineForLastToken();
  353.       throw new DeserializationException("Internal inconsistency exception. Please report this problem. " + var1 + " " + var2, var2);
  354.    }
  355.  
  356.    private void unterminatedExpression() throws DeserializationException {
  357.       int var1 = this.tokenGenerator.lineForLastToken();
  358.       throw new DeserializationException("Unterminated expression at line " + var1, var1);
  359.    }
  360. }
  361.