home *** CD-ROM | disk | FTP | other *** search
- package netscape.util;
-
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
-
- class ASCIIArchiveLoader {
- static final String classTablesKey = "classTables";
- static final String fieldNamesKey = "fieldNames";
- static final String fieldTypesKey = "fieldTypes";
- static final String classNamesKey = "classNames";
- static final String classVersionsKey = "classVersions";
- static final String instancesKey = "instances";
- static final String rootInstancesKey = "rootInstances";
- static final String archiveVersionKey = "archiveVersion";
- Archive archive;
- Hashtable archiveDict;
- IdHashtable idForName;
- String[] nameForId;
- Hashtable baseNameForTable;
- static byte[] hexChar = new byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102};
-
- ASCIIArchiveLoader(Archive var1) {
- this.archive = var1;
- }
-
- 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();
- String var3 = (String)this.archiveDict.get("archiveVersion");
- if (var3 == null) {
- throw new IOException("Missing archiveVersion");
- } else {
- this.archive.version = Integer.parseInt(var3);
- if (this.archive.version != 1) {
- throw new IOException("Unknown archiveVersion " + this.archive.version);
- } else {
- this.loadClassInfo();
- this.loadInstanceData();
- this.loadRoots();
- }
- }
- }
-
- void loadClassInfo() 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);
- ClassInfo var10 = new ClassInfo(var4);
- Object[] var7 = var2.get("classNames");
- Object[] var8 = var2.get("classVersions");
-
- for(int var11 = 0; var11 < var7.length; ++var11) {
- int var12 = Integer.parseInt((String)var8[var11]);
- var10.addClass((String)var7[var11], var12);
- }
-
- Object[] var5 = var2.get("fieldNames");
- Object[] var6 = var2.get("fieldTypes");
-
- for(int var13 = 0; var13 < var5.length; ++var13) {
- var10.addField((String)var5[var13], typeForName((String)var6[var13]));
- }
-
- ClassTable var9 = new ClassTable(this.archive, var10);
- this.archive.addClassTable(var9);
- }
-
- }
- }
-
- static byte typeForName(String var0) throws CodingException {
- int var1 = var0.length();
- if (var1 <= 0) {
- throw new CodingException("unknown type name: " + var0);
- } else {
- switch (var0.charAt(0)) {
- case 'b':
- if (var0.equals("boolean")) {
- return 0;
- }
-
- if (var0.equals("boolean[]")) {
- return 1;
- }
-
- if (var0.equals("byte")) {
- return 4;
- }
-
- if (var0.equals("byte[]")) {
- return 5;
- }
- break;
- case 'c':
- if (var0.equals("char")) {
- return 2;
- }
-
- if (var0.equals("char[]")) {
- return 3;
- }
- break;
- case 'd':
- if (var0.equals("double")) {
- return 14;
- }
-
- if (var0.equals("double[]")) {
- return 15;
- }
- break;
- case 'f':
- if (var0.equals("float")) {
- return 12;
- }
-
- if (var0.equals("float[]")) {
- return 13;
- }
- break;
- case 'i':
- if (var0.equals("int")) {
- return 8;
- }
-
- if (var0.equals("int[]")) {
- return 9;
- }
- break;
- case 'j':
- if (var1 == 16) {
- if (var0.equals("java.lang.String")) {
- return 16;
- }
-
- if (var0.equals("java.lang.Object")) {
- return 18;
- }
- } else if (var1 == 18) {
- if (var0.equals("java.lang.String[]")) {
- return 17;
- }
-
- if (var0.equals("java.lang.Object[]")) {
- return 19;
- }
- }
- break;
- case 'l':
- if (var0.equals("long")) {
- return 10;
- }
-
- if (var0.equals("long[]")) {
- return 11;
- }
- break;
- case 's':
- if (var0.equals("short")) {
- return 6;
- }
-
- if (var0.equals("short[]")) {
- return 7;
- }
- }
-
- throw new CodingException("unknown type name: " + var0);
- }
- }
-
- void loadInstanceData() throws CodingException {
- Hashtable var3 = (Hashtable)this.archiveDict.get("classTables");
- if (var3 != null) {
- Enumeration var2 = var3.keys();
-
- while(var2.hasMoreElements()) {
- String var1 = (String)var2.nextElement();
- Hashtable var4 = (Hashtable)var3.get(var1);
- this.loadRowMapping(var1, var4);
- }
-
- var2 = var3.keys();
-
- while(var2.hasMoreElements()) {
- String var5 = (String)var2.nextElement();
- Hashtable var7 = (Hashtable)var3.get(var5);
- this.loadRowData(var5, var7);
- }
-
- }
- }
-
- void loadRowMapping(String var1, Hashtable var2) throws CodingException {
- Hashtable var4 = (Hashtable)var2.get("instances");
- if (var4 != null) {
- Enumeration var7 = var4.keys();
-
- while(var7.hasMoreElements()) {
- String var8 = (String)var7.nextElement();
- Hashtable var5 = (Hashtable)var4.get(var8);
- if (this.idForName.get(var8) != 0) {
- throw new CodingException("duplicate instance name: " + var8);
- }
-
- ClassTable var6 = this.archive.classTableForName(var1);
- if (var6 == null) {
- throw new CodingException("bad class name for instance: " + var8);
- }
-
- int var3 = var6.newIdentifier();
- this.idForName.putKnownAbsent(var8, var3);
- }
-
- }
- }
-
- void loadRowData(String var1, Hashtable var2) throws CodingException {
- Hashtable var8 = (Hashtable)var2.get("instances");
- if (var8 != null) {
- Enumeration var5 = var8.keys();
-
- while(var5.hasMoreElements()) {
- String var6 = (String)var5.nextElement();
- int var3 = this.idForName.get(var6);
- ClassTable var7 = this.archive.tableForId[var3];
- int var4 = this.archive.rowForId[var3];
- Hashtable var9 = (Hashtable)var8.get(var6);
- this.loadRow(var7, var4, 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 != null) {
- this.setColumnFromValue(var1, var2, var4, var5);
- }
- }
-
- }
-
- void setColumnFromValue(ClassTable var1, int var2, int var3, Object var4) throws CodingException {
- Object var15 = null;
- Object var16 = null;
- if (var4 instanceof String) {
- String var42 = (String)var4;
- switch (var1.fieldTypes[var3]) {
- case 0:
- if (var42.equalsIgnoreCase("true")) {
- var1.setBooleanAt(var2, var3, true);
- return;
- } else {
- if (var42.equalsIgnoreCase("false")) {
- var1.setBooleanAt(var2, var3, false);
- return;
- }
-
- throw new CodingException("Invalid boolean value");
- }
- case 2:
- var1.setCharAt(var2, var3, var42.charAt(0));
- return;
- case 4:
- var1.setByteAt(var2, var3, (byte)Integer.parseInt(var42));
- return;
- case 5:
- var1.setByteArrayAt(var2, var3, this.bytesFromString(var42));
- return;
- case 6:
- var1.setShortAt(var2, var3, (short)Integer.parseInt(var42));
- return;
- case 8:
- var1.setIntAt(var2, var3, Integer.parseInt(var42));
- return;
- case 10:
- var1.setLongAt(var2, var3, Long.parseLong(var42));
- return;
- case 12:
- var1.setFloatAt(var2, var3, Float.valueOf(var42));
- return;
- case 14:
- var1.setDoubleAt(var2, var3, Double.valueOf(var42));
- return;
- case 16:
- var1.setStringAt(var2, var3, var42);
- return;
- case 18:
- var1.setIdentifierAt(var2, var3, this.idForName.get(var42));
- return;
- default:
- throw new CodingException("Invalid value " + var42);
- }
- } else if (var4 instanceof Object[]) {
- var16 = var4;
- switch (var1.fieldTypes[var3]) {
- case 1:
- int var32 = ((Object[])var16).length;
- boolean[] var7 = new boolean[var32];
-
- for(int var24 = 0; var24 < var32; ++var24) {
- String var41 = (String)((Object[])var16)[var24];
- if (var41.equalsIgnoreCase("true")) {
- var7[var24] = true;
- } else {
- if (!var41.equalsIgnoreCase("false")) {
- throw new CodingException("Invalid boolean value");
- }
-
- var7[var24] = false;
- }
- }
-
- var1.setBooleanArrayAt(var2, var3, var7);
- return;
- case 3:
- int var31 = ((Object[])var16).length;
- char[] var8 = new char[var31];
-
- for(int var23 = 0; var23 < var31; ++var23) {
- String var40 = (String)((Object[])var16)[var23];
- var8[var23] = var40.charAt(0);
- }
-
- var1.setCharArrayAt(var2, var3, var8);
- return;
- case 7:
- int var30 = ((Object[])var16).length;
- short[] var9 = new short[var30];
-
- for(int var22 = 0; var22 < var30; ++var22) {
- String var39 = (String)((Object[])var16)[var22];
- var9[var22] = (short)Integer.parseInt(var39);
- }
-
- var1.setShortArrayAt(var2, var3, var9);
- return;
- case 9:
- int var29 = ((Object[])var16).length;
- int[] var33 = new int[var29];
-
- for(int var21 = 0; var21 < var29; ++var21) {
- String var38 = (String)((Object[])var16)[var21];
- var33[var21] = Integer.parseInt(var38);
- }
-
- var1.setIntArrayAt(var2, var3, var33);
- return;
- case 11:
- int var28 = ((Object[])var16).length;
- long[] var11 = new long[var28];
-
- for(int var20 = 0; var20 < var28; ++var20) {
- String var37 = (String)((Object[])var16)[var20];
- var11[var20] = Long.parseLong(var37);
- }
-
- var1.setLongArrayAt(var2, var3, var11);
- return;
- case 13:
- int var27 = ((Object[])var16).length;
- float[] var12 = new float[var27];
-
- for(int var19 = 0; var19 < var27; ++var19) {
- String var36 = (String)((Object[])var16)[var19];
- var12[var19] = Float.valueOf(var36);
- }
-
- var1.setFloatArrayAt(var2, var3, var12);
- return;
- case 15:
- int var26 = ((Object[])var16).length;
- double[] var13 = new double[var26];
-
- for(int var18 = 0; var18 < var26; ++var18) {
- String var35 = (String)((Object[])var16)[var18];
- var13[var18] = Double.valueOf(var35);
- }
-
- var1.setDoubleArrayAt(var2, var3, var13);
- return;
- case 17:
- int var25 = ((Object[])var16).length;
- String[] var14 = new String[var25];
-
- for(int var17 = 0; var17 < var25; ++var17) {
- var14[var17] = (String)((Object[])var16)[var17];
- }
-
- var1.setStringArrayAt(var2, var3, var14);
- return;
- case 19:
- int var6 = ((Object[])var16).length;
- int[] var10 = new int[var6];
-
- for(int var5 = 0; var5 < var6; ++var5) {
- String var34 = (String)((Object[])var16)[var5];
- if (var34 != null) {
- var10[var5] = this.idForName.get(var34);
- }
- }
-
- var1.setIdentifierArrayAt(var2, var3, var10);
- return;
- default:
- throw new CodingException("Invalid value" + var15);
- }
- }
- }
-
- byte[] bytesFromString(String var1) {
- if (var1 == null) {
- return null;
- } else if (var1.equals("")) {
- return new byte[0];
- } else {
- 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;
- }
- }
-
- 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);
- }
-
- }
- }
-
- void writeASCII(OutputStream var1, boolean var2) throws IOException {
- this.nameForId = new String[this.archive.idCount];
- this.baseNameForTable = new Hashtable();
- this.archiveDict = new Hashtable();
- String var4 = String.valueOf(1);
- this.archiveDict.put("archiveVersion", var4);
- this.saveClassInfo();
- this.saveInstanceData();
- this.saveRoots();
- Object var3;
- if (var2) {
- var3 = new FormattingSerializer(var1);
- } else {
- var3 = new Serializer(var1);
- }
-
- ((Serializer)var3).writeObject(this.archiveDict);
- ((Serializer)var3).flush();
- }
-
- String nameForId(int var1) {
- String var2 = this.nameForId[var1];
- if (var2 != null) {
- return var2;
- } else {
- ClassTable var5 = this.archive.tableForId[var1];
- if (var5 == null) {
- return null;
- } else {
- String var3 = (String)this.baseNameForTable.get(var5);
- if (var3 == null) {
- var3 = var5.className();
- int var6 = var3.lastIndexOf(46);
- if (var6 > 0 && var6 < var3.length() - 1 && var3.charAt(0) != '[') {
- var3 = var3.substring(var6 + 1, var3.length());
- }
-
- var3 = var3 + "-";
- if (this.baseNameForTable.get(var3) != null) {
- var3 = var5.className() + "-";
-
- for(int var7 = 0; this.baseNameForTable.get(var3) != null; ++var7) {
- var3 = var5.className() + "-" + var7 + "-";
- }
- }
-
- this.baseNameForTable.put(var5, var3);
- }
-
- int var10 = this.decimalDigitCount(var5.rowCount());
- String var4 = this.decimalString(this.archive.rowForId[var1], var10);
- var2 = var3 + var4;
- this.nameForId[var1] = var2;
- return var2;
- }
- }
- }
-
- int decimalDigitCount(int var1) {
- int var2;
- for(var2 = 0; var1 > 0; var1 /= 10) {
- ++var2;
- }
-
- return var2;
- }
-
- String decimalString(int var1, int var2) {
- char[] var4 = new char[var2];
-
- for(int var3 = 0; var3 < var2; ++var3) {
- var4[var3] = '0';
- }
-
- for(int var5 = var2; var1 > 0 && var5 > 0; var1 /= 10) {
- --var5;
- var4[var5] = (char)(var1 % 10 + 48);
- }
-
- return new String(var4);
- }
-
- void saveClassInfo() {
- Hashtable var1 = new Hashtable();
- Enumeration var3 = this.archive.classTables.elements();
-
- while(var3.hasMoreElements()) {
- ClassTable var4 = (ClassTable)var3.nextElement();
- Hashtable var2 = this.dictionaryForTable(var4);
- var1.put(var4.className(), var2);
- }
-
- this.archiveDict.put("classTables", var1);
- }
-
- Hashtable dictionaryForTable(ClassTable var1) {
- Hashtable var3 = new Hashtable(5);
- String[] var4 = new String[var1.fieldCount];
-
- for(int var2 = 0; var2 < var1.fieldCount; ++var2) {
- var4[var2] = this.nameForType(var1.fieldTypes[var2]);
- }
-
- var3.put("fieldNames", var1.fieldNames);
- var3.put("fieldTypes", var4);
- String[] var5 = new String[var1.classCount];
-
- for(int var6 = 0; var6 < var1.classCount; ++var6) {
- var5[var6] = String.valueOf(var1.classVersions[var6]);
- }
-
- var3.put("classNames", var1.classNames);
- var3.put("classVersions", var5);
- return var3;
- }
-
- String nameForType(int var1) {
- switch (var1) {
- case 0:
- return "boolean";
- case 1:
- return "boolean[]";
- case 2:
- return "char";
- case 3:
- return "char[]";
- case 4:
- return "byte";
- case 5:
- return "byte[]";
- case 6:
- return "short";
- case 7:
- return "short[]";
- case 8:
- return "int";
- case 9:
- return "int[]";
- case 10:
- return "long";
- case 11:
- return "long[]";
- case 12:
- return "float";
- case 13:
- return "float[]";
- case 14:
- return "double";
- case 15:
- return "double[]";
- case 16:
- return "java.lang.String";
- case 17:
- return "java.lang.String[]";
- case 18:
- return "java.lang.Object";
- case 19:
- return "java.lang.Object[]";
- default:
- throw new IllegalArgumentException("Unknown field type: " + var1);
- }
- }
-
- void saveInstanceData() {
- Hashtable var5 = (Hashtable)this.archiveDict.get("classTables");
-
- for(int var1 = 1; var1 < this.archive.idCount; ++var1) {
- ClassTable var7 = this.archive.tableForId[var1];
- int var2 = this.archive.rowForId[var1];
- Hashtable var4 = this.dictionaryForInstance(var7, var2);
- Hashtable var6 = (Hashtable)var5.get(var7.className);
- Hashtable var3 = (Hashtable)var6.get("instances");
- if (var3 == null) {
- var3 = new Hashtable();
- var6.put("instances", var3);
- }
-
- var3.put(this.nameForId(var1), var4);
- }
-
- }
-
- Hashtable dictionaryForInstance(ClassTable var1, int var2) {
- Hashtable var4 = new Hashtable(2 * var1.fieldCount);
-
- for(int var3 = 0; var3 < var1.fieldCount; ++var3) {
- Object var5 = this.valueForField(var1, var2, var3);
- if (var5 != null) {
- var4.put(var1.fieldNames[var3], var5);
- }
- }
-
- return var4;
- }
-
- Object valueForField(ClassTable var1, int var2, int var3) {
- switch (var1.fieldTypes[var3]) {
- case 0:
- return String.valueOf(var1.booleanAt(var2, var3));
- case 1:
- boolean[] var6 = var1.booleanArrayAt(var2, var3);
- if (var6 == null) {
- return null;
- }
-
- int var27 = var6.length;
- String[] var35 = new String[var27];
-
- for(int var20 = 0; var20 < var27; ++var20) {
- var35[var20] = String.valueOf(var6[var20]);
- }
-
- return var35;
- case 2:
- return String.valueOf(var1.charAt(var2, var3));
- case 3:
- char[] var7 = var1.charArrayAt(var2, var3);
- if (var7 == null) {
- return null;
- }
-
- int var26 = var7.length;
- String[] var34 = new String[var26];
-
- for(int var19 = 0; var19 < var26; ++var19) {
- var34[var19] = String.valueOf(var7[var19]);
- }
-
- return var34;
- case 4:
- return String.valueOf(var1.byteAt(var2, var3) & 255);
- case 5:
- return bytesString(var1.byteArrayAt(var2, var3));
- case 6:
- return String.valueOf(var1.shortAt(var2, var3));
- case 7:
- short[] var8 = var1.shortArrayAt(var2, var3);
- if (var8 == null) {
- return null;
- }
-
- int var25 = var8.length;
- String[] var33 = new String[var25];
-
- for(int var18 = 0; var18 < var25; ++var18) {
- var33[var18] = String.valueOf(var8[var18]);
- }
-
- return var33;
- case 8:
- return String.valueOf(var1.intAt(var2, var3));
- case 9:
- int[] var28 = var1.intArrayAt(var2, var3);
- if (var28 == null) {
- return null;
- }
-
- int var24 = var28.length;
- String[] var32 = new String[var24];
-
- for(int var17 = 0; var17 < var24; ++var17) {
- var32[var17] = String.valueOf(var28[var17]);
- }
-
- return var32;
- case 10:
- return String.valueOf(var1.longAt(var2, var3));
- case 11:
- long[] var10 = var1.longArrayAt(var2, var3);
- if (var10 == null) {
- return null;
- }
-
- int var23 = var10.length;
- String[] var31 = new String[var23];
-
- for(int var16 = 0; var16 < var23; ++var16) {
- var31[var16] = String.valueOf(var10[var16]);
- }
-
- return var31;
- case 12:
- return String.valueOf(var1.floatAt(var2, var3));
- case 13:
- float[] var11 = var1.floatArrayAt(var2, var3);
- if (var11 == null) {
- return null;
- }
-
- int var22 = var11.length;
- String[] var30 = new String[var22];
-
- for(int var15 = 0; var15 < var22; ++var15) {
- var30[var15] = String.valueOf(var11[var15]);
- }
-
- return var30;
- case 14:
- return String.valueOf(var1.doubleAt(var2, var3));
- case 15:
- double[] var12 = var1.doubleArrayAt(var2, var3);
- if (var12 == null) {
- return null;
- }
-
- int var21 = var12.length;
- String[] var29 = new String[var21];
-
- for(int var14 = 0; var14 < var21; ++var14) {
- var29[var14] = String.valueOf(var12[var14]);
- }
-
- return var29;
- case 16:
- return var1.stringAt(var2, var3);
- case 17:
- return var1.stringArrayAt(var2, var3);
- case 18:
- return this.nameForId(var1.identifierAt(var2, var3));
- case 19:
- int[] var9 = var1.identifierArrayAt(var2, var3);
- if (var9 == null) {
- return null;
- }
-
- int var5 = var9.length;
- String[] var13 = new String[var5];
-
- for(int var4 = 0; var4 < var5; ++var4) {
- var13[var4] = this.nameForId(var9[var4]);
- }
-
- return var13;
- default:
- throw new InconsistencyException("Unknown field type: " + var1.fieldTypes[var3]);
- }
- }
-
- static String bytesString(byte[] var0) {
- if (var0 == null) {
- return null;
- } else if (var0.length == 0) {
- return "";
- } else {
- int var2 = var0.length;
- byte[] var5 = new byte[2 * var2 + var2 / 4 + 1];
- int var3 = 0;
-
- for(int var1 = 0; var1 < var2; ++var1) {
- byte var4 = var0[var1];
- var5[var3++] = hexChar[var4 >>> 4 & 15];
- var5[var3++] = hexChar[var4 & 15];
- if ((var1 + 1) % 4 == 0) {
- var5[var3++] = 32;
- }
- }
-
- if (var5[var3 - 1] == 32) {
- --var3;
- }
-
- return new String(var5, 0, 0, var3);
- }
- }
-
- void saveRoots() {
- String[] var2 = new String[this.archive.rootCount];
-
- for(int var1 = 0; var1 < this.archive.rootCount; ++var1) {
- var2[var1] = this.nameForId(this.archive.roots[var1]);
- }
-
- this.archiveDict.put("rootInstances", var2);
- }
- }
-