1 54 package org.logicalcobwebs.cglib.core; 55 56 import org.logicalcobwebs.asm.ClassWriter; 57 import org.logicalcobwebs.asm.ClassReader; 58 import org.logicalcobwebs.asm.util.TraceClassVisitor; 59 60 import java.io.*; 61 62 public class DebuggingClassWriter extends ClassWriter { 63 64 public static final String DEBUG_LOCATION_PROPERTY = "cglib.debugLocation"; 65 66 private static String debugLocation; 67 private static boolean traceEnabled; 68 69 private String className; 70 private String superName; 71 72 static { 73 debugLocation = System.getProperty(DEBUG_LOCATION_PROPERTY); 74 if (debugLocation != null) { 75 System.err.println("CGLIB debugging enabled, writing to '" + debugLocation + "'"); 76 try { 77 Class.forName("org.logicalcobwebs.asm.util.TraceClassVisitor"); 78 traceEnabled = true; 79 } catch (Throwable ignore) { 80 } 81 } 82 } 83 84 public DebuggingClassWriter(boolean computeMaxs) { 85 super(computeMaxs); 86 } 87 88 public void visit(int access, String name, String superName, String [] interfaces, String sourceFile) { 89 className = name.replace('/', '.'); 90 this.superName = superName.replace('/', '.'); 91 super.visit(access, name, superName, interfaces, sourceFile); 92 } 93 94 public String getClassName() { 95 return className; 96 } 97 98 public String getSuperName() { 99 return superName; 100 } 101 102 public byte[] toByteArray() { 103 byte[] b = super.toByteArray(); 104 if (debugLocation != null) { 105 String dirs = className.replace('.', File.separatorChar); 106 try { 107 new File(debugLocation + File.separatorChar + dirs).getParentFile().mkdirs(); 108 109 File file = new File(new File(debugLocation), dirs + ".class"); 110 OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 111 try { 112 out.write(b); 113 } finally { 114 out.close(); 115 } 116 117 if (traceEnabled) { 118 file = new File(new File(debugLocation), dirs + ".asm"); 119 out = new BufferedOutputStream(new FileOutputStream(file)); 120 try { 121 ClassReader cr = new ClassReader(b); 122 PrintWriter pw = new PrintWriter(new OutputStreamWriter(out)); 123 TraceClassVisitor tcv = new TraceClassVisitor(null, pw); 124 cr.accept(tcv, false); 125 pw.flush(); 126 } finally { 127 out.close(); 128 } 129 } 130 } catch (IOException e) { 131 throw new CodeGenerationException(e); 132 } 133 } 134 return b; 135 } 136 } 137 | Popular Tags |