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

  1. package netscape.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5.  
  6. public class BariumArchiveLoader {
  7.    static final String classVersionsKey = "classVersions";
  8.    static final String classTablesKey = "classTables";
  9.    static final String fieldNamesKey = "fieldNames";
  10.    static final String fieldTypesKey = "fieldTypes";
  11.    static final String instancesKey = "instances";
  12.    static final String classNameKey = "class";
  13.    static final String rootInstancesKey = "rootInstances";
  14.    Archive archive;
  15.    Hashtable archiveDict;
  16.    Hashtable allVersions;
  17.    IdHashtable idForName;
  18.    String[] nameForId;
  19.  
  20.    public BariumArchiveLoader(Archive var1) {
  21.       this.archive = var1;
  22.    }
  23.  
  24.    public void readASCII(InputStream var1) throws CodingException, DeserializationException, IOException {
  25.       Deserializer var2 = null;
  26.       if (var1 instanceof Deserializer) {
  27.          var2 = (Deserializer)var1;
  28.       }
  29.  
  30.       this.idForName = new IdHashtable(true);
  31.       if (var2 == null) {
  32.          var2 = new Deserializer(var1);
  33.       }
  34.  
  35.       this.archiveDict = (Hashtable)var2.readObject();
  36.       this.loadVersions();
  37.       this.loadClassTables();
  38.       this.loadInstanceData();
  39.       this.loadRoots();
  40.    }
  41.  
  42.    void loadVersions() {
  43.       Hashtable var1 = (Hashtable)this.archiveDict.get("classVersions");
  44.       if (var1 != null) {
  45.          this.allVersions = new Hashtable(var1.count());
  46.          Enumeration var2 = var1.keys();
  47.  
  48.          while(var2.hasMoreElements()) {
  49.             String var3 = (String)var2.nextElement();
  50.             String var4 = (String)var1.get(var3);
  51.             int var5 = Integer.parseInt(var4);
  52.             this.allVersions.put(var3, new Integer(var5));
  53.          }
  54.  
  55.       }
  56.    }
  57.  
  58.    void loadClassTables() throws CodingException {
  59.       Hashtable var1 = (Hashtable)this.archiveDict.get("classTables");
  60.       if (var1 != null) {
  61.          Enumeration var3 = var1.keys();
  62.  
  63.          while(var3.hasMoreElements()) {
  64.             String var4 = (String)var3.nextElement();
  65.             Hashtable var2 = (Hashtable)var1.get(var4);
  66.             Object[] var5 = var2.get("fieldNames");
  67.             String[] var7 = new String[var5.length];
  68.             System.arraycopy(var5, 0, var7, 0, var7.length);
  69.             Object[] var6 = var2.get("fieldTypes");
  70.             byte[] var8 = fieldTypesForNames(var6);
  71.             ClassInfo var12 = new ClassInfo(var4);
  72.             int var11 = var7.length;
  73.  
  74.             for(int var10 = 0; var10 < var11; ++var10) {
  75.                var12.addField(var7[var10], var8[var10]);
  76.             }
  77.  
  78.             this.guessAtVersions(var4, var12);
  79.             ClassTable var9 = new ClassTable(this.archive, var12);
  80.             this.archive.addClassTable(var9);
  81.          }
  82.  
  83.       }
  84.    }
  85.  
  86.    void guessAtVersions(String var1, ClassInfo var2) {
  87.       Integer var6 = (Integer)this.allVersions.get(var1);
  88.       if (var6 != null) {
  89.          var2.addClass(var1, var6);
  90.       }
  91.  
  92.       Vector var4 = new Vector();
  93.  
  94.       try {
  95.          for(Class var3 = Class.forName(var1); var3 != null; var3 = var3.getSuperclass()) {
  96.             var4.addElement(var3.getName());
  97.          }
  98.       } catch (ClassNotFoundException var7) {
  99.          System.err.println("unable to find class: " + var1);
  100.          return;
  101.       }
  102.  
  103.       int var5 = var4.count();
  104.  
  105.       while(true) {
  106.          --var5;
  107.          if (var5 <= 0) {
  108.             return;
  109.          }
  110.  
  111.          var1 = (String)var4.elementAt(var5);
  112.          var6 = (Integer)this.allVersions.get(var1);
  113.          if (var6 != null) {
  114.             var2.addClass(var1, var6);
  115.          }
  116.       }
  117.    }
  118.  
  119.    static byte[] fieldTypesForNames(Object[] var0) throws CodingException {
  120.       int var2 = var0.length;
  121.       byte[] var3 = new byte[var2];
  122.  
  123.       for(int var1 = 0; var1 < var2; ++var1) {
  124.          String var4 = (String)var0[var1];
  125.          var3[var1] = typeForName(var4);
  126.       }
  127.  
  128.       return var3;
  129.    }
  130.  
  131.    static byte typeForName(String var0) throws CodingException {
  132.       var0 = var0.toLowerCase();
  133.       if (var0.equals("boolean")) {
  134.          return 0;
  135.       } else if (var0.equals("byte")) {
  136.          return 4;
  137.       } else if (var0.equals("short")) {
  138.          return 6;
  139.       } else if (var0.equals("int")) {
  140.          return 8;
  141.       } else if (var0.equals("long")) {
  142.          return 10;
  143.       } else if (var0.equals("float")) {
  144.          return 12;
  145.       } else if (var0.equals("double")) {
  146.          return 14;
  147.       } else if (var0.equals("string")) {
  148.          return 16;
  149.       } else if (var0.equals("byte_array")) {
  150.          return 5;
  151.       } else if (var0.equals("object")) {
  152.          return 18;
  153.       } else if (var0.equals("object_array")) {
  154.          return 19;
  155.       } else {
  156.          throw new CodingException("unknown type name: " + var0);
  157.       }
  158.    }
  159.  
  160.    void loadInstanceData() throws CodingException {
  161.       Hashtable var1 = (Hashtable)this.archiveDict.get("instances");
  162.       if (var1 != null) {
  163.          Enumeration var3 = var1.keys();
  164.  
  165.          while(var3.hasMoreElements()) {
  166.             String var4 = (String)var3.nextElement();
  167.             Hashtable var2 = (Hashtable)var1.get(var4);
  168.             if (this.idForName.get(var4) != 0) {
  169.                throw new CodingException("duplicate instance name: " + var4);
  170.             }
  171.  
  172.             String var5 = (String)var2.get("class");
  173.             if (var5 == null || var5.equals("")) {
  174.                throw new CodingException("missing className for instance: " + var4);
  175.             }
  176.  
  177.             ClassTable var6 = this.archive.classTableForName(var5);
  178.             if (var6 == null) {
  179.                throw new CodingException("bad class name for instance: " + var4);
  180.             }
  181.  
  182.             int var7 = var6.newIdentifier();
  183.             this.idForName.putKnownAbsent(var4, var7);
  184.          }
  185.  
  186.          var3 = var1.keys();
  187.  
  188.          while(var3.hasMoreElements()) {
  189.             String var11 = (String)var3.nextElement();
  190.             int var13 = this.idForName.get(var11);
  191.             ClassTable var12 = this.archive.tableForId[var13];
  192.             int var8 = this.archive.rowForId[var13];
  193.             Hashtable var9 = (Hashtable)var1.get(var11);
  194.             this.loadRow(var12, var8, var9);
  195.          }
  196.  
  197.       }
  198.    }
  199.  
  200.    void loadRow(ClassTable var1, int var2, Hashtable var3) throws CodingException {
  201.       for(int var4 = 0; var4 < var1.fieldCount; ++var4) {
  202.          Object var5 = var3.get(var1.fieldNames[var4]);
  203.          if (var5 instanceof Object[]) {
  204.             this.setColumnFromArray(var1, var2, var4, var5);
  205.          } else if (var5 instanceof String && !((String)var5).equals("")) {
  206.             this.setColumnFromString(var1, var2, var4, (String)var5);
  207.          }
  208.       }
  209.  
  210.    }
  211.  
  212.    void setColumnFromArray(ClassTable var1, int var2, int var3, Object[] var4) throws CodingException {
  213.       if (var1.fieldTypes[var3] != 19) {
  214.          throw new CodingException("bad data for field " + var1.fieldNames[var3]);
  215.       } else {
  216.          int[] var7 = new int[var4.length];
  217.  
  218.          for(int var5 = 0; var5 < var7.length; ++var5) {
  219.             int var6 = this.idForName.get(var4[var5]);
  220.             var7[var5] = var6;
  221.          }
  222.  
  223.          var1.setIdentifierArrayAt(var2, var3, var7);
  224.       }
  225.    }
  226.  
  227.    void setColumnFromString(ClassTable var1, int var2, int var3, String var4) throws NumberFormatException, CodingException {
  228.       switch (var1.fieldTypes[var3]) {
  229.          case 0:
  230.             if (var4.equalsIgnoreCase("true")) {
  231.                var1.setBooleanAt(var2, var3, true);
  232.                return;
  233.             } else {
  234.                if (var4.equalsIgnoreCase("false")) {
  235.                   var1.setBooleanAt(var2, var3, false);
  236.                   return;
  237.                }
  238.  
  239.                throw new CodingException("Invalid boolean value");
  240.             }
  241.          case 4:
  242.             var1.setByteAt(var2, var3, (byte)Integer.parseInt(var4));
  243.             return;
  244.          case 5:
  245.             var1.setByteArrayAt(var2, var3, this.bytesFromString(var4));
  246.             return;
  247.          case 6:
  248.             var1.setShortAt(var2, var3, (short)Integer.parseInt(var4));
  249.             return;
  250.          case 8:
  251.             var1.setIntAt(var2, var3, Integer.parseInt(var4));
  252.             return;
  253.          case 10:
  254.             var1.setLongAt(var2, var3, Long.parseLong(var4));
  255.             return;
  256.          case 12:
  257.             var1.setFloatAt(var2, var3, Float.valueOf(var4));
  258.             return;
  259.          case 14:
  260.             var1.setDoubleAt(var2, var3, Double.valueOf(var4));
  261.             return;
  262.          case 16:
  263.             var1.setStringAt(var2, var3, var4);
  264.             return;
  265.          case 18:
  266.             var1.setIdentifierAt(var2, var3, this.idForName.get(var4));
  267.             return;
  268.          default:
  269.             throw new CodingException("unknown type " + var1.fieldTypes[var3]);
  270.       }
  271.    }
  272.  
  273.    byte[] bytesFromString(String var1) {
  274.       if (var1 != null && !var1.equals("")) {
  275.          int var3 = var1.length();
  276.          byte[] var7 = new byte[var3 / 2 + 1];
  277.          int var2 = 0;
  278.          int var5 = 0;
  279.  
  280.          while(var2 < var3) {
  281.             while(var2 < var3) {
  282.                char var6 = var1.charAt(var2++);
  283.                if (!Character.isSpace(var6)) {
  284.                   if (var2 >= var3) {
  285.                      throw new NumberFormatException("bad byte string");
  286.                   }
  287.  
  288.                   int var4 = this.nibbleForHexChar(var6);
  289.                   var6 = var1.charAt(var2++);
  290.                   var7[var5++] = (byte)((var4 << 4) + this.nibbleForHexChar(var6));
  291.                }
  292.             }
  293.          }
  294.  
  295.          byte[] var8 = new byte[var5];
  296.          System.arraycopy(var7, 0, var8, 0, var5);
  297.          return var8;
  298.       } else {
  299.          return null;
  300.       }
  301.    }
  302.  
  303.    int nibbleForHexChar(char var1) {
  304.       if (var1 >= '0' && var1 <= '9') {
  305.          return var1 - 48;
  306.       } else if (var1 >= 'a' && var1 <= 'f') {
  307.          return var1 - 97 + 10;
  308.       } else if (var1 >= 'A' && var1 <= 'F') {
  309.          return var1 - 65 + 10;
  310.       } else {
  311.          throw new NumberFormatException("bad byte string");
  312.       }
  313.    }
  314.  
  315.    void loadRoots() throws CodingException {
  316.       Object[] var3 = this.archiveDict.get("rootInstances");
  317.       if (var3 != null && var3.length != 0) {
  318.          for(int var1 = 0; var1 < var3.length; ++var1) {
  319.             String var4 = (String)var3[var1];
  320.             int var2;
  321.             if (var4 != null && !var4.equals("")) {
  322.                var2 = this.idForName.get(var4);
  323.             } else {
  324.                var2 = 0;
  325.             }
  326.  
  327.             if (var2 == 0) {
  328.                throw new CodingException("unknown root instance " + var4);
  329.             }
  330.  
  331.             this.archive.addRootIdentifier(var2);
  332.          }
  333.  
  334.       } else {
  335.          throw new CodingException("no root instances");
  336.       }
  337.    }
  338. }
  339.