1 /*** 2 * ASM: a very small and fast Java bytecode manipulation framework 3 * Copyright (c) 2000,2002,2003 INRIA, France Telecom 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. Neither the name of the copyright holders nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 28 * THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 package oracle.toplink.libraries.asm.util; 32 33 import oracle.toplink.libraries.asm.Attribute; 34 import oracle.toplink.libraries.asm.ClassVisitor; 35 import oracle.toplink.libraries.asm.util.attrs.ASMLocalVariableTypeTableAttribute; 36 import oracle.toplink.libraries.asm.util.attrs.ASMAnnotationDefaultAttribute; 37 import oracle.toplink.libraries.asm.util.attrs.ASMEnclosingMethodAttribute; 38 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeInvisibleAnnotations; 39 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeInvisibleParameterAnnotations; 40 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeVisibleAnnotations; 41 import oracle.toplink.libraries.asm.util.attrs.ASMRuntimeVisibleParameterAnnotations; 42 import oracle.toplink.libraries.asm.util.attrs.ASMSignatureAttribute; 43 import oracle.toplink.libraries.asm.util.attrs.ASMSourceDebugExtensionAttribute; 44 import oracle.toplink.libraries.asm.util.attrs.ASMStackMapAttribute; 45 46 import java.io.PrintWriter; 47 import java.util.ArrayList; 48 import java.util.List; 49 50 /** 51 * An abstract class visitor that prints the classes it visits. 52 * 53 * @author Eric Bruneton, Eugene Kuleshov 54 */ 55 56 public abstract class PrintClassVisitor implements ClassVisitor { 57 58 /** 59 * The text to be printed. Since the code of methods is not necessarily 60 * visited in sequential order, one method after the other, but can be 61 * interlaced (some instructions from method one, then some instructions from 62 * method two, then some instructions from method one again...), it is not 63 * possible to print the visited instructions directly to a sequential 64 * stream. A class is therefore printed in a two steps process: a string tree 65 * is constructed during the visit, and printed to a sequential stream at the 66 * end of the visit. This string tree is stored in this field, as a string 67 * list that can contain other string lists, which can themselves contain 68 * other string lists, and so on. 69 */ 70 71 protected final List text; 72 73 /** 74 * A buffer that can be used to create strings. 75 */ 76 77 protected final StringBuffer buf; 78 79 /** 80 * The print writer to be used to print the class. 81 */ 82 83 protected final PrintWriter pw; 84 85 /** 86 * Constructs a new {@link PrintClassVisitor PrintClassVisitor} object. 87 * 88 * @param pw the print writer to be used to print the class. 89 */ 90 91 protected PrintClassVisitor (final PrintWriter pw) { 92 this.text = new ArrayList(); 93 this.buf = new StringBuffer(); 94 this.pw = pw; 95 } 96 97 public void visitEnd () { 98 printList(text); 99 pw.flush(); 100 } 101 102 /** 103 * Prints the given string tree to {@link #pw pw}. 104 * 105 * @param l a string tree, i.e., a string list that can contain other string 106 * lists, and so on recursively. 107 */ 108 109 private void printList (final List l) { 110 for (int i = 0; i < l.size(); ++i) { 111 Object o = l.get(i); 112 if (o instanceof List) { 113 printList((List)o); 114 } else { 115 pw.print(o.toString()); 116 } 117 } 118 } 119 120 public static Attribute[] getDefaultAttributes () { 121 try { 122 return new Attribute[] { 123 new ASMAnnotationDefaultAttribute(), 124 new ASMRuntimeInvisibleAnnotations(), 125 new ASMRuntimeInvisibleParameterAnnotations(), 126 new ASMRuntimeVisibleAnnotations(), 127 new ASMRuntimeVisibleParameterAnnotations(), 128 new ASMStackMapAttribute(), 129 new ASMSourceDebugExtensionAttribute(), 130 new ASMSignatureAttribute(), 131 new ASMEnclosingMethodAttribute(), 132 new ASMLocalVariableTypeTableAttribute() 133 }; 134 } catch (Exception e) { 135 return new Attribute[0]; 136 } 137 } 138 } 139