1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.bcel.verifier.statics;
18
19
20 import org.apache.bcel.classfile.Code;
21 import org.apache.bcel.classfile.CodeException;
22 import org.apache.bcel.classfile.ConstantClass;
23 import org.apache.bcel.classfile.ConstantDouble;
24 import org.apache.bcel.classfile.ConstantFieldref;
25 import org.apache.bcel.classfile.ConstantFloat;
26 import org.apache.bcel.classfile.ConstantInteger;
27 import org.apache.bcel.classfile.ConstantInterfaceMethodref;
28 import org.apache.bcel.classfile.ConstantLong;
29 import org.apache.bcel.classfile.ConstantMethodref;
30 import org.apache.bcel.classfile.ConstantNameAndType;
31 import org.apache.bcel.classfile.ConstantPool;
32 import org.apache.bcel.classfile.ConstantString;
33 import org.apache.bcel.classfile.ConstantUtf8;
34 import org.apache.bcel.classfile.ConstantValue;
35 import org.apache.bcel.classfile.Deprecated;
36 import org.apache.bcel.classfile.ExceptionTable;
37 import org.apache.bcel.classfile.Field;
38 import org.apache.bcel.classfile.InnerClass;
39 import org.apache.bcel.classfile.InnerClasses;
40 import org.apache.bcel.classfile.JavaClass;
41 import org.apache.bcel.classfile.LineNumber;
42 import org.apache.bcel.classfile.LineNumberTable;
43 import org.apache.bcel.classfile.LocalVariable;
44 import org.apache.bcel.classfile.LocalVariableTable;
45 import org.apache.bcel.classfile.Method;
46 import org.apache.bcel.classfile.Node;
47 import org.apache.bcel.classfile.Signature;
48 import org.apache.bcel.classfile.SourceFile;
49 import org.apache.bcel.classfile.StackMap;
50 import org.apache.bcel.classfile.Synthetic;
51 import org.apache.bcel.classfile.Unknown;
52 import org.apache.bcel.classfile.Visitor;
53 import org.apache.bcel.verifier.exc.AssertionViolatedException;
54
55 /***
56 * BCEL's Node classes (those from the classfile API that <B>accept()</B> Visitor
57 * instances) have <B>toString()</B> methods that were not designed to be robust,
58 * this gap is closed by this class.
59 * When performing class file verification, it may be useful to output which
60 * entity (e.g. a <B>Code</B> instance) is not satisfying the verifier's
61 * constraints, but in this case it could be possible for the <B>toString()</B>
62 * method to throw a RuntimeException.
63 * A (new StringRepresentation(Node n)).toString() never throws any exception.
64 * Note that this class also serves as a placeholder for more sophisticated message
65 * handling in future versions of JustIce.
66 *
67 * @version $Id: StringRepresentation.java 386056 2006-03-15 11:31:56Z tcurdt $
68 * @author Enver Haase
69 */
70 public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor implements Visitor {
71 /*** The string representation, created by a visitXXX() method, output by toString(). */
72 private String tostring;
73 /*** The node we ask for its string representation. Not really needed; only for debug output. */
74 private Node n;
75
76 /***
77 * Creates a new StringRepresentation object which is the representation of n.
78 *
79 * @see #toString()
80 */
81 public StringRepresentation(Node n) {
82 this.n = n;
83 n.accept(this);
84 }
85
86 /***
87 * Returns the String representation.
88 */
89 public String toString() {
90
91
92
93
94
95 if (tostring == null) {
96 throw new AssertionViolatedException("Please adapt '" + getClass() + "' to deal with objects of class '" + n.getClass() + "'.");
97 }
98 return tostring;
99 }
100
101 /***
102 * Returns the String representation of the Node object obj;
103 * this is obj.toString() if it does not throw any RuntimeException,
104 * or else it is a string derived only from obj's class name.
105 */
106 private String toString(Node obj) {
107 String ret;
108 try {
109 ret = obj.toString();
110 }
111 catch (RuntimeException e) {
112 String s = obj.getClass().getName();
113 s = s.substring(s.lastIndexOf(".") + 1);
114 ret = "<<" + s + ">>";
115 }
116 return ret;
117 }
118
119
120
121
122
123
124
125 public void visitCode(Code obj) {
126
127 tostring = "<CODE>";
128 }
129
130 public void visitCodeException(CodeException obj) {
131 tostring = toString(obj);
132 }
133
134 public void visitConstantClass(ConstantClass obj) {
135 tostring = toString(obj);
136 }
137
138 public void visitConstantDouble(ConstantDouble obj) {
139 tostring = toString(obj);
140 }
141
142 public void visitConstantFieldref(ConstantFieldref obj) {
143 tostring = toString(obj);
144 }
145
146 public void visitConstantFloat(ConstantFloat obj) {
147 tostring = toString(obj);
148 }
149
150 public void visitConstantInteger(ConstantInteger obj) {
151 tostring = toString(obj);
152 }
153
154 public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {
155 tostring = toString(obj);
156 }
157
158 public void visitConstantLong(ConstantLong obj) {
159 tostring = toString(obj);
160 }
161
162 public void visitConstantMethodref(ConstantMethodref obj) {
163 tostring = toString(obj);
164 }
165
166 public void visitConstantNameAndType(ConstantNameAndType obj) {
167 tostring = toString(obj);
168 }
169
170 public void visitConstantPool(ConstantPool obj) {
171 tostring = toString(obj);
172 }
173
174 public void visitConstantString(ConstantString obj) {
175 tostring = toString(obj);
176 }
177
178 public void visitConstantUtf8(ConstantUtf8 obj) {
179 tostring = toString(obj);
180 }
181
182 public void visitConstantValue(ConstantValue obj) {
183 tostring = toString(obj);
184 }
185
186 public void visitDeprecated(Deprecated obj) {
187 tostring = toString(obj);
188 }
189
190 public void visitExceptionTable(ExceptionTable obj) {
191 tostring = toString(obj);
192 }
193
194 public void visitField(Field obj) {
195 tostring = toString(obj);
196 }
197
198 public void visitInnerClass(InnerClass obj) {
199 tostring = toString(obj);
200 }
201
202 public void visitInnerClasses(InnerClasses obj) {
203 tostring = toString(obj);
204 }
205
206 public void visitJavaClass(JavaClass obj) {
207 tostring = toString(obj);
208 }
209
210 public void visitLineNumber(LineNumber obj) {
211 tostring = toString(obj);
212 }
213
214 public void visitLineNumberTable(LineNumberTable obj) {
215 tostring = "<LineNumberTable: " + toString(obj) + ">";
216 }
217
218 public void visitLocalVariable(LocalVariable obj) {
219 tostring = toString(obj);
220 }
221
222 public void visitLocalVariableTable(LocalVariableTable obj) {
223 tostring = "<LocalVariableTable: " + toString(obj) + ">";
224 }
225
226 public void visitMethod(Method obj) {
227 tostring = toString(obj);
228 }
229
230 public void visitSignature(Signature obj) {
231 tostring = toString(obj);
232 }
233
234 public void visitSourceFile(SourceFile obj) {
235 tostring = toString(obj);
236 }
237
238 public void visitStackMap(StackMap obj) {
239 tostring = toString(obj);
240 }
241
242 public void visitSynthetic(Synthetic obj) {
243 tostring = toString(obj);
244 }
245
246 public void visitUnknown(Unknown obj) {
247 tostring = toString(obj);
248 }
249 }