Rebasing the Inflater support on jzlib which, unlike GNU ClassPath, has correct implementation of Huffman code. Making the implementation more easily testable by turning Inflater and ZipInputStream into pure delegates. Current implementation is going to need proper long support.
2 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
25 package org.apidesign.javap;
27 import java.io.ByteArrayInputStream;
28 import java.io.DataInputStream;
29 import java.io.IOException;
31 /** An abstract parser for annotation definitions. Analyses the bytes and
32 * performs some callbacks to the overriden parser methods.
34 * @author Jaroslav Tulach <jtulach@netbeans.org>
36 public class AnnotationParser {
37 private final boolean textual;
38 private final boolean iterateArray;
40 protected AnnotationParser(boolean textual, boolean iterateArray) {
41 this.textual = textual;
42 this.iterateArray = iterateArray;
45 protected void visitAnnotationStart(String type, boolean top) throws IOException {
48 protected void visitAnnotationEnd(String type, boolean top) throws IOException {
51 protected void visitValueStart(String attrName, char type) throws IOException {
54 protected void visitValueEnd(String attrName, char type) throws IOException {
58 protected void visitAttr(
59 String annoType, String attr, String attrType, String value
60 ) throws IOException {
63 protected void visitEnumAttr(
64 String annoType, String attr, String attrType, String value
65 ) throws IOException {
66 visitAttr(annoType, attr, attrType, value);
69 /** Initialize the parsing with constant pool from <code>cd</code>.
71 * @param attr the attribute defining annotations
72 * @param cd constant pool
73 * @throws IOException in case I/O fails
75 public final void parse(byte[] attr, ClassData cd) throws IOException {
76 ByteArrayInputStream is = new ByteArrayInputStream(attr);
77 DataInputStream dis = new DataInputStream(is);
85 private void read(DataInputStream dis, ClassData cd) throws IOException {
86 int cnt = dis.readUnsignedShort();
87 for (int i = 0; i < cnt; i++) {
88 readAnno(dis, cd, true);
92 private void readAnno(DataInputStream dis, ClassData cd, boolean top) throws IOException {
93 int type = dis.readUnsignedShort();
94 String typeName = cd.StringValue(type);
95 visitAnnotationStart(typeName, top);
96 int cnt = dis.readUnsignedShort();
97 for (int i = 0; i < cnt; i++) {
98 String attrName = cd.StringValue(dis.readUnsignedShort());
99 readValue(dis, cd, typeName, attrName);
101 visitAnnotationEnd(typeName, top);
103 visitAttr(typeName, null, null, null);
107 private void readValue(
108 DataInputStream dis, ClassData cd, String typeName, String attrName
109 ) throws IOException {
110 char type = (char)dis.readByte();
111 visitValueStart(attrName, type);
113 readAnno(dis, cd, false);
114 } else if ("CFJZsSIDB".indexOf(type) >= 0) { // NOI18N
115 int primitive = dis.readUnsignedShort();
116 String val = cd.stringValue(primitive, textual);
119 attrType = "Ljava_lang_String_2";
121 val = '"' + val + '"';
124 attrType = "" + type;
126 visitAttr(typeName, attrName, attrType, val);
127 } else if (type == 'c') {
128 int cls = dis.readUnsignedShort();
129 } else if (type == '[') {
130 int cnt = dis.readUnsignedShort();
131 for (int i = 0; i < cnt; i++) {
132 readValue(dis, cd, typeName, iterateArray ? attrName : null);
134 } else if (type == 'e') {
135 int enumT = dis.readUnsignedShort();
136 String attrType = cd.stringValue(enumT, textual);
137 int enumN = dis.readUnsignedShort();
138 String val = cd.stringValue(enumN, textual);
139 visitEnumAttr(typeName, attrName, attrType, val);
141 throw new IOException("Unknown type " + type);
143 visitValueEnd(attrName, type);