home *** CD-ROM | disk | FTP | other *** search
- package com.sfs.hardcore;
-
- import java.io.ByteArrayInputStream;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.PrintStream;
-
- public class ClassFile {
- int magic;
- short majorVersion;
- short minorVersion;
- ConstantPoolInfo[] constantPool;
- short accessFlags;
- ConstantPoolInfo thisClass;
- ConstantPoolInfo superClass;
- ConstantPoolInfo[] interfaces;
- FieldInfo[] fields;
- MethodInfo[] methods;
- AttributeInfo[] attributes;
- boolean isValidClass;
- public static final int ACC_PUBLIC = 1;
- public static final int ACC_PRIVATE = 2;
- public static final int ACC_PROTECTED = 4;
- public static final int ACC_STATIC = 8;
- public static final int ACC_FINAL = 16;
- public static final int ACC_SYNCHRONIZED = 32;
- public static final int ACC_THREADSAFE = 64;
- public static final int ACC_TRANSIENT = 128;
- public static final int ACC_NATIVE = 256;
- public static final int ACC_INTERFACE = 512;
- public static final int ACC_ABSTRACT = 1024;
- public boolean debug;
- public boolean dumpConstants;
-
- public void deleteMethod(String var1, String var2) {
- for(int var3 = 0; var3 < this.constantPool.length; ++var3) {
- if (this.constantPool[var3].type == 7) {
- }
- }
-
- }
-
- public AttributeInfo getAttribute(String var1) {
- if (this.attributes == null) {
- return null;
- } else {
- for(int var2 = 0; var2 < this.attributes.length; ++var2) {
- if (var1.compareTo(this.attributes[var2].name.toString()) == 0) {
- return this.attributes[var2];
- }
- }
-
- return null;
- }
- }
-
- public String toString() {
- return "Class File (Version " + this.majorVersion + "." + this.minorVersion + ") for class " + this.thisClass.arg1;
- }
-
- public boolean read(InputStream var1) throws IOException {
- DataInputStream var2 = new DataInputStream(var1);
- this.magic = var2.readInt();
- if (this.magic != -889275714) {
- return false;
- } else {
- this.majorVersion = var2.readShort();
- this.minorVersion = var2.readShort();
- short var3 = var2.readShort();
- this.constantPool = new ConstantPoolInfo[var3];
- if (this.debug) {
- System.out.println("read(): Read header...");
- }
-
- this.constantPool[0] = new ConstantPoolInfo();
-
- for(int var4 = 1; var4 < this.constantPool.length; ++var4) {
- this.constantPool[var4] = new ConstantPoolInfo();
- if (!this.constantPool[var4].read(var2)) {
- return false;
- }
-
- if (this.constantPool[var4].type == 5 || this.constantPool[var4].type == 6) {
- ++var4;
- }
- }
-
- for(int var10 = 1; var10 < this.constantPool.length; ++var10) {
- if (this.constantPool[var10] != null) {
- if (this.constantPool[var10].index1 > 0) {
- this.constantPool[var10].arg1 = this.constantPool[this.constantPool[var10].index1];
- }
-
- if (this.constantPool[var10].index2 > 0) {
- this.constantPool[var10].arg2 = this.constantPool[this.constantPool[var10].index2];
- }
- }
- }
-
- if (this.dumpConstants) {
- for(int var11 = 1; var11 < this.constantPool.length; ++var11) {
- System.out.println("C" + var11 + " - " + this.constantPool[var11]);
- }
- }
-
- this.accessFlags = var2.readShort();
- this.thisClass = this.constantPool[var2.readShort()];
- this.superClass = this.constantPool[var2.readShort()];
- if (this.debug) {
- System.out.println("read(): Read class info...");
- }
-
- var3 = var2.readShort();
- if (var3 != 0) {
- if (this.debug) {
- System.out.println("Class implements " + var3 + " interfaces.");
- }
-
- this.interfaces = new ConstantPoolInfo[var3];
-
- for(int var12 = 0; var12 < var3; ++var12) {
- short var5 = var2.readShort();
- if (var5 < 1 || var5 > this.constantPool.length - 1) {
- return false;
- }
-
- this.interfaces[var12] = this.constantPool[var5];
- if (this.debug) {
- System.out.println("I" + var12 + ": " + this.interfaces[var12]);
- }
- }
- }
-
- if (this.debug) {
- System.out.println("read(): Read interface info...");
- }
-
- var3 = var2.readShort();
- if (this.debug) {
- System.out.println("This class has " + var3 + " fields.");
- }
-
- if (var3 != 0) {
- this.fields = new FieldInfo[var3];
-
- for(int var13 = 0; var13 < var3; ++var13) {
- this.fields[var13] = new FieldInfo();
- if (!this.fields[var13].read(var2, this.constantPool)) {
- return false;
- }
-
- if (this.debug) {
- System.out.println("F" + var13 + ": " + this.fields[var13].toString(this.constantPool));
- }
- }
- }
-
- if (this.debug) {
- System.out.println("read(): Read field info...");
- }
-
- var3 = var2.readShort();
- if (var3 != 0) {
- this.methods = new MethodInfo[var3];
-
- for(int var14 = 0; var14 < var3; ++var14) {
- this.methods[var14] = new MethodInfo();
- if (!this.methods[var14].read(var2, this.constantPool)) {
- return false;
- }
-
- if (this.debug) {
- System.out.println("M" + var14 + ": " + this.methods[var14].toString());
- }
- }
- }
-
- if (this.debug) {
- System.out.println("read(): Read method info...");
- }
-
- var3 = var2.readShort();
- if (var3 != 0) {
- this.attributes = new AttributeInfo[var3];
-
- for(int var15 = 0; var15 < var3; ++var15) {
- this.attributes[var15] = new AttributeInfo();
- if (!this.attributes[var15].read(var2, this.constantPool)) {
- return false;
- }
- }
- }
-
- if (this.debug) {
- System.out.println("read(): Read attribute info...");
- System.out.println("done.");
- }
-
- this.isValidClass = true;
- return true;
- }
- }
-
- public ConstantPoolInfo getConstantPoolItem(short var1) throws Exception {
- if (var1 > 0 && var1 <= this.constantPool.length - 1) {
- ConstantPoolInfo var2 = this.constantPool[var1];
- if (var2.arg1 != null) {
- var2.index1 = ConstantPoolInfo.indexOf(var2.arg1, this.constantPool);
- }
-
- if (var2.arg2 != null) {
- var2.index2 = ConstantPoolInfo.indexOf(var2.arg2, this.constantPool);
- }
-
- return var2;
- } else {
- return null;
- }
- }
-
- public static String typeString(String var0, String var1) {
- int var2 = 0;
- int var3 = 0;
-
- StringBuffer var4;
- for(var4 = new StringBuffer(); var0.charAt(var3) == '['; ++var3) {
- ++var2;
- }
-
- switch (var0.charAt(var3)) {
- case 'B':
- var4.append("byte ");
- break;
- case 'C':
- var4.append("char ");
- break;
- case 'D':
- var4.append("double ");
- break;
- case 'F':
- var4.append("float ");
- break;
- case 'I':
- var4.append("int ");
- break;
- case 'J':
- var4.append("long ");
- break;
- case 'L':
- for(int var5 = var3 + 1; var5 < var0.indexOf(59); ++var5) {
- if (var0.charAt(var5) != '/') {
- var4.append(var0.charAt(var5));
- } else {
- var4.append('.');
- }
- }
-
- var4.append(" ");
- break;
- case 'S':
- var4.append("short ");
- break;
- case 'V':
- var4.append("void ");
- break;
- case 'Z':
- var4.append("boolean ");
- }
-
- var4.append(var1);
-
- while(var2 > 0) {
- var4.append("[]");
- --var2;
- }
-
- return var4.toString();
- }
-
- public void addConstantPoolItems(ConstantPoolInfo[] var1) {
- boolean[] var4 = new boolean[var1.length];
-
- for(int var5 = 0; var5 < var1.length; ++var5) {
- if (var1[var5].type == 1 || var1[var5].type == 2 || var1[var5].type == 3 || var1[var5].type == 5 || var1[var5].type == 4 || var1[var5].type == 6) {
- var4[var5] = false;
- ConstantPoolInfo var2 = var1[var5].inPool(this.constantPool);
- if (var2 != null) {
- var4[var5] = true;
-
- for(int var6 = 0; var6 < var1.length; ++var6) {
- if (var1[var6].arg1 == var1[var5]) {
- var1[var6].arg1 = var2;
- }
-
- if (var1[var6].arg2 == var1[var5]) {
- var1[var6].arg2 = var2;
- }
- }
- }
- }
- }
-
- for(int var9 = 0; var9 < var1.length; ++var9) {
- if (var1[var9].type == 7 || var1[var9].type == 9 || var1[var9].type == 10 || var1[var9].type == 8 || var1[var9].type == 11 || var1[var9].type == 12) {
- var4[var9] = false;
- ConstantPoolInfo var8 = var1[var9].inPool(this.constantPool);
- if (var8 != null) {
- var4[var9] = true;
-
- for(int var11 = 0; var11 < var1.length; ++var11) {
- if (var1[var11].arg1 == var1[var9]) {
- var1[var11].arg1 = var8;
- }
-
- if (var1[var11].arg2 == var1[var9]) {
- var1[var11].arg2 = var8;
- }
- }
- }
- }
- }
-
- int var10 = 0;
-
- for(int var12 = 0; var12 < var1.length; ++var12) {
- if (!var4[var12]) {
- ++var10;
- }
- }
-
- ConstantPoolInfo[] var3 = new ConstantPoolInfo[this.constantPool.length + var10];
-
- for(int var13 = 1; var13 < this.constantPool.length; ++var13) {
- var3[var13] = this.constantPool[var13];
- }
-
- int var14 = 0;
-
- for(int var7 = this.constantPool.length; var7 < var3.length; ++var7) {
- while(var4[var14]) {
- ++var14;
- }
-
- var3[var7] = var1[var14];
- ++var14;
- }
-
- this.constantPool = var3;
- }
-
- public void mapPackage(String var1, String var2) {
- for(int var3 = 0; var3 < this.constantPool.length; ++var3) {
- if (this.constantPool[var3].type == 7) {
- String var4 = this.constantPool[var3].arg1.strValue;
- if (var4.startsWith(var1)) {
- this.constantPool[var3].arg1.strValue = var2 + var4.substring(var4.lastIndexOf(47));
- }
- }
- }
-
- }
-
- public void write(OutputStream var1) throws IOException, Exception {
- DataOutputStream var2 = new DataOutputStream(var1);
- if (!this.isValidClass) {
- throw new Exception("ClassFile::write() - Invalid Class");
- } else {
- var2.writeInt(this.magic);
- var2.writeShort(this.majorVersion);
- var2.writeShort(this.minorVersion);
- var2.writeShort(this.constantPool.length);
-
- for(int var3 = 1; var3 < this.constantPool.length; ++var3) {
- if (this.constantPool[var3] != null) {
- this.constantPool[var3].write(var2, this.constantPool);
- }
- }
-
- var2.writeShort(this.accessFlags);
- var2.writeShort(ConstantPoolInfo.indexOf(this.thisClass, this.constantPool));
- var2.writeShort(ConstantPoolInfo.indexOf(this.superClass, this.constantPool));
- if (this.interfaces == null) {
- var2.writeShort(0);
- } else {
- var2.writeShort(this.interfaces.length);
-
- for(int var4 = 0; var4 < this.interfaces.length; ++var4) {
- var2.writeShort(ConstantPoolInfo.indexOf(this.interfaces[var4], this.constantPool));
- }
- }
-
- if (this.fields == null) {
- var2.writeShort(0);
- } else {
- var2.writeShort(this.fields.length);
-
- for(int var5 = 0; var5 < this.fields.length; ++var5) {
- this.fields[var5].write(var2, this.constantPool);
- }
- }
-
- if (this.methods == null) {
- var2.writeShort(0);
- } else {
- var2.writeShort(this.methods.length);
-
- for(int var6 = 0; var6 < this.methods.length; ++var6) {
- this.methods[var6].write(var2, this.constantPool);
- }
- }
-
- if (this.attributes == null) {
- var2.writeShort(0);
- } else {
- var2.writeShort(this.attributes.length);
-
- for(int var7 = 0; var7 < this.attributes.length; ++var7) {
- this.attributes[var7].write(var2, this.constantPool);
- }
-
- }
- }
- }
-
- public void addAttribute(AttributeInfo var1) {
- if (this.attributes == null) {
- this.attributes = new AttributeInfo[1];
- this.attributes[0] = var1;
- } else {
- AttributeInfo[] var2 = new AttributeInfo[1 + this.attributes.length];
-
- for(int var3 = 0; var3 < this.attributes.length; ++var3) {
- var2[var3] = this.attributes[var3];
- }
-
- var2[this.attributes.length] = var1;
- this.attributes = var2;
- }
- }
-
- public ConstantPoolInfo getConstantRef(short var1) {
- return this.constantPool[var1];
- }
-
- public static String accessString(short var0) {
- StringBuffer var1 = new StringBuffer();
- if ((var0 & 1) != 0) {
- var1.append("public ");
- }
-
- if ((var0 & 2) != 0) {
- var1.append("private ");
- }
-
- if ((var0 & 4) != 0) {
- var1.append("protected ");
- }
-
- if ((var0 & 8) != 0) {
- var1.append("static ");
- }
-
- if ((var0 & 16) != 0) {
- var1.append("final ");
- }
-
- if ((var0 & 32) != 0) {
- var1.append("synchronized ");
- }
-
- if ((var0 & 64) != 0) {
- var1.append("threadsafe ");
- }
-
- if ((var0 & 128) != 0) {
- var1.append("transient ");
- }
-
- if ((var0 & 256) != 0) {
- var1.append("native ");
- }
-
- if ((var0 & 512) != 0) {
- var1.append("interface ");
- }
-
- if ((var0 & 1024) != 0) {
- var1.append("abstract ");
- }
-
- return var1.toString();
- }
-
- public static String nextSig(String var0) {
- int var1;
- for(var1 = 0; var0.charAt(var1) == '['; ++var1) {
- }
-
- if (var0.charAt(var1) == 'L') {
- while(var0.charAt(var1) != ';') {
- ++var1;
- }
- }
-
- ++var1;
- String var2 = var0.substring(var1);
- return var2;
- }
-
- public void mapClass(String var1, String var2) {
- if (this.debug) {
- System.out.println("Mapping class name " + var1 + " ==> " + var2 + " for class " + this.thisClass.arg1);
- }
-
- for(int var3 = 0; var3 < this.constantPool.length; ++var3) {
- if (this.constantPool[var3].type == 7) {
- String var4 = this.constantPool[var3].arg1.strValue;
- if (var4.compareTo(var1) == 0) {
- if (this.debug) {
- System.out.println("REPLACING " + var4 + " with " + var2);
- }
-
- this.constantPool[var3].arg1.strValue = var2;
- }
- }
- }
-
- }
-
- String printClassName(String var1) {
- if (var1.charAt(0) == '[') {
- return typeString(var1, "");
- } else {
- StringBuffer var2 = new StringBuffer();
-
- for(int var3 = 0; var3 < var1.length(); ++var3) {
- if (var1.charAt(var3) == '/') {
- var2.append('.');
- } else {
- var2.append(var1.charAt(var3));
- }
- }
-
- return var2.toString();
- }
- }
-
- public void display(PrintStream var1) throws Exception {
- String var5 = null;
- if (!this.isValidClass) {
- var1.println("Not a valid class");
- }
-
- String var3 = this.printClassName(this.thisClass.arg1.strValue);
- String var4 = this.printClassName(this.superClass.arg1.strValue);
- if (var3.indexOf(46) > 0) {
- var5 = var3.substring(0, var3.lastIndexOf(46));
- var3 = var3.substring(var3.lastIndexOf(46) + 1);
- var1.println("package " + var5 + "\n");
- }
-
- for(int var2 = 1; var2 < this.constantPool.length; ++var2) {
- if (this.constantPool[var2] != null && this.constantPool[var2] != this.thisClass && this.constantPool[var2] != this.superClass && this.constantPool[var2].type == 7) {
- String var6 = this.constantPool[var2].arg1.strValue;
- if (var6.charAt(0) != '[') {
- var6 = this.printClassName(this.constantPool[var2].arg1.strValue);
- if (var5 == null || !var6.startsWith(var5)) {
- var1.println("import " + this.printClassName(var6) + ";");
- }
- }
- }
- }
-
- var1.println();
- var1.println("/*");
- if (this.attributes != null) {
- var1.println(" * This class has " + this.attributes.length + " optional class attributes.");
- var1.println(" * These attributes are: ");
-
- for(int var10 = 0; var10 < this.attributes.length; ++var10) {
- String var8 = this.attributes[var10].name.strValue;
- DataInputStream var15 = new DataInputStream(new ByteArrayInputStream(this.attributes[var10].data));
- var1.println(" * Attribute " + (var10 + 1) + " is of type " + this.attributes[var10].name);
- if (var8.compareTo("SourceFile") == 0) {
- ConstantPoolInfo var7 = null;
-
- try {
- var7 = this.constantPool[var15.readShort()];
- } catch (IOException var9) {
- }
-
- var1.println(" *\tSourceFile : " + var7);
- } else {
- var1.println(" *\tTYPE (" + var8 + ")");
- }
- }
- } else {
- var1.println(" * This class has NO optional class attributes.");
- }
-
- var1.println(" */\n");
- var1.print(accessString(this.accessFlags) + "class " + var3 + " extends " + var4);
- if (this.interfaces != null) {
- var1.print(" implements ");
-
- for(int var11 = 0; var11 < this.interfaces.length - 1; ++var11) {
- var1.print(this.interfaces[var11].arg1.strValue + ", ");
- }
-
- var1.print(this.interfaces[this.interfaces.length - 1].arg1.strValue);
- }
-
- var1.println(" {\n");
- if (this.fields != null) {
- var1.println("/* Instance Variables */");
-
- for(int var12 = 0; var12 < this.fields.length; ++var12) {
- var1.println(" " + this.fields[var12].toString(this.constantPool) + ";");
- }
- }
-
- if (this.methods != null) {
- var1.println("\n/* Methods */");
-
- for(int var13 = 0; var13 < this.methods.length; ++var13) {
- var1.println(" " + this.methods[var13].toString(var3));
- }
- }
-
- var1.println("\n}");
- }
-
- public short addConstantPoolItem(ConstantPoolInfo var1) throws Exception {
- ConstantPoolInfo var3 = var1.inPool(this.constantPool);
- if (var3 != null) {
- return ConstantPoolInfo.indexOf(var3, this.constantPool);
- } else {
- ConstantPoolInfo[] var2 = new ConstantPoolInfo[this.constantPool.length + 1];
-
- for(int var4 = 1; var4 < this.constantPool.length; ++var4) {
- var2[var4] = this.constantPool[var4];
- }
-
- var2[this.constantPool.length] = var1;
- this.constantPool = var2;
- return ConstantPoolInfo.indexOf(var1, this.constantPool);
- }
- }
-
- public String getClassName() {
- return this.printClassName(this.thisClass.arg1.strValue);
- }
- }
-