KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > oracle > toplink > libraries > asm > util > PrintClassVisitor


1 /***
2  * ASM: a very small and fast Java bytecode manipulation framework
3  * Copyright (c) 2000,2002,2003 INRIA, France Telecom
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  * 3. Neither the name of the copyright holders nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28  * THE POSSIBILITY OF SUCH DAMAGE.
29  */

30
31 package oracle.toplink.libraries.asm.util;
32
33 import oracle.toplink.libraries.asm.Attribute;
34 import oracle.toplink.libraries.asm.ClassVisitor;
35 import oracle.toplink.libraries.asm.util.attrs.ASMLocalVariableTypeTableAttribute;
36 import oracle.toplink.libraries.asm.util.attrs.ASMAnnotationDefaultAttribute;
37 import oracle.toplink.libraries.asm.util.attrs.ASMEnclosingMethodAttribute;
38 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeInvisibleAnnotations;
39 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeInvisibleParameterAnnotations;
40 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeVisibleAnnotations;
41 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeVisibleParameterAnnotations;
42 import oracle.toplink.libraries.asm.util.attrs.ASMSignatureAttribute;
43 import oracle.toplink.libraries.asm.util.attrs.ASMSourceDebugExtensionAttribute;
44 import oracle.toplink.libraries.asm.util.attrs.ASMStackMapAttribute;
45
46 import java.io.PrintWriter JavaDoc;
47 import java.util.ArrayList JavaDoc;
48 import java.util.List JavaDoc;
49
50 /**
51  * An abstract class visitor that prints the classes it visits.
52  *
53  * @author Eric Bruneton, Eugene Kuleshov
54  */

55
56 public abstract class PrintClassVisitor implements ClassVisitor {
57
58   /**
59    * The text to be printed. Since the code of methods is not necessarily
60    * visited in sequential order, one method after the other, but can be
61    * interlaced (some instructions from method one, then some instructions from
62    * method two, then some instructions from method one again...), it is not
63    * possible to print the visited instructions directly to a sequential
64    * stream. A class is therefore printed in a two steps process: a string tree
65    * is constructed during the visit, and printed to a sequential stream at the
66    * end of the visit. This string tree is stored in this field, as a string
67    * list that can contain other string lists, which can themselves contain
68    * other string lists, and so on.
69    */

70
71   protected final List JavaDoc text;
72
73   /**
74    * A buffer that can be used to create strings.
75    */

76
77   protected final StringBuffer JavaDoc buf;
78
79   /**
80    * The print writer to be used to print the class.
81    */

82
83   protected final PrintWriter JavaDoc pw;
84
85   /**
86    * Constructs a new {@link PrintClassVisitor PrintClassVisitor} object.
87    *
88    * @param pw the print writer to be used to print the class.
89    */

90
91   protected PrintClassVisitor (final PrintWriter JavaDoc pw) {
92     this.text = new ArrayList JavaDoc();
93     this.buf = new StringBuffer JavaDoc();
94     this.pw = pw;
95   }
96
97   public void visitEnd () {
98     printList(text);
99     pw.flush();
100   }
101
102   /**
103    * Prints the given string tree to {@link #pw pw}.
104    *
105    * @param l a string tree, i.e., a string list that can contain other string
106    * lists, and so on recursively.
107    */

108
109   private void printList (final List JavaDoc l) {
110     for (int i = 0; i < l.size(); ++i) {
111       Object JavaDoc o = l.get(i);
112       if (o instanceof List JavaDoc) {
113         printList((List JavaDoc)o);
114       } else {
115         pw.print(o.toString());
116       }
117     }
118   }
119
120   public static Attribute[] getDefaultAttributes () {
121     try {
122       return new Attribute[] {
123         new ASMAnnotationDefaultAttribute(),
124         new ASMRuntimeInvisibleAnnotations(),
125         new ASMRuntimeInvisibleParameterAnnotations(),
126         new ASMRuntimeVisibleAnnotations(),
127         new ASMRuntimeVisibleParameterAnnotations(),
128         new ASMStackMapAttribute(),
129         new ASMSourceDebugExtensionAttribute(),
130         new ASMSignatureAttribute(),
131         new ASMEnclosingMethodAttribute(),
132         new ASMLocalVariableTypeTableAttribute()
133       };
134     } catch (Exception JavaDoc e) {
135       return new Attribute[0];
136     }
137   }
138 }
139
Popular Tags