blob: fb5c32ce1e4edfb29539d9f09a45f99e034a73dc [file] [log] [blame]
/* *******************************************************************
* Copyright (c) 2013 VMware
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andy Clement - initial implementation {date}
* ******************************************************************/
package org.aspectj.apache.bcel.classfile.annotation;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import org.aspectj.apache.bcel.classfile.Attribute;
import org.aspectj.apache.bcel.classfile.ConstantPool;
public abstract class RuntimeTypeAnnos extends Attribute {
private boolean visible;
private TypeAnnotationGen[] typeAnnotations; // null until inflated
// Keep just a byte stream of the data until someone actually asks for the information within
private byte[] annotation_data;
public RuntimeTypeAnnos(byte attrid, boolean visible, int nameIdx, int len, ConstantPool cpool) {
super(attrid,nameIdx,len,cpool);
this.visible = visible;
}
protected void readTypeAnnotations(DataInputStream dis,ConstantPool cpool) throws IOException {
annotation_data = new byte[length];
dis.readFully(annotation_data,0,length);
}
public final void dump(DataOutputStream dos) throws IOException {
super.dump(dos);
writeTypeAnnotations(dos);
}
protected void writeTypeAnnotations(DataOutputStream dos) throws IOException {
if (typeAnnotations == null) {
dos.write(annotation_data,0,length);
} else {
dos.writeShort(typeAnnotations.length);
for (int i=0; i<typeAnnotations.length; i++) {
typeAnnotations[i].dump(dos);
}
}
}
// public RuntimeTypeAnnos(byte attrid,boolean visible,int nameIdx,int len,byte[] data,ConstantPool cpool) {
// super(attrid,nameIdx,len,cpool);
// this.visible = visible;
// parameterAnnotations = new ArrayList<AnnotationGen[]>();
// annotation_data = data;
// }
public Attribute copy(ConstantPool constant_pool) {
throw new RuntimeException("Not implemented yet!");
}
public TypeAnnotationGen[] getTypeAnnotations() {
ensureInflated();
return typeAnnotations;
}
public boolean areVisible() {
return visible;
}
private void ensureInflated() {
if (typeAnnotations !=null) {
return;
}
try {
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(annotation_data));
int numTypeAnnotations = dis.readUnsignedShort();
if (numTypeAnnotations == 0) {
typeAnnotations = TypeAnnotationGen.NO_TYPE_ANNOTATIONS;
} else {
typeAnnotations = new TypeAnnotationGen[numTypeAnnotations];
for (int i=0; i<numTypeAnnotations; i++) {
typeAnnotations[i] = TypeAnnotationGen.read(dis,getConstantPool(),visible);
}
}
} catch (IOException ioe) {
throw new RuntimeException("Unabled to inflate type annotation data, badly formed?");
}
}
public String toString() {
return "Runtime"+(visible?"Visible":"Invisible")+"TypeAnnotations ["+(isInflated()?"inflated":"not yet inflated")+"]";
}
public boolean isInflated() {
return typeAnnotations != null;
}
}