package org.apache.bcel.util; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache BCEL" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * "Apache BCEL", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ import org.apache.bcel.classfile.*; import java.io.*; /** * Convert constant pool into HTML file. * * @version $Id: ConstantHTML.java,v 1.1.1.1 2001/10/29 20:00:30 jvanzyl Exp $ * @author M. Dahm * */ final class ConstantHTML implements org.apache.bcel.Constants { private String class_name; // name of current class private String class_package; // name of package private ConstantPool constant_pool; // reference to constant pool private PrintWriter file; // file to write to private String[] constant_ref; // String to return for cp[i] private Constant[] constants; // The constants in the cp private Method[] methods; ConstantHTML(String dir, String class_name, String class_package, Method[] methods, ConstantPool constant_pool) throws IOException { this.class_name = class_name; this.class_package = class_package; this.constant_pool = constant_pool; this.methods = methods; constants = constant_pool.getConstantPool(); file = new PrintWriter(new FileOutputStream(dir + class_name + "_cp.html")); constant_ref = new String[constants.length]; constant_ref[0] = "<unknown>"; file.println(""); // Loop through constants, constants[0] is reserved for(int i=1; i < constants.length; i++) { if(i % 2 == 0) file.print("\n"); } file.println("
"); else file.print("
"); if(constants[i] != null) writeConstant(i); file.print("
"); file.close(); } String referenceConstant(int index) { return constant_ref[index]; } private void writeConstant(int index) { byte tag = constants[index].getTag(); int class_index, name_index; String ref; // The header is always the same file.println("

" + index + " " + CONSTANT_NAMES[tag] + "

"); /* For every constant type get the needed parameters and print them appropiately */ switch(tag) { case CONSTANT_InterfaceMethodref: case CONSTANT_Methodref: // Get class_index and name_and_type_index, depending on type if(tag == CONSTANT_Methodref) { ConstantMethodref c = (ConstantMethodref)constant_pool.getConstant(index, CONSTANT_Methodref); class_index = c.getClassIndex(); name_index = c.getNameAndTypeIndex(); } else { ConstantInterfaceMethodref c1 = (ConstantInterfaceMethodref)constant_pool.getConstant(index, CONSTANT_InterfaceMethodref); class_index = c1.getClassIndex(); name_index = c1.getNameAndTypeIndex(); } // Get method name and its class String method_name = constant_pool.constantToString(name_index, CONSTANT_NameAndType); String html_method_name = Class2HTML.toHTML(method_name); // Partially compacted class name, i.e., / -> . String method_class = constant_pool.constantToString(class_index, CONSTANT_Class); String short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. short_method_class = Utility.compactClassName(short_method_class, class_package + ".", true); // Remove class package prefix // Get method signature ConstantNameAndType c2 = (ConstantNameAndType)constant_pool.getConstant(name_index, CONSTANT_NameAndType); String signature = constant_pool.constantToString(c2.getSignatureIndex(), CONSTANT_Utf8); // Get array of strings containing the argument types String[] args = Utility.methodSignatureArgumentTypes(signature, false); // Get return type string String type = Utility.methodSignatureReturnType(signature, false); String ret_type = Class2HTML.referenceType(type); StringBuffer buf = new StringBuffer("("); for(int i=0; i < args.length; i++) { buf.append(Class2HTML.referenceType(args[i])); if(i < args.length - 1) buf.append(", "); } buf.append(")"); String arg_types = buf.toString(); if(method_class.equals(class_name)) // Method is local to class ref = "" + html_method_name + ""; else ref = "" + short_method_class + "." + html_method_name; constant_ref[index] = ret_type + " " + short_method_class + "." + html_method_name + " " + arg_types; file.println("

" + ret_type + " " + ref + arg_types + " \n

"); break; case CONSTANT_Fieldref: // Get class_index and name_and_type_index ConstantFieldref c3 = (ConstantFieldref)constant_pool.getConstant(index, CONSTANT_Fieldref); class_index = c3.getClassIndex(); name_index = c3.getNameAndTypeIndex(); // Get method name and its class (compacted) String field_class = constant_pool.constantToString(class_index, CONSTANT_Class); String short_field_class = Utility.compactClassName(field_class); // I.e., remove java.lang. short_field_class = Utility.compactClassName(short_field_class, class_package + ".", true); // Remove class package prefix String field_name = constant_pool.constantToString(name_index, CONSTANT_NameAndType); if(field_class.equals(class_name)) // Field is local to class ref = "" + field_name + ""; else ref = "" + short_field_class + "." + field_name + "\n"; constant_ref[index] = "" + short_field_class + "." + field_name + ""; file.println("

" + ref + "
\n" + "

"); break; case CONSTANT_Class: ConstantClass c4 = (ConstantClass)constant_pool.getConstant(index, CONSTANT_Class); name_index = c4.getNameIndex(); String class_name2 = constant_pool.constantToString(index, tag); // / -> . String short_class_name = Utility.compactClassName(class_name2); // I.e., remove java.lang. short_class_name = Utility.compactClassName(short_class_name, class_package + ".", true); // Remove class package prefix ref = "" + short_class_name + ""; constant_ref[index] = "" + short_class_name + ""; file.println("

" + ref + "

\n"); break; case CONSTANT_String: ConstantString c5 = (ConstantString)constant_pool.getConstant(index, CONSTANT_String); name_index = c5.getStringIndex(); String str = Class2HTML.toHTML(constant_pool.constantToString(index, tag)); file.println("

" + str + "

\n"); break; case CONSTANT_NameAndType: ConstantNameAndType c6 = (ConstantNameAndType)constant_pool.getConstant(index, CONSTANT_NameAndType); name_index = c6.getNameIndex(); int signature_index = c6.getSignatureIndex(); file.println("

" + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + "

\n"); break; default: file.println("

" + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + "\n"); } // switch } private final int getMethodNumber(String str) { for(int i=0; i < methods.length; i++) { String cmp = methods[i].getName() + methods[i].getSignature(); if(cmp.equals(str)) return i; } return -1; } }