View Javadoc

1   /*
2    * Copyright  2000-2004 The Apache Software Foundation
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License"); 
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License. 
15   *
16   */
17  package org.apache.bcel.util;
18  
19  import java.io.FileOutputStream;
20  import java.io.IOException;
21  import java.io.PrintWriter;
22  import org.apache.bcel.classfile.Constant;
23  import org.apache.bcel.classfile.ConstantClass;
24  import org.apache.bcel.classfile.ConstantFieldref;
25  import org.apache.bcel.classfile.ConstantInterfaceMethodref;
26  import org.apache.bcel.classfile.ConstantMethodref;
27  import org.apache.bcel.classfile.ConstantNameAndType;
28  import org.apache.bcel.classfile.ConstantPool;
29  import org.apache.bcel.classfile.ConstantString;
30  import org.apache.bcel.classfile.Method;
31  import org.apache.bcel.classfile.Utility;
32  
33  /***
34   * Convert constant pool into HTML file.
35   *
36   * @version $Id: ConstantHTML.java 386056 2006-03-15 11:31:56Z tcurdt $
37   * @author  <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
38   * 
39   */
40  final class ConstantHTML implements org.apache.bcel.Constants {
41  
42      private String class_name; // name of current class
43      privateong> String class_package; // name of package
44      private ConstantPool constant_pool; // reference to constant pool
45      private PrintWriter file; // file to write to
46      private String[] constant_ref; // String to return for cp[i]
47      private Constant[] constants; // The constants in the cp
48      private Method[] methods;
49  
50  
51      ConstantHTML(String dir, String class_name, String class_package, Method[] methods,/package-summary.html">ConstantHTML(String dir, String class_name, String class_package, Method[] methods,
52              ConstantPool constant_pool) throws IOException {
53          this.class_name = class_name;
54          this.class_package</strong> = class_package;
55          this.constant_pool = constant_pool;
56          this.methods = methods;
57          constants = constant_pool.getConstantPool();
58          file = new PrintWriter(new FileOutputStream(dir + class_name + "_cp.html"));
59          constant_ref = new String[constants.length];
60          constant_ref[0] = "&lt;unknown&gt;";
61          file.println("<HTML><BODY BGCOLOR=\"#C0C0C0\"><TABLE BORDER=0>");
62          // Loop through constants, constants[0] is reserved
63          for (int i = 1; i < constants.length; i++) {
64              if (i % 2 == 0) {
65                  file.print("<TR BGCOLOR=\"#C0C0C0\"><TD>");
66              } else {
67                  file.print("<TR BGCOLOR=\"#A0A0A0\"><TD>");
68              }
69              if (constants[i] != null) {
70                  writeConstant(i);
71              }
72              file.print("</TD></TR>\n");
73          }
74          file.println("</TABLE></BODY></HTML>");
75          file.close();
76      }
77  
78  
79      String referenceConstant( int index ) {
80          return constant_ref[index];
81      }
82  
83  
84      private void writeConstant( int index ) {
85          byte tag = constants[index].getTag();
86          int class_index, name_index;
87          String ref;
88          // The header is always the same
89          file.println("<H4> <A NAME=cp" + index + ">" + index + "</A> " + CONSTANT_NAMES[tag]
90                  + "</H4>");
91          /* For every constant type get the needed parameters and print them appropiately 
92           */
93          switch (tag) {
94              case CONSTANT_InterfaceMethodref:
95              case CONSTANT_Methodref:
96                  // Get class_index and name_and_type_index, depending on type
97                  if (tag == CONSTANT_Methodref) {
98                      ConstantMethodref c = (ConstantMethodref) constant_pool.getConstant(index,
99                              CONSTANT_Methodref);
100                     class_index = c.getClassIndex();
101                     name_index = c.getNameAndTypeIndex();
102                 } else {
103                     ConstantInterfaceMethodref c1 = (ConstantInterfaceMethodref) constant_pool
104                             .getConstant(index, CONSTANT_InterfaceMethodref);
105                     class_index = c1.getClassIndex();
106                     name_index = c1.getNameAndTypeIndex();
107                 }
108                 // Get method name and its class
109                 String method_name = constant_pool.constantToString(name_index,
110                         CONSTANT_NameAndType);
111                 String html_method_name = Class2HTML.toHTML(method_name);
112                 // Partially compacted class name, i.e., / -> .
113                 String method_class = constant_pool.constantToString(class_index, CONSTANT_Class);
114                 String short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang.
115                 short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang.
116                 short_method_g>class = Utility.compactClassName(short_method_class, class_package
117                         + ".", true); // Remove class package prefix
118                 // Get method signature
119                 ConstantNameAndType c2 = (ConstantNameAndType) constant_pool.getConstant(
120                         name_index, CONSTANT_NameAndType);
121                 String signature = constant_pool.constantToString(c2.getSignatureIndex(),
122                         CONSTANT_Utf8);
123                 // Get array of strings containing the argument types
124                 String[] args = Utility.methodSignatureArgumentTypes(signature, false);
125                 // Get return type string
126                 String type = Utility.methodSignatureReturnType(signature, false);
127                 String ret_type = Class2HTML.referenceType(type);
128                 StringBuffer buf = new StringBuffer("(");
129                 for (int i = 0; i < args.length; i++) {
130                     buf.append(Class2HTML.referenceType(args[i]));
131                     if (i < args.length - 1) {
132                         buf.append(",&nbsp;");
133                     }
134                 }
135                 buf.append(")");
136                 String arg_types = buf.toString();
137                 if (method_class.equals(class_name)) {
138                     ref = "<A HREF=\"" + class_name + "_code.html#method"
139                             + getMethodNumber(method_name + signature) + "\" TARGET=Code>"
140                             + html_method_name + "</A>";
141                 } else {
142                     ref = "<A HREF=\"" + method_class + ".html" + "\" TARGET=_top>"
143                             + short_method_class + "</A>." + html_method_name;
144                 }
145                 constant_ref[index] = ret_type + "&nbsp;<A HREF=\"" + class_name + "_cp.html#cp"
146                         + class_index + "\" TARGET=Constants>" + short_method_class
147                         + "</A>.<A HREF=\"" + class_name + "_cp.html#cp" + index
148                         + "\" TARGET=ConstantPool>" + html_method_name + "</A>&nbsp;" + arg_types;
149                 file.println("<P><TT>" + ret_type + "&nbsp;" + ref + arg_types
150                         + "&nbsp;</TT>\n<UL>" + "<LI><A HREF=\"#cp" + class_index
151                         + "\">Class index(" + class_index + ")</A>\n" + "<LI><A HREF=\"#cp"
152                         + name_index + "\">NameAndType index(" + name_index + ")</A></UL>");
153                 break;
154             case CONSTANT_Fieldref:
155                 // Get class_index and name_and_type_index
156                 ConstantFieldref c3 = (ConstantFieldref) constant_pool.getConstant(index,
157                         CONSTANT_Fieldref);
158                 class_index = c3.getClassIndex();
159                 name_index = c3.getNameAndTypeIndex();
160                 // Get method name and its class (compacted)
161                 String field_class = constant_pool.constantToString(class_index, CONSTANT_Class);
162                 String short_field_class = Utility.compactClassName(field_class); // I.e., remove java.lang.
163                 short_field_class = Utility.compactClassName(short_field_class,
164                         class_package + ".", true); // Remove class package prefix
165                 String field_name = constant_pool
166                         .constantToString(name_index, CONSTANT_NameAndType);
167                 if (field_class.equals(class_name)) {
168                     ref = "<A HREF=\"" + field_class + "_methods.html#field" + field_name
169                             + "\" TARGET=Methods>" + field_name + "</A>";
170                 } else {
171                     ref = "<A HREF=\"" + field_class + ".html\" TARGET=_top>" + short_field_class
172                             + "</A>." + field_name + "\n";
173                 }
174                 constant_ref[index] = "<A HREF=\"" + class_name + "_cp.html#cp" + class_index
175                         + "\" TARGET=Constants>" + short_field_class + "</A>.<A HREF=\""
176                         + class_name + "_cp.html#cp" + index + "\" TARGET=ConstantPool>"
177                         + field_name + "</A>";
178                 file.println("<P><TT>" + ref + "</TT><BR>\n" + "<UL>" + "<LI><A HREF=\"#cp"
179                         + class_index + "\">Class(" + class_index + ")</A><BR>\n"
180                         + "<LI><A HREF=\"#cp" + name_index + "\">NameAndType(" + name_index
181                         + ")</A></UL>");
182                 break;
183             case CONSTANT_Class:
184                 ConstantClass c4 = (ConstantClass) constant_pool.getConstant(index, CONSTANT_Class);
185                 name_index = c4.getNameIndex();
186                 String class_name2 = constant_pool.constantToString(index, tag); // / -> .
187                 String short_class_name = Utility.compactClassName(class_name2); // I.e., remove java.lang.
188                 short_class_name = Utility.compactClassName(short_class_name, class_package + ".",
189                         true); // Remove class package prefix
190                 ref = "<A HREF=\"" + class_name2 + ".html\" TARGET=_top>" + short_class_name
191                         + "</A>";
192                 constant_ref[index] = "<A HREF=\"" + class_name + "_cp.html#cp" + index
193                         + "\" TARGET=ConstantPool>" + short_class_name + "</A>";
194                 file.println("<P><TT>" + ref + "</TT><UL>" + "<LI><A HREF=\"#cp" + name_index
195                         + "\">Name index(" + name_index + ")</A></UL>\n");
196                 break;
197             case CONSTANT_String:
198                 ConstantString c5 = (ConstantString) constant_pool.getConstant(index,
199                         CONSTANT_String);
200                 name_index = c5.getStringIndex();
201                 String str = Class2HTML.toHTML(constant_pool.constantToString(index, tag));
202                 file.println("<P><TT>" + str + "</TT><UL>" + "<LI><A HREF=\"#cp" + name_index
203                         + "\">Name index(" + name_index + ")</A></UL>\n");
204                 break;
205             case CONSTANT_NameAndType:
206                 ConstantNameAndType c6 = (ConstantNameAndType) constant_pool.getConstant(index,
207                         CONSTANT_NameAndType);
208                 name_index = c6.getNameIndex();
209                 int signature_index = c6.getSignatureIndex();
210                 file.println("<P><TT>"
211                         + Class2HTML.toHTML(constant_pool.constantToString(index, tag))
212                         + "</TT><UL>" + "<LI><A HREF=\"#cp" + name_index + "\">Name index("
213                         + name_index + ")</A>\n" + "<LI><A HREF=\"#cp" + signature_index
214                         + "\">Signature index(" + signature_index + ")</A></UL>\n");
215                 break;
216             default:
217                 file
218                         .println("<P><TT>"
219                                 + Class2HTML.toHTML(constant_pool.constantToString(index, tag))
220                                 + "</TT>\n");
221         } // switch
222     }
223 
224 
225     private final int getMethodNumber( String str ) {
226         for (int i = 0; i < methods.length; i++) {
227             String cmp = methods[i].getName() + methods[i].getSignature();
228             if (cmp.equals(str)) {
229                 return i;
230             }
231         }
232         return -1;
233     }
234 }