Attribute.java revision 3294:9adfb22ff08f
1210284Sjmallett/*
2215990Sjmallett * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
3215990Sjmallett * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4210284Sjmallett *
5210284Sjmallett * This code is free software; you can redistribute it and/or modify it
6215990Sjmallett * under the terms of the GNU General Public License version 2 only, as
7215990Sjmallett * published by the Free Software Foundation.  Oracle designates this
8215990Sjmallett * particular file as subject to the "Classpath" exception as provided
9210284Sjmallett * by Oracle in the LICENSE file that accompanied this code.
10215990Sjmallett *
11215990Sjmallett * This code is distributed in the hope that it will be useful, but WITHOUT
12210284Sjmallett * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13215990Sjmallett * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14215990Sjmallett * version 2 for more details (a copy is included in the LICENSE file that
15215990Sjmallett * accompanied this code).
16215990Sjmallett *
17215990Sjmallett * You should have received a copy of the GNU General Public License version
18215990Sjmallett * 2 along with this work; if not, write to the Free Software Foundation,
19215990Sjmallett * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20215990Sjmallett *
21215990Sjmallett * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22215990Sjmallett * or visit www.oracle.com if you need additional information or have any
23215990Sjmallett * questions.
24215990Sjmallett */
25215990Sjmallett
26215990Sjmallettpackage com.sun.tools.classfile;
27215990Sjmallett
28215990Sjmallettimport java.io.IOException;
29215990Sjmallettimport java.lang.reflect.Constructor;
30215990Sjmallettimport java.util.HashMap;
31215990Sjmallettimport java.util.Map;
32215990Sjmallett
33215990Sjmallett/**
34215990Sjmallett *  <p><b>This is NOT part of any supported API.
35215990Sjmallett *  If you write code that depends on this, you do so at your own risk.
36215990Sjmallett *  This code and its internal interfaces are subject to change or
37215990Sjmallett *  deletion without notice.</b>
38210284Sjmallett */
39210284Sjmallett
40215990Sjmallettpublic abstract class Attribute {
41210284Sjmallett    public static final String AnnotationDefault        = "AnnotationDefault";
42210284Sjmallett    public static final String BootstrapMethods         = "BootstrapMethods";
43210284Sjmallett    public static final String CharacterRangeTable      = "CharacterRangeTable";
44210284Sjmallett    public static final String Code                     = "Code";
45210284Sjmallett    public static final String ConcealedPackages        = "ConcealedPackages";
46210284Sjmallett    public static final String ConstantValue            = "ConstantValue";
47210284Sjmallett    public static final String CompilationID            = "CompilationID";
48210284Sjmallett    public static final String Deprecated               = "Deprecated";
49210284Sjmallett    public static final String EnclosingMethod          = "EnclosingMethod";
50215990Sjmallett    public static final String Exceptions               = "Exceptions";
51215990Sjmallett    public static final String Hashes                   = "Hashes";
52215990Sjmallett    public static final String InnerClasses             = "InnerClasses";
53215990Sjmallett    public static final String LineNumberTable          = "LineNumberTable";
54210284Sjmallett    public static final String LocalVariableTable       = "LocalVariableTable";
55210284Sjmallett    public static final String LocalVariableTypeTable   = "LocalVariableTypeTable";
56210284Sjmallett    public static final String MainClass                = "MainClass";
57210284Sjmallett    public static final String MethodParameters         = "MethodParameters";
58210284Sjmallett    public static final String Module                   = "Module";
59210284Sjmallett    public static final String RuntimeVisibleAnnotations = "RuntimeVisibleAnnotations";
60210284Sjmallett    public static final String RuntimeInvisibleAnnotations = "RuntimeInvisibleAnnotations";
61210284Sjmallett    public static final String RuntimeVisibleParameterAnnotations = "RuntimeVisibleParameterAnnotations";
62210284Sjmallett    public static final String RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations";
63210284Sjmallett    public static final String RuntimeVisibleTypeAnnotations = "RuntimeVisibleTypeAnnotations";
64210284Sjmallett    public static final String RuntimeInvisibleTypeAnnotations = "RuntimeInvisibleTypeAnnotations";
65210284Sjmallett    public static final String Signature                = "Signature";
66210284Sjmallett    public static final String SourceDebugExtension     = "SourceDebugExtension";
67210284Sjmallett    public static final String SourceFile               = "SourceFile";
68210284Sjmallett    public static final String SourceID                 = "SourceID";
69210284Sjmallett    public static final String StackMap                 = "StackMap";
70210284Sjmallett    public static final String StackMapTable            = "StackMapTable";
71210284Sjmallett    public static final String Synthetic                = "Synthetic";
72210284Sjmallett    public static final String TargetPlatform           = "TargetPlatform";
73210284Sjmallett    public static final String Version                  = "Version";
74210284Sjmallett
75210284Sjmallett    public static class Factory {
76210284Sjmallett        public Factory() {
77210284Sjmallett            // defer init of standardAttributeClasses until after options set up
78215990Sjmallett        }
79210284Sjmallett
80210284Sjmallett        public Attribute createAttribute(ClassReader cr, int name_index, byte[] data)
81215990Sjmallett                throws IOException {
82210284Sjmallett            if (standardAttributes == null) {
83210284Sjmallett                init();
84215990Sjmallett            }
85215990Sjmallett
86215990Sjmallett            ConstantPool cp = cr.getConstantPool();
87215990Sjmallett            String reasonForDefaultAttr;
88215990Sjmallett            try {
89210284Sjmallett                String name = cp.getUTF8Value(name_index);
90210284Sjmallett                Class<? extends Attribute> attrClass = standardAttributes.get(name);
91210284Sjmallett                if (attrClass != null) {
92210284Sjmallett                    try {
93210284Sjmallett                        Class<?>[] constrArgTypes = {ClassReader.class, int.class, int.class};
94210284Sjmallett                        Constructor<? extends Attribute> constr = attrClass.getDeclaredConstructor(constrArgTypes);
95210284Sjmallett                        return constr.newInstance(cr, name_index, data.length);
96215990Sjmallett                    } catch (Throwable t) {
97210284Sjmallett                        reasonForDefaultAttr = t.toString();
98210284Sjmallett                        // fall through and use DefaultAttribute
99210284Sjmallett                        // t.printStackTrace();
100210284Sjmallett                    }
101210284Sjmallett                } else {
102210284Sjmallett                    reasonForDefaultAttr = "unknown attribute";
103210284Sjmallett                }
104210284Sjmallett            } catch (ConstantPoolException e) {
105210284Sjmallett                reasonForDefaultAttr = e.toString();
106210284Sjmallett                // fall through and use DefaultAttribute
107210284Sjmallett            }
108210284Sjmallett            return new DefaultAttribute(cr, name_index, data, reasonForDefaultAttr);
109210284Sjmallett        }
110210284Sjmallett
111210284Sjmallett        protected void init() {
112210284Sjmallett            standardAttributes = new HashMap<>();
113210284Sjmallett            standardAttributes.put(AnnotationDefault, AnnotationDefault_attribute.class);
114210284Sjmallett            standardAttributes.put(BootstrapMethods,  BootstrapMethods_attribute.class);
115215990Sjmallett            standardAttributes.put(CharacterRangeTable, CharacterRangeTable_attribute.class);
116215990Sjmallett            standardAttributes.put(Code,              Code_attribute.class);
117210284Sjmallett            standardAttributes.put(CompilationID,     CompilationID_attribute.class);
118210284Sjmallett            standardAttributes.put(ConcealedPackages, ConcealedPackages_attribute.class);
119210284Sjmallett            standardAttributes.put(ConstantValue,     ConstantValue_attribute.class);
120210284Sjmallett            standardAttributes.put(Deprecated,        Deprecated_attribute.class);
121210284Sjmallett            standardAttributes.put(EnclosingMethod,   EnclosingMethod_attribute.class);
122210284Sjmallett            standardAttributes.put(Exceptions,        Exceptions_attribute.class);
123210284Sjmallett            standardAttributes.put(Hashes,            Hashes_attribute.class);
124215990Sjmallett            standardAttributes.put(InnerClasses,      InnerClasses_attribute.class);
125210284Sjmallett            standardAttributes.put(LineNumberTable,   LineNumberTable_attribute.class);
126210284Sjmallett            standardAttributes.put(LocalVariableTable, LocalVariableTable_attribute.class);
127210284Sjmallett            standardAttributes.put(LocalVariableTypeTable, LocalVariableTypeTable_attribute.class);
128210284Sjmallett            standardAttributes.put(MainClass,         MainClass_attribute.class);
129210284Sjmallett            standardAttributes.put(MethodParameters,  MethodParameters_attribute.class);
130210284Sjmallett            standardAttributes.put(Module,            Module_attribute.class);
131210284Sjmallett            standardAttributes.put(RuntimeInvisibleAnnotations, RuntimeInvisibleAnnotations_attribute.class);
132210284Sjmallett            standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class);
133210284Sjmallett            standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class);
134210284Sjmallett            standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class);
135210284Sjmallett            standardAttributes.put(RuntimeVisibleTypeAnnotations, RuntimeVisibleTypeAnnotations_attribute.class);
136210284Sjmallett            standardAttributes.put(RuntimeInvisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations_attribute.class);
137210284Sjmallett            standardAttributes.put(Signature,         Signature_attribute.class);
138210284Sjmallett            standardAttributes.put(SourceDebugExtension, SourceDebugExtension_attribute.class);
139210284Sjmallett            standardAttributes.put(SourceFile,        SourceFile_attribute.class);
140210284Sjmallett            standardAttributes.put(SourceID,          SourceID_attribute.class);
141210284Sjmallett            standardAttributes.put(StackMap,          StackMap_attribute.class);
142210284Sjmallett            standardAttributes.put(StackMapTable,     StackMapTable_attribute.class);
143210284Sjmallett            standardAttributes.put(Synthetic,         Synthetic_attribute.class);
144210284Sjmallett            standardAttributes.put(TargetPlatform,    TargetPlatform_attribute.class);
145210284Sjmallett            standardAttributes.put(Version,           Version_attribute.class);
146210284Sjmallett        }
147210284Sjmallett
148210284Sjmallett        private Map<String,Class<? extends Attribute>> standardAttributes;
149210284Sjmallett    }
150210284Sjmallett
151210284Sjmallett    public static Attribute read(ClassReader cr) throws IOException {
152210284Sjmallett        return cr.readAttribute();
153210284Sjmallett    }
154210284Sjmallett
155210284Sjmallett    protected Attribute(int name_index, int length) {
156210284Sjmallett        attribute_name_index = name_index;
157210284Sjmallett        attribute_length = length;
158210284Sjmallett    }
159210284Sjmallett
160210284Sjmallett    public String getName(ConstantPool constant_pool) throws ConstantPoolException {
161210284Sjmallett        return constant_pool.getUTF8Value(attribute_name_index);
162210284Sjmallett    }
163210284Sjmallett
164210284Sjmallett    public abstract <R,D> R accept(Attribute.Visitor<R,D> visitor, D data);
165210284Sjmallett
166210284Sjmallett    public int byteLength() {
167210284Sjmallett        return 6 + attribute_length;
168210284Sjmallett    }
169210284Sjmallett
170210284Sjmallett    public final int attribute_name_index;
171210284Sjmallett    public final int attribute_length;
172210284Sjmallett
173210284Sjmallett
174210284Sjmallett    public interface Visitor<R,P> {
175210284Sjmallett        R visitBootstrapMethods(BootstrapMethods_attribute attr, P p);
176210284Sjmallett        R visitDefault(DefaultAttribute attr, P p);
177210284Sjmallett        R visitAnnotationDefault(AnnotationDefault_attribute attr, P p);
178210284Sjmallett        R visitCharacterRangeTable(CharacterRangeTable_attribute attr, P p);
179210284Sjmallett        R visitCode(Code_attribute attr, P p);
180210284Sjmallett        R visitCompilationID(CompilationID_attribute attr, P p);
181210284Sjmallett        R visitConcealedPackages(ConcealedPackages_attribute attr, P p);
182210284Sjmallett        R visitConstantValue(ConstantValue_attribute attr, P p);
183210284Sjmallett        R visitDeprecated(Deprecated_attribute attr, P p);
184210284Sjmallett        R visitEnclosingMethod(EnclosingMethod_attribute attr, P p);
185210284Sjmallett        R visitExceptions(Exceptions_attribute attr, P p);
186210284Sjmallett        R visitHashes(Hashes_attribute attr, P p);
187210284Sjmallett        R visitInnerClasses(InnerClasses_attribute attr, P p);
188210284Sjmallett        R visitLineNumberTable(LineNumberTable_attribute attr, P p);
189210284Sjmallett        R visitLocalVariableTable(LocalVariableTable_attribute attr, P p);
190210284Sjmallett        R visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, P p);
191210284Sjmallett        R visitMainClass(MainClass_attribute attr, P p);
192210284Sjmallett        R visitMethodParameters(MethodParameters_attribute attr, P p);
193210284Sjmallett        R visitModule(Module_attribute attr, P p);
194210284Sjmallett        R visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, P p);
195210284Sjmallett        R visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, P p);
196210284Sjmallett        R visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, P p);
197210284Sjmallett        R visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, P p);
198210284Sjmallett        R visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, P p);
199210284Sjmallett        R visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, P p);
200210284Sjmallett        R visitSignature(Signature_attribute attr, P p);
201210284Sjmallett        R visitSourceDebugExtension(SourceDebugExtension_attribute attr, P p);
202210284Sjmallett        R visitSourceFile(SourceFile_attribute attr, P p);
203210284Sjmallett        R visitSourceID(SourceID_attribute attr, P p);
204210284Sjmallett        R visitStackMap(StackMap_attribute attr, P p);
205210284Sjmallett        R visitStackMapTable(StackMapTable_attribute attr, P p);
206210284Sjmallett        R visitSynthetic(Synthetic_attribute attr, P p);
207210284Sjmallett        R visitTargetPlatform(TargetPlatform_attribute attr, P p);
208210284Sjmallett        R visitVersion(Version_attribute attr, P p);
209210284Sjmallett    }
210210284Sjmallett}
211210284Sjmallett