/* This file is part of the db4o object database http://www.db4o.com
Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com
db4o is free software; you can redistribute it and/or modify it under
the terms of version 3 of the GNU General Public License as published
by the Free Software Foundation.
db4o is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/. */
package EDU.purdue.cs.bloat.dump;
import java.util.*;
import EDU.purdue.cs.bloat.context.*;
import EDU.purdue.cs.bloat.editor.*;
import EDU.purdue.cs.bloat.file.*;
import EDU.purdue.cs.bloat.reflect.*;
/**
* Prints the contents of a Java classfile to the console.
*/
public class Main implements Opcode {
public static void main(final String[] args) {
final ClassFileLoader loader = new ClassFileLoader();
String className = null;
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-help")) {
Main.usage();
} else if (args[i].equals("-classpath")) {
if (++i >= args.length) {
Main.usage();
}
final String classpath = args[i];
loader.setClassPath(classpath);
} else if (args[i].startsWith("-")) {
Main.usage();
} else {
if (className != null) {
Main.usage();
}
className = args[i];
}
}
if (className == null) {
Main.usage();
}
ClassInfo info = null;
try {
info = loader.loadClass(className);
} catch (final ClassNotFoundException ex) {
System.err.println("Couldn't find class: " + ex.getMessage());
System.exit(1);
}
final Collection classes = new ArrayList(1);
classes.add(className);
final BloatContext context = new CachingBloatContext(loader, classes,
true);
if (info != null) {
Main.printClass(context, info);
}
}
private static void usage() {
System.err
.println("Usage: java EDU.purdue.cs.bloat.dump.Main "
+ "\n [-options] class"
+ "\n"
+ "\nwhere options include:"
+ "\n -help print out this message"
+ "\n -classpath <directories separated by colons>"
+ "\n list directories in which to look for classes");
System.exit(0);
}
private static void printClass(final EditorContext context,
final ClassInfo info) {
final ClassEditor c = context.editClass(info);
if (c.isPublic()) {
System.out.print("public ");
} else if (c.isPrivate()) {
System.out.print("private ");
} else if (c.isProtected()) {
System.out.print("protected ");
}
if (c.isStatic()) {
System.out.print("static ");
}
if (c.isFinal()) {
System.out.print("final ");
}
if (c.isInterface()) {
System.out.print("interface ");
} else if (c.isAbstract()) {
System.out.print("abstract class ");
} else {
System.out.print("class ");
}
System.out.print(c.type().className());
if (c.superclass() != null) {
System.out.print(" extends " + c.superclass().className());
}
final Type[] interfaces = c.interfaces();
for (int i = 0; i < interfaces.length; i++) {
if (i == 0) {
System.out.print(" implements");
} else {
System.out.print(",");
}
System.out.print(" " + interfaces[i].className());
}
System.out.println();
System.out.println("{");
final FieldInfo[] fields = c.fields();
for (int i = 0; i < fields.length; i++) {
FieldEditor f = null;
try {
f = context.editField(fields[i]);
} catch (final ClassFormatException ex) {
System.err.println(ex.getMessage());
System.exit(1);
}
System.out.print(" ");
if (f.isPublic()) {
System.out.print("public ");
} else if (f.isPrivate()) {
System.out.print("private ");
} else if (f.isProtected()) {
System.out.print("protected ");
}
if (f.isTransient()) {
System.out.print("transient ");
}
if (f.isVolatile()) {
System.out.print("volatile ");
}
if (f.isStatic()) {
System.out.print("static ");
}
if (f.isFinal()) {
System.out.print("final ");
}
System.out.println(f.type() + " " + f.name());
context.release(fields[i]);
}
if (fields.length != 0) {
System.out.println();
}
final MethodInfo[] methods = c.methods();
for (int i = 0; i < methods.length; i++) {
MethodEditor m = null;
try {
m = context.editMethod(methods[i]);
} catch (final ClassFormatException ex) {
System.err.println(ex.getMessage());
System.exit(1);
}
if (i != 0) {
System.out.println();
}
System.out.print(" ");
if (m.isPublic()) {
System.out.print("public ");
} else if (m.isPrivate()) {
System.out.print("private ");
} else if (m.isProtected()) {
System.out.print("protected ");
}
if (m.isNative()) {
System.out.print("native ");
}
if (m.isSynchronized()) {
System.out.print("synchronized ");
}
if (m.isAbstract()) {
System.out.print("abstract ");
}
if (m.isStatic()) {
System.out.print("static ");
}
if (m.isFinal()) {
System.out.print("final ");
}
System.out.println(m.type() + " " + m.name());
final Iterator iter = m.code().iterator();
while (iter.hasNext()) {
final Object obj = iter.next();
System.out.println(" " + obj);
}
context.release(methods[i]);
}
System.out.println("}");
context.release(info);
}
}