home *** CD-ROM | disk | FTP | other *** search
- package netscape.util;
-
- import java.io.IOException;
- import java.io.InputStream;
-
- public class BariumArchiveLoader {
- static final String classVersionsKey = "classVersions";
- static final String classTablesKey = "classTables";
- static final String fieldNamesKey = "fieldNames";
- static final String fieldTypesKey = "fieldTypes";
- static final String instancesKey = "instances";
- static final String classNameKey = "class";
- static final String rootInstancesKey = "rootInstances";
- Archive archive;
- Hashtable archiveDict;
- Hashtable allVersions;
- IdHashtable idForName;
- String[] nameForId;
-
- public BariumArchiveLoader(Archive var1) {
- this.archive = var1;
- }
-
- public void readASCII(InputStream var1) throws CodingException, DeserializationException, IOException {
- Deserializer var2 = null;
- if (var1 instanceof Deserializer) {
- var2 = (Deserializer)var1;
- }
-
- this.idForName = new IdHashtable(true);
- if (var2 == null) {
- var2 = new Deserializer(var1);
- }
-
- this.archiveDict = (Hashtable)var2.readObject();
- this.loadVersions();
- this.loadClassTables();
- this.loadInstanceData();
- this.loadRoots();
- }
-
- void loadVersions() {
- Hashtable var1 = (Hashtable)this.archiveDict.get("classVersions");
- if (var1 != null) {
- this.allVersions = new Hashtable(var1.count());
- Enumeration var2 = var1.keys();
-
- while(var2.hasMoreElements()) {
- String var3 = (String)var2.nextElement();
- String var4 = (String)var1.get(var3);
- int var5 = Integer.parseInt(var4);
- this.allVersions.put(var3, new Integer(var5));
- }
-
- }
- }
-
- void loadClassTables() throws CodingException {
- Hashtable var1 = (Hashtable)this.archiveDict.get("classTables");
- if (var1 != null) {
- Enumeration var3 = var1.keys();
-
- while(var3.hasMoreElements()) {
- String var4 = (String)var3.nextElement();
- Hashtable var2 = (Hashtable)var1.get(var4);
- Object[] var5 = var2.get("fieldNames");
- String[] var7 = new String[var5.length];
- System.arraycopy(var5, 0, var7, 0, var7.length);
- Object[] var6 = var2.get("fieldTypes");
- byte[] var8 = fieldTypesForNames(var6);
- ClassInfo var12 = new ClassInfo(var4);
- int var11 = var7.length;
-
- for(int var10 = 0; var10 < var11; ++var10) {
- var12.addField(var7[var10], var8[var10]);
- }
-
- this.guessAtVersions(var4, var12);
- ClassTable var9 = new ClassTable(this.archive, var12);
- this.archive.addClassTable(var9);
- }
-
- }
- }
-
- void guessAtVersions(String var1, ClassInfo var2) {
- Integer var6 = (Integer)this.allVersions.get(var1);
- if (var6 != null) {
- var2.addClass(var1, var6);
- }
-
- Vector var4 = new Vector();
-
- try {
- for(Class var3 = Class.forName(var1); var3 != null; var3 = var3.getSuperclass()) {
- var4.addElement(var3.getName());
- }
- } catch (ClassNotFoundException var7) {
- System.err.println("unable to find class: " + var1);
- return;
- }
-
- int var5 = var4.count();
-
- while(true) {
- --var5;
- if (var5 <= 0) {
- return;
- }
-
- var1 = (String)var4.elementAt(var5);
- var6 = (Integer)this.allVersions.get(var1);
- if (var6 != null) {
- var2.addClass(var1, var6);
- }
- }
- }
-
- static byte[] fieldTypesForNames(Object[] var0) throws CodingException {
- int var2 = var0.length;
- byte[] var3 = new byte[var2];
-
- for(int var1 = 0; var1 < var2; ++var1) {
- String var4 = (String)var0[var1];
- var3[var1] = typeForName(var4);
- }
-
- return var3;
- }
-
- static byte typeForName(String var0) throws CodingException {
- var0 = var0.toLowerCase();
- if (var0.equals("boolean")) {
- return 0;
- } else if (var0.equals("byte")) {
- return 4;
- } else if (var0.equals("short")) {
- return 6;
- } else if (var0.equals("int")) {
- return 8;
- } else if (var0.equals("long")) {
- return 10;
- } else if (var0.equals("float")) {
- return 12;
- } else if (var0.equals("double")) {
- return 14;
- } else if (var0.equals("string")) {
- return 16;
- } else if (var0.equals("byte_array")) {
- return 5;
- } else if (var0.equals("object")) {
- return 18;
- } else if (var0.equals("object_array")) {
- return 19;
- } else {
- throw new CodingException("unknown type name: " + var0);
- }
- }
-
- void loadInstanceData() throws CodingException {
- Hashtable var1 = (Hashtable)this.archiveDict.get("instances");
- if (var1 != null) {
- Enumeration var3 = var1.keys();
-
- while(var3.hasMoreElements()) {
- String var4 = (String)var3.nextElement();
- Hashtable var2 = (Hashtable)var1.get(var4);
- if (this.idForName.get(var4) != 0) {
- throw new CodingException("duplicate instance name: " + var4);
- }
-
- String var5 = (String)var2.get("class");
- if (var5 == null || var5.equals("")) {
- throw new CodingException("missing className for instance: " + var4);
- }
-
- ClassTable var6 = this.archive.classTableForName(var5);
- if (var6 == null) {
- throw new CodingException("bad class name for instance: " + var4);
- }
-
- int var7 = var6.newIdentifier();
- this.idForName.putKnownAbsent(var4, var7);
- }
-
- var3 = var1.keys();
-
- while(var3.hasMoreElements()) {
- String var11 = (String)var3.nextElement();
- int var13 = this.idForName.get(var11);
- ClassTable var12 = this.archive.tableForId[var13];
- int var8 = this.archive.rowForId[var13];
- Hashtable var9 = (Hashtable)var1.get(var11);
- this.loadRow(var12, var8, var9);
- }
-
- }
- }
-
- void loadRow(ClassTable var1, int var2, Hashtable var3) throws CodingException {
- for(int var4 = 0; var4 < var1.fieldCount; ++var4) {
- Object var5 = var3.get(var1.fieldNames[var4]);
- if (var5 instanceof Object[]) {
- this.setColumnFromArray(var1, var2, var4, var5);
- } else if (var5 instanceof String && !((String)var5).equals("")) {
- this.setColumnFromString(var1, var2, var4, (String)var5);
- }
- }
-
- }
-
- void setColumnFromArray(ClassTable var1, int var2, int var3, Object[] var4) throws CodingException {
- if (var1.fieldTypes[var3] != 19) {
- throw new CodingException("bad data for field " + var1.fieldNames[var3]);
- } else {
- int[] var7 = new int[var4.length];
-
- for(int var5 = 0; var5 < var7.length; ++var5) {
- int var6 = this.idForName.get(var4[var5]);
- var7[var5] = var6;
- }
-
- var1.setIdentifierArrayAt(var2, var3, var7);
- }
- }
-
- void setColumnFromString(ClassTable var1, int var2, int var3, String var4) throws NumberFormatException, CodingException {
- switch (var1.fieldTypes[var3]) {
- case 0:
- if (var4.equalsIgnoreCase("true")) {
- var1.setBooleanAt(var2, var3, true);
- return;
- } else {
- if (var4.equalsIgnoreCase("false")) {
- var1.setBooleanAt(var2, var3, false);
- return;
- }
-
- throw new CodingException("Invalid boolean value");
- }
- case 4:
- var1.setByteAt(var2, var3, (byte)Integer.parseInt(var4));
- return;
- case 5:
- var1.setByteArrayAt(var2, var3, this.bytesFromString(var4));
- return;
- case 6:
- var1.setShortAt(var2, var3, (short)Integer.parseInt(var4));
- return;
- case 8:
- var1.setIntAt(var2, var3, Integer.parseInt(var4));
- return;
- case 10:
- var1.setLongAt(var2, var3, Long.parseLong(var4));
- return;
- case 12:
- var1.setFloatAt(var2, var3, Float.valueOf(var4));
- return;
- case 14:
- var1.setDoubleAt(var2, var3, Double.valueOf(var4));
- return;
- case 16:
- var1.setStringAt(var2, var3, var4);
- return;
- case 18:
- var1.setIdentifierAt(var2, var3, this.idForName.get(var4));
- return;
- default:
- throw new CodingException("unknown type " + var1.fieldTypes[var3]);
- }
- }
-
- byte[] bytesFromString(String var1) {
- if (var1 != null && !var1.equals("")) {
- int var3 = var1.length();
- byte[] var7 = new byte[var3 / 2 + 1];
- int var2 = 0;
- int var5 = 0;
-
- while(var2 < var3) {
- while(var2 < var3) {
- char var6 = var1.charAt(var2++);
- if (!Character.isSpace(var6)) {
- if (var2 >= var3) {
- throw new NumberFormatException("bad byte string");
- }
-
- int var4 = this.nibbleForHexChar(var6);
- var6 = var1.charAt(var2++);
- var7[var5++] = (byte)((var4 << 4) + this.nibbleForHexChar(var6));
- }
- }
- }
-
- byte[] var8 = new byte[var5];
- System.arraycopy(var7, 0, var8, 0, var5);
- return var8;
- } else {
- return null;
- }
- }
-
- int nibbleForHexChar(char var1) {
- if (var1 >= '0' && var1 <= '9') {
- return var1 - 48;
- } else if (var1 >= 'a' && var1 <= 'f') {
- return var1 - 97 + 10;
- } else if (var1 >= 'A' && var1 <= 'F') {
- return var1 - 65 + 10;
- } else {
- throw new NumberFormatException("bad byte string");
- }
- }
-
- void loadRoots() throws CodingException {
- Object[] var3 = this.archiveDict.get("rootInstances");
- if (var3 != null && var3.length != 0) {
- for(int var1 = 0; var1 < var3.length; ++var1) {
- String var4 = (String)var3[var1];
- int var2;
- if (var4 != null && !var4.equals("")) {
- var2 = this.idForName.get(var4);
- } else {
- var2 = 0;
- }
-
- if (var2 == 0) {
- throw new CodingException("unknown root instance " + var4);
- }
-
- this.archive.addRootIdentifier(var2);
- }
-
- } else {
- throw new CodingException("no root instances");
- }
- }
- }
-