KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > logicalcobwebs > 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  * Contact: Eric.Bruneton@rd.francetelecom.com
31  *
32  * Author: Eric Bruneton
33  */

34
35 package org.logicalcobwebs.asm.util;
36
37 import org.logicalcobwebs.asm.ClassVisitor;
38
39 import java.io.PrintWriter JavaDoc;
40 import java.util.ArrayList JavaDoc;
41 import java.util.List JavaDoc;
42
43 /**
44  * An abstract class visitor that prints the classes it visits.
45  */

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

61
62   protected final List JavaDoc text;
63
64   /**
65    * A buffer that can be used to create strings.
66    */

67
68   protected final StringBuffer JavaDoc buf;
69
70   /**
71    * The print writer to be used to print the class.
72    */

73
74   protected final PrintWriter JavaDoc pw;
75
76   /**
77    * Constructs a new {@link PrintClassVisitor PrintClassVisitor} object.
78    *
79    * @param pw the print writer to be used to print the class.
80    */

81
82   public PrintClassVisitor (final PrintWriter JavaDoc pw) {
83     this.text = new ArrayList JavaDoc();
84     this.buf = new StringBuffer JavaDoc();
85     this.pw = pw;
86   }
87
88   public void visitEnd () {
89     printList(text);
90     pw.flush();
91   }
92
93   /**
94    * Prints the given string tree to {@link pw pw}.
95    *
96    * @param l a string tree, i.e., a string list that can contain other string
97    * lists, and so on recursively.
98    */

99
100   private void printList (final List JavaDoc l) {
101     for (int i = 0; i < l.size(); ++i) {
102       Object JavaDoc o = l.get(i);
103       if (o instanceof List JavaDoc) {
104         printList((List JavaDoc)o);
105       } else {
106         pw.print(o.toString());
107       }
108     }
109   }
110 }
111
Popular Tags