aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/bcel/util/MethodHTML.java
diff options
context:
space:
mode:
authorBenedikt Ritter <britter@apache.org>2016-06-07 17:13:56 +0000
committerBenedikt Ritter <britter@apache.org>2016-06-07 17:13:56 +0000
commit8ddaf505ae033aae2ed71e900b53159ce640f37c (patch)
treecf5e1aff058d1d150132967d43b9b0306ae509a6 /src/main/java/org/apache/bcel/util/MethodHTML.java
parent72ae6481006681f0ed57f2e5e19eb40f8ba492fb (diff)
downloadapache-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.java159
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&nbsp;flags</TH><TH ALIGN=LEFT>Type</TH>"
+ + "<TH ALIGN=LEFT>Field&nbsp;name</TH></TR>");
+ for (Field field : fields) {
+ writeField(field);
+ }
+ file.println("</TABLE>");
+ file.println("<TABLE BORDER=0><TR><TH ALIGN=LEFT>Access&nbsp;flags</TH>"
+ + "<TH ALIGN=LEFT>Return&nbsp;type</TH><TH ALIGN=LEFT>Method&nbsp;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, " ", "&nbsp;");
+ 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, " ", "&nbsp;");
+ 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);
+ }
+ }
+ }
+ }
+}