diff options
author | Benedikt Ritter <britter@apache.org> | 2016-06-07 17:13:56 +0000 |
---|---|---|
committer | Benedikt Ritter <britter@apache.org> | 2016-06-07 17:13:56 +0000 |
commit | 8ddaf505ae033aae2ed71e900b53159ce640f37c (patch) | |
tree | cf5e1aff058d1d150132967d43b9b0306ae509a6 /src/main/java/org/apache/bcel/util/MethodHTML.java | |
parent | 72ae6481006681f0ed57f2e5e19eb40f8ba492fb (diff) | |
download | apache-commons-bcel-8ddaf505ae033aae2ed71e900b53159ce640f37c.tar.gz |
Revert changes introduced in BCEL-222 (rev 1694911).
In particular this means that the package coordinates have been changed
back from
org.apache.commons.bcel6
to
org.apache.bcel
Furthermore the maven coordinates have been changes back from
org.apache.commons:commons-bcel6:6.0-SNAPSHOT
to
org.apache.bcel:bcel:6.0-SNAPSHOT
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747273 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/main/java/org/apache/bcel/util/MethodHTML.java')
-rw-r--r-- | src/main/java/org/apache/bcel/util/MethodHTML.java | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java new file mode 100644 index 00000000..56f5793b --- /dev/null +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -0,0 +1,159 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.commons.bcel6.util; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; + +import org.apache.commons.bcel6.Const; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Utility; + +/** + * Convert methods and fields into HTML file. + * + * @version $Id$ + * + */ +final class MethodHTML { + + private final String class_name; // name of current class + private final PrintWriter file; // file to write to + private final ConstantHTML constant_html; + private final AttributeHTML attribute_html; + + + MethodHTML(final String dir, final String class_name, final Method[] methods, final Field[] fields, + final ConstantHTML constant_html, final AttributeHTML attribute_html) throws IOException { + this.class_name = class_name; + this.attribute_html = attribute_html; + this.constant_html = constant_html; + file = new PrintWriter(new FileOutputStream(dir + class_name + "_methods.html")); + file.println("<HTML><BODY BGCOLOR=\"#C0C0C0\"><TABLE BORDER=0>"); + file.println("<TR><TH ALIGN=LEFT>Access flags</TH><TH ALIGN=LEFT>Type</TH>" + + "<TH ALIGN=LEFT>Field name</TH></TR>"); + for (Field field : fields) { + writeField(field); + } + file.println("</TABLE>"); + file.println("<TABLE BORDER=0><TR><TH ALIGN=LEFT>Access flags</TH>" + + "<TH ALIGN=LEFT>Return type</TH><TH ALIGN=LEFT>Method name</TH>" + + "<TH ALIGN=LEFT>Arguments</TH></TR>"); + for (int i = 0; i < methods.length; i++) { + writeMethod(methods[i], i); + } + file.println("</TABLE></BODY></HTML>"); + file.close(); + } + + + /** + * Print field of class. + * + * @param field field to print + * @throws java.io.IOException + */ + private void writeField( final Field field ) throws IOException { + String type = Utility.signatureToString(field.getSignature()); + String name = field.getName(); + String access = Utility.accessToString(field.getAccessFlags()); + Attribute[] attributes; + access = Utility.replace(access, " ", " "); + file.print("<TR><TD><FONT COLOR=\"#FF0000\">" + access + "</FONT></TD>\n<TD>" + + Class2HTML.referenceType(type) + "</TD><TD><A NAME=\"field" + name + "\">" + name + + "</A></TD>"); + attributes = field.getAttributes(); + // Write them to the Attributes.html file with anchor "<name>[<i>]" + for (int i = 0; i < attributes.length; i++) { + attribute_html.writeAttribute(attributes[i], name + "@" + i); + } + for (int i = 0; i < attributes.length; i++) { + if (attributes[i].getTag() == Const.ATTR_CONSTANT_VALUE) { // Default value + String str = ((ConstantValue) attributes[i]).toString(); + // Reference attribute in _attributes.html + file.print("<TD>= <A HREF=\"" + class_name + "_attributes.html#" + name + "@" + i + + "\" TARGET=\"Attributes\">" + str + "</TD>\n"); + break; + } + } + file.println("</TR>"); + } + + + private void writeMethod( final Method method, final int method_number ) { + // Get raw signature + String signature = method.getSignature(); + // Get array of strings containing the argument types + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + // Get return type string + String type = Utility.methodSignatureReturnType(signature, false); + // Get method name + String name = method.getName(); + String html_name; + // Get method's access flags + String access = Utility.accessToString(method.getAccessFlags()); + // Get the method's attributes, the Code Attribute in particular + Attribute[] attributes = method.getAttributes(); + /* HTML doesn't like names like <clinit> and spaces are places to break + * lines. Both we don't want... + */ + access = Utility.replace(access, " ", " "); + html_name = Class2HTML.toHTML(name); + file.print("<TR VALIGN=TOP><TD><FONT COLOR=\"#FF0000\"><A NAME=method" + method_number + + ">" + access + "</A></FONT></TD>"); + file.print("<TD>" + Class2HTML.referenceType(type) + "</TD><TD>" + "<A HREF=" + class_name + + "_code.html#method" + method_number + " TARGET=Code>" + html_name + + "</A></TD>\n<TD>("); + for (int i = 0; i < args.length; i++) { + file.print(Class2HTML.referenceType(args[i])); + if (i < args.length - 1) { + file.print(", "); + } + } + file.print(")</TD></TR>"); + // Check for thrown exceptions + for (int i = 0; i < attributes.length; i++) { + attribute_html.writeAttribute(attributes[i], "method" + method_number + "@" + i, + method_number); + byte tag = attributes[i].getTag(); + if (tag == Const.ATTR_EXCEPTIONS) { + file.print("<TR VALIGN=TOP><TD COLSPAN=2></TD><TH ALIGN=LEFT>throws</TH><TD>"); + int[] exceptions = ((ExceptionTable) attributes[i]).getExceptionIndexTable(); + for (int j = 0; j < exceptions.length; j++) { + file.print(constant_html.referenceConstant(exceptions[j])); + if (j < exceptions.length - 1) { + file.print(", "); + } + } + file.println("</TD></TR>"); + } else if (tag == Const.ATTR_CODE) { + Attribute[] c_a = ((Code) attributes[i]).getAttributes(); + for (int j = 0; j < c_a.length; j++) { + attribute_html.writeAttribute(c_a[j], "method" + method_number + "@" + i + "@" + + j, method_number); + } + } + } + } +} |