home *** CD-ROM | disk | FTP | other *** search
- package java.io;
-
- import sun.misc.Ref;
-
- public class ObjectStreamClass implements Serializable {
- private static final int M_TRANSIENT = 128;
- private static final int M_PRIVATE = 2;
- private static final int M_STATIC = 8;
- private static ObjectStreamClassEntry[] descriptorFor = new ObjectStreamClassEntry[61];
- private String name;
- private ObjectStreamClass superclass;
- private boolean serializable;
- private boolean externalizable;
- private ObjectStreamField[] fields;
- private Class ofClass;
- private long suid;
- private int[] fieldSequence;
- private boolean hasWriteObjectMethod;
- private ObjectStreamClass localClassDesc;
- private static Class classSerializable = null;
- private static Class classExternalizable = null;
-
- public static ObjectStreamClass lookup(Class var0) {
- Object var1 = null;
- ObjectStreamClassEntry[] var3 = descriptorFor;
- synchronized(var3){}
-
- ObjectStreamClass var2;
- try {
- ObjectStreamClass var11 = findDescriptorFor(var0);
- if (var11 == null) {
- boolean var5 = classSerializable.isAssignableFrom(var0);
- if (!var5) {
- var2 = null;
- return var2;
- }
-
- boolean var6 = classExternalizable.isAssignableFrom(var0);
- if (var6) {
- var5 = false;
- }
-
- ObjectStreamClass var7 = null;
- if (var5) {
- Class var8 = var0.getSuperclass();
- if (var8 != null) {
- var7 = lookup(var8);
- }
- }
-
- var11 = new ObjectStreamClass(var0, var7, var5, var6);
- return var11;
- }
-
- var2 = var11;
- } catch (Throwable var10) {
- throw var10;
- }
-
- return var2;
- }
-
- public String getName() {
- return this.name;
- }
-
- public long getSerialVersionUID() {
- return this.suid;
- }
-
- public Class forClass() {
- return this.ofClass;
- }
-
- public String toString() {
- StringBuffer var1 = new StringBuffer();
- var1.append(this.name);
- var1.append(": static final long serialVersionUID = ");
- var1.append(Long.toString(this.suid));
- var1.append("L;");
- return var1.toString();
- }
-
- private ObjectStreamClass(Class var1, ObjectStreamClass var2, boolean var3, boolean var4) {
- this.ofClass = var1;
- this.name = var1.getName();
- this.superclass = var2;
- this.serializable = var3;
- this.externalizable = var4;
- insertDescriptorFor(this);
- if (!this.externalizable && !this.name.equals("java.lang.String")) {
- this.fields = this.getFields0(var1);
- if (this.fields.length > 0) {
- boolean var6;
- do {
- var6 = true;
-
- for(int var5 = this.fields.length - 1; var5 > 0; --var5) {
- if (this.fields[var5 - 1].compare(this.fields[var5]) > 0) {
- ObjectStreamField var7 = this.fields[var5];
- this.fields[var5] = this.fields[var5 - 1];
- this.fields[var5 - 1] = var7;
- var6 = false;
- }
- }
- } while(!var6);
-
- this.computeFieldSequence();
- }
- } else {
- this.fields = new ObjectStreamField[0];
- }
-
- this.suid = getSerialVersionUID(var1);
- if (this.suid == 0L) {
- this.suid = computeSerialVersionUID(var1);
- }
-
- this.hasWriteObjectMethod = hasWriteObject(var1);
- }
-
- ObjectStreamClass(String var1, long var2) {
- this.name = var1;
- this.suid = var2;
- this.superclass = null;
- }
-
- void setClass(Class var1) throws InvalidClassException {
- this.localClassDesc = lookup(var1);
- if (var1.getName().equals(this.name) && this.suid == this.localClassDesc.suid) {
- if (this.serializable == this.localClassDesc.serializable && this.externalizable == this.localClassDesc.externalizable) {
- ObjectStreamField[] var2 = this.localClassDesc.getFields();
- ObjectStreamField[] var3 = this.fields;
- int var4 = 0;
-
- label36:
- for(int var5 = 0; var5 < var3.length; ++var5) {
- for(int var6 = var4; var6 < var2.length; ++var6) {
- if (var3[var5].name.equals(var2[var6].name)) {
- if (!var3[var5].typeEquals(var2[var6])) {
- throw new InvalidClassException(var1.getName(), "The type of field " + var3[var5].name + " of class " + this.name + " is incompatible.");
- }
-
- var4 = var6;
- var3[var5].offset = var2[var6].offset;
- continue label36;
- }
- }
-
- var3[var5].offset = -1;
- }
-
- this.computeFieldSequence();
- this.ofClass = var1;
- } else {
- throw new InvalidClassException(var1.getName(), "Serialization incompatible with Externalization");
- }
- } else {
- throw new InvalidClassException(var1.getName(), "Local class not compatible");
- }
- }
-
- boolean typeEquals(ObjectStreamClass var1) {
- return this.suid == var1.suid && this.name.equals(var1.name);
- }
-
- ObjectStreamField[] getFields() {
- return this.fields;
- }
-
- void setSuperclass(ObjectStreamClass var1) {
- this.superclass = var1;
- }
-
- ObjectStreamClass getSuperclass() {
- return this.superclass;
- }
-
- boolean hasWriteObject() {
- return this.hasWriteObjectMethod;
- }
-
- ObjectStreamClass localClassDescriptor() {
- return this.localClassDesc;
- }
-
- boolean isExternalizable() {
- return this.externalizable;
- }
-
- int[] getFieldSequence() {
- return this.fieldSequence;
- }
-
- private void computeFieldSequence() {
- this.fieldSequence = new int[this.fields.length * 2];
-
- for(int var1 = 0; var1 < this.fields.length; ++var1) {
- this.fieldSequence[var1 * 2] = this.fields[var1].type;
- this.fieldSequence[var1 * 2 + 1] = this.fields[var1].offset;
- }
-
- }
-
- private static long computeSerialVersionUID(Class var0) {
- new ByteArrayOutputStream(512);
- long var1 = 0L;
-
- try {
- SHAOutputStream var3 = new SHAOutputStream();
- DataOutputStream var4 = new DataOutputStream(var3);
- var4.writeUTF(var0.getName());
- int var5 = getClassAccess(var0);
- var5 &= 1553;
- var4.writeInt(var5);
- Class[] var6 = var0.getInterfaces();
- quicksort(var6);
-
- for(int var7 = 0; var7 < var6.length; ++var7) {
- var4.writeUTF(var6[var7].getName());
- }
-
- String[] var8 = getFieldSignatures(var0);
- quicksort(var8);
-
- for(int var9 = 0; var9 < var8.length; ++var9) {
- String var10 = var8[var9];
- int var11 = getFieldAccess(var0, var10);
- if ((var11 & 2) != 2 || (var11 & 128) != 128 && (var11 & 8) != 8) {
- int var12 = var10.indexOf(32);
- String var13 = var10.substring(0, var12);
- String var14 = var10.substring(var12 + 1);
- var4.writeUTF(var13);
- var4.writeInt(var11);
- var4.writeUTF(var14);
- }
- }
-
- String[] var19 = getMethodSignatures(var0);
- quicksort(var19);
-
- for(int var20 = 0; var20 < var19.length; ++var20) {
- String var21 = var19[var20];
- int var23 = getMethodAccess(var0, var21);
- if ((var23 & 2) == 0) {
- int var25 = var21.indexOf(32);
- String var15 = var21.substring(0, var25);
- String var16 = var21.substring(var25 + 1);
- var16 = var16.replace('/', '.');
- var4.writeUTF(var15);
- var4.writeInt(var23);
- var4.writeUTF(var16);
- }
- }
-
- byte[] var22 = var3.getHash();
-
- for(int var24 = 0; var24 < Math.min(8, var22.length); ++var24) {
- var1 += (long)(var22[var24] & 255) << var24 * 8;
- }
- } catch (IOException var17) {
- var1 = -1L;
- }
-
- return var1;
- }
-
- private static native int getClassAccess(Class var0);
-
- private static native String[] getMethodSignatures(Class var0);
-
- private static native int getMethodAccess(Class var0, String var1);
-
- private static native String[] getFieldSignatures(Class var0);
-
- private static native int getFieldAccess(Class var0, String var1);
-
- void write(ObjectOutputStream var1) throws IOException {
- int var2 = 0;
- if (this.hasWriteObjectMethod) {
- var2 |= 1;
- }
-
- if (this.serializable) {
- var2 |= 2;
- }
-
- if (this.externalizable) {
- var2 |= 4;
- }
-
- var1.writeByte(var2);
- var1.writeShort(this.fields.length);
-
- for(int var3 = 0; var3 < this.fields.length; ++var3) {
- ObjectStreamField var4 = this.fields[var3];
- var1.writeByte(var4.type);
- var1.writeUTF(var4.name);
- if (!var4.isPrimitive()) {
- var1.writeObject(var4.typeString);
- }
- }
-
- }
-
- void read(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- byte var2 = var1.readByte();
- this.hasWriteObjectMethod = (var2 & 1) != 0;
- this.serializable = (var2 & 2) != 0;
- this.externalizable = (var2 & 4) != 0;
- short var3 = var1.readShort();
- this.fields = new ObjectStreamField[var3];
-
- for(int var4 = 0; var4 < var3; ++var4) {
- char var5 = (char)var1.readByte();
- String var6 = var1.readUTF();
- String var7 = null;
- if (var5 == '[' || var5 == 'L') {
- var7 = (String)var1.readObject();
- }
-
- this.fields[var4] = new ObjectStreamField(var6, var5, -1, var7);
- }
-
- }
-
- private static ObjectStreamClass findDescriptorFor(Class var0) {
- int var1 = var0.hashCode();
-
- ObjectStreamClassEntry var3;
- for(int var2 = (var1 & Integer.MAX_VALUE) % descriptorFor.length; (var3 = descriptorFor[var2]) != null && ((Ref)var3).check() == null; descriptorFor[var2] = var3.next) {
- }
-
- for(ObjectStreamClassEntry var4 = var3; var3 != null; var3 = var3.next) {
- ObjectStreamClass var5 = (ObjectStreamClass)((Ref)var3).check();
- if (var5 == null) {
- var4.next = var3.next;
- } else {
- if (var5.ofClass == var0) {
- return var5;
- }
-
- var4 = var3;
- }
- }
-
- return null;
- }
-
- private static void insertDescriptorFor(ObjectStreamClass var0) {
- if (findDescriptorFor(var0.ofClass) == null) {
- int var1 = var0.ofClass.hashCode();
- int var2 = (var1 & Integer.MAX_VALUE) % descriptorFor.length;
- ObjectStreamClassEntry var3 = new ObjectStreamClassEntry();
- ((Ref)var3).setThing(var0);
- var3.next = descriptorFor[var2];
- descriptorFor[var2] = var3;
- }
- }
-
- private native ObjectStreamField[] getFields0(Class var1);
-
- private static native long getSerialVersionUID(Class var0);
-
- private static native boolean hasWriteObject(Class var0);
-
- private static int doCompare(Object var0, Object var1) {
- String var2;
- String var3;
- if (var0 instanceof String && var1 instanceof String) {
- var2 = (String)var0;
- var3 = (String)var1;
- } else if (var0 instanceof Class && var1 instanceof Class) {
- Class var6 = (Class)var0;
- Class var7 = (Class)var1;
- var2 = var6.getName();
- var3 = var7.getName();
- } else {
- if (!(var0 instanceof ObjectStreamField) || !(var1 instanceof ObjectStreamField)) {
- throw new Error("Unsupported types");
- }
-
- ObjectStreamField var4 = (ObjectStreamField)var0;
- ObjectStreamField var5 = (ObjectStreamField)var1;
- var2 = var4.name;
- var3 = var5.name;
- }
-
- return var2.compareTo(var3);
- }
-
- private static void swap(Object[] var0, int var1, int var2) {
- Object var3 = var0[var1];
- var0[var1] = var0[var2];
- var0[var2] = var3;
- }
-
- private static void quicksort(Object[] var0, int var1, int var2) {
- if (var1 < var2) {
- swap(var0, var1, (var1 + var2) / 2);
- int var4 = var1;
-
- for(int var3 = var1 + 1; var3 <= var2; ++var3) {
- if (doCompare(var0[var3], var0[var1]) < 0) {
- ++var4;
- swap(var0, var4, var3);
- }
- }
-
- swap(var0, var1, var4);
- quicksort(var0, var1, var4 - 1);
- quicksort(var0, var4 + 1, var2);
- }
- }
-
- private static void quicksort(Object[] var0) {
- quicksort(var0, 0, var0.length - 1);
- }
-
- static {
- try {
- classSerializable = Class.forName("java.io.Serializable");
- classExternalizable = Class.forName("java.io.Externalizable");
- } catch (Throwable var0) {
- System.err.println("Could not load java.io.Serializable or java.io.Externalizable.");
- }
- }
- }
-