KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > bcel > util > MethodHTML


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 JavaDoc;
20 import java.io.IOException JavaDoc;
21 import java.io.PrintWriter JavaDoc;
22 import org.apache.bcel.classfile.Attribute;
23 import org.apache.bcel.classfile.Code;
24 import org.apache.bcel.classfile.ConstantValue;
25 import org.apache.bcel.classfile.ExceptionTable;
26 import org.apache.bcel.classfile.Field;
27 import org.apache.bcel.classfile.Method;
28 import org.apache.bcel.classfile.Utility;
29
30 /**
31  * Convert methods and fields into HTML file.
32  *
33  * @version $Id: MethodHTML.java 386056 2006-03-15 11:31:56Z tcurdt $
34  * @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
35  *
36  */

37 final class MethodHTML implements org.apache.bcel.Constants {
38
39     private String JavaDoc class_name; // name of current class
40
private PrintWriter JavaDoc file; // file to write to
41
private ConstantHTML constant_html;
42     private AttributeHTML attribute_html;
43
44
45     MethodHTML(String JavaDoc dir, String JavaDoc class_name, Method[] methods, Field[] fields,
46             ConstantHTML constant_html, AttributeHTML attribute_html) throws IOException JavaDoc {
47         this.class_name = class_name;
48         this.attribute_html = attribute_html;
49         this.constant_html = constant_html;
50         file = new PrintWriter JavaDoc(new FileOutputStream JavaDoc(dir + class_name + "_methods.html"));
51         file.println("<HTML><BODY BGCOLOR=\"#C0C0C0\"><TABLE BORDER=0>");
52         file.println("<TR><TH ALIGN=LEFT>Access&nbsp;flags</TH><TH ALIGN=LEFT>Type</TH>"
53                 + "<TH ALIGN=LEFT>Field&nbsp;name</TH></TR>");
54         for (int i = 0; i < fields.length; i++) {
55             writeField(fields[i]);
56         }
57         file.println("</TABLE>");
58         file.println("<TABLE BORDER=0><TR><TH ALIGN=LEFT>Access&nbsp;flags</TH>"
59                 + "<TH ALIGN=LEFT>Return&nbsp;type</TH><TH ALIGN=LEFT>Method&nbsp;name</TH>"
60                 + "<TH ALIGN=LEFT>Arguments</TH></TR>");
61         for (int i = 0; i < methods.length; i++) {
62             writeMethod(methods[i], i);
63         }
64         file.println("</TABLE></BODY></HTML>");
65         file.close();
66     }
67
68
69     /**
70      * Print field of class.
71      *
72      * @param field field to print
73      * @exception java.io.IOException
74      */

75     private void writeField( Field field ) throws IOException JavaDoc {
76         String JavaDoc type = Utility.signatureToString(field.getSignature());
77         String JavaDoc name = field.getName();
78         String JavaDoc access = Utility.accessToString(field.getAccessFlags());
79         Attribute[] attributes;
80         access = Utility.replace(access, " ", "&nbsp;");
81         file.print("<TR><TD><FONT COLOR=\"#FF0000\">" + access + "</FONT></TD>\n<TD>"
82                 + Class2HTML.referenceType(type) + "</TD><TD><A NAME=\"field" + name + "\">" + name
83                 + "</A></TD>");
84         attributes = field.getAttributes();
85         // Write them to the Attributes.html file with anchor "<name>[<i>]"
86
for (int i = 0; i < attributes.length; i++) {
87             attribute_html.writeAttribute(attributes[i], name + "@" + i);
88         }
89         for (int i = 0; i < attributes.length; i++) {
90             if (attributes[i].getTag() == ATTR_CONSTANT_VALUE) { // Default value
91
String JavaDoc str = ((ConstantValue) attributes[i]).toString();
92                 // Reference attribute in _attributes.html
93
file.print("<TD>= <A HREF=\"" + class_name + "_attributes.html#" + name + "@" + i
94                         + "\" TARGET=\"Attributes\">" + str + "</TD>\n");
95                 break;
96             }
97         }
98         file.println("</TR>");
99     }
100
101
102     private final void writeMethod( Method method, int method_number ) throws IOException JavaDoc {
103         // Get raw signature
104
String JavaDoc signature = method.getSignature();
105         // Get array of strings containing the argument types
106
String JavaDoc[] args = Utility.methodSignatureArgumentTypes(signature, false);
107         // Get return type string
108
String JavaDoc type = Utility.methodSignatureReturnType(signature, false);
109         // Get method name
110
String JavaDoc name = method.getName(), html_name;
111         // Get method's access flags
112
String JavaDoc access = Utility.accessToString(method.getAccessFlags());
113         // Get the method's attributes, the Code Attribute in particular
114
Attribute[] attributes = method.getAttributes();
115         /* HTML doesn't like names like <clinit> and spaces are places to break
116          * lines. Both we don't want...
117          */

118         access = Utility.replace(access, " ", "&nbsp;");
119         html_name = Class2HTML.toHTML(name);
120         file.print("<TR VALIGN=TOP><TD><FONT COLOR=\"#FF0000\"><A NAME=method" + method_number
121                 + ">" + access + "</A></FONT></TD>");
122         file.print("<TD>" + Class2HTML.referenceType(type) + "</TD><TD>" + "<A HREF=" + class_name
123                 + "_code.html#method" + method_number + " TARGET=Code>" + html_name
124                 + "</A></TD>\n<TD>(");
125         for (int i = 0; i < args.length; i++) {
126             file.print(Class2HTML.referenceType(args[i]));
127             if (i < args.length - 1) {
128                 file.print(", ");
129             }
130         }
131         file.print(")</TD></TR>");
132         // Check for thrown exceptions
133
for (int i = 0; i < attributes.length; i++) {
134             attribute_html.writeAttribute(attributes[i], "method" + method_number + "@" + i,
135                     method_number);
136             byte tag = attributes[i].getTag();
137             if (tag == ATTR_EXCEPTIONS) {
138                 file.print("<TR VALIGN=TOP><TD COLSPAN=2></TD><TH ALIGN=LEFT>throws</TH><TD>");
139                 int[] exceptions = ((ExceptionTable) attributes[i]).getExceptionIndexTable();
140                 for (int j = 0; j < exceptions.length; j++) {
141                     file.print(constant_html.referenceConstant(exceptions[j]));
142                     if (j < exceptions.length - 1) {
143                         file.print(", ");
144                     }
145                 }
146                 file.println("</TD></TR>");
147             } else if (tag == ATTR_CODE) {
148                 Attribute[] c_a = ((Code) attributes[i]).getAttributes();
149                 for (int j = 0; j < c_a.length; j++) {
150                     attribute_html.writeAttribute(c_a[j], "method" + method_number + "@" + i + "@"
151                             + j, method_number);
152                 }
153             }
154         }
155     }
156 }
157
Popular Tags