KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > logicalcobwebs > cglib > core > DebuggingClassWriter


1 /*
2  * The Apache Software License, Version 1.1
3  *
4  * Copyright (c) 2002 The Apache Software Foundation. All rights
5  * reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in
16  * the documentation and/or other materials provided with the
17  * distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  * if any, must include the following acknowledgment:
21  * "This product includes software developed by the
22  * Apache Software Foundation (http://www.apache.org/)."
23  * Alternately, this acknowledgment may appear in the software itself,
24  * if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Apache" and "Apache Software Foundation" must
27  * not be used to endorse or promote products derived from this
28  * software without prior written permission. For written
29  * permission, please contact apache@apache.org.
30  *
31  * 5. Products derived from this software may not be called "Apache",
32  * nor may "Apache" appear in their name, without prior written
33  * permission of the Apache Software Foundation.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of the Apache Software Foundation. For more
51  * information on the Apache Software Foundation, please see
52  * <http://www.apache.org/>.
53  */

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 JavaDoc DEBUG_LOCATION_PROPERTY = "cglib.debugLocation";
65     
66     private static String JavaDoc debugLocation;
67     private static boolean traceEnabled;
68
69     private String JavaDoc className;
70     private String JavaDoc 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 JavaDoc ignore) {
80             }
81         }
82     }
83
84     public DebuggingClassWriter(boolean computeMaxs) {
85         super(computeMaxs);
86     }
87
88     public void visit(int access, String JavaDoc name, String JavaDoc superName, String JavaDoc[] interfaces, String JavaDoc sourceFile) {
89         className = name.replace('/', '.');
90         this.superName = superName.replace('/', '.');
91         super.visit(access, name, superName, interfaces, sourceFile);
92     }
93
94     public String JavaDoc getClassName() {
95         return className;
96     }
97
98     public String JavaDoc getSuperName() {
99         return superName;
100     }
101
102     public byte[] toByteArray() {
103         byte[] b = super.toByteArray();
104         if (debugLocation != null) {
105             String JavaDoc 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