package javassist;

import java.util.Enumeration;
import java.util.zip.*;

public class ClassPoolBench {
    static ClassPool cp;
    static boolean mod = false, detach = false, readonly = false;

    public static void accessClass(String name) throws Exception {
        CtClass cc = cp.get(name);
        System.out.println(cc.getName());
        cc.getSuperclass();
        if (mod)
            cc.getClassFile();

        if (detach)
            cc.stopPruning(true);

        if (!readonly)
            cc.toBytecode();

        if (detach)
           cc.detach();
    }

    @SuppressWarnings("rawtypes")
    public static void accessAll(String filename) throws Exception {
        ZipFile zip = new ZipFile(filename);
        Enumeration files = zip.entries();
        while (files.hasMoreElements()) {
            ZipEntry z = (ZipEntry)files.nextElement();
            String name = z.getName();
            if (name.endsWith(".class")) {
                name = name.substring(0, name.length() - 6)
                           .replace('/', '.');
                accessClass(name);
            }
        }

        zip.close();
    }

    public static void main(String[] args) throws Exception {
        cp = ClassPool.getDefault();
        cp.appendClassPath(args[0]);
        if (args[1].equals("true"))
            mod = true;
        else if (args[1].equals("detach"))
            mod = detach = true;
        else if (args[1].equals("read"))
            readonly = true;

        System.err.println("mod: " + mod + " detach: " + detach
                           + " readonly: " + readonly);
        accessAll(args[0]);
    }
}
