blob: 9a0a4290987161622c047930ea1760598a221c3a [file] [log] [blame]
/* *******************************************************************
* Copyright (c) 2004, 2013 IBM Corporation
*
* 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
* ******************************************************************/
package org.aspectj.apache.bcel.classfile.annotation;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.aspectj.apache.bcel.classfile.ConstantPool;
import org.aspectj.apache.bcel.classfile.ConstantUtf8;
import org.aspectj.apache.bcel.classfile.Utility;
import org.aspectj.apache.bcel.generic.ObjectType;
public class AnnotationGen {
public static final AnnotationGen[] NO_ANNOTATIONS = new AnnotationGen[0];
private int typeIndex;
private List<NameValuePair> pairs = Collections.emptyList();
private ConstantPool cpool;
private boolean isRuntimeVisible = false;
public AnnotationGen(AnnotationGen a, ConstantPool cpool, boolean copyPoolEntries) {
this.cpool = cpool;
if (copyPoolEntries) {
typeIndex = cpool.addUtf8(a.getTypeSignature());
} else {
typeIndex = a.getTypeIndex();
}
isRuntimeVisible = a.isRuntimeVisible();
pairs = copyValues(a.getValues(), cpool, copyPoolEntries);
}
private List<NameValuePair> copyValues(List<NameValuePair> in, ConstantPool cpool, boolean copyPoolEntries) {
List<NameValuePair> out = new ArrayList<NameValuePair>();
for (NameValuePair nvp : in) {
out.add(new NameValuePair(nvp, cpool, copyPoolEntries));
}
return out;
}
private AnnotationGen(ConstantPool cpool) {
this.cpool = cpool;
}
/**
* Retrieve an immutable version of this AnnotationGen
*/
public AnnotationGen(ObjectType type, List<NameValuePair> pairs, boolean runtimeVisible, ConstantPool cpool) {
this.cpool = cpool;
if (type != null) {
this.typeIndex = cpool.addUtf8(type.getSignature()); // Only null for funky *temporary* FakeAnnotation objects
}
this.pairs = pairs;
isRuntimeVisible = runtimeVisible;
}
public static AnnotationGen read(DataInputStream dis, ConstantPool cpool, boolean b) throws IOException {
AnnotationGen a = new AnnotationGen(cpool);
a.typeIndex = dis.readUnsignedShort();
int elemValuePairCount = dis.readUnsignedShort();
for (int i = 0; i < elemValuePairCount; i++) {
int nidx = dis.readUnsignedShort();
a.addElementNameValuePair(new NameValuePair(nidx, ElementValue.readElementValue(dis, cpool), cpool));
}
a.isRuntimeVisible(b);
return a;
}
public void dump(DataOutputStream dos) throws IOException {
dos.writeShort(typeIndex); // u2 index of type name in cpool
dos.writeShort(pairs.size()); // u2 element_value pair count
for (int i = 0; i < pairs.size(); i++) {
NameValuePair envp = pairs.get(i);
envp.dump(dos);
}
}
public void addElementNameValuePair(NameValuePair evp) {
if (pairs == Collections.EMPTY_LIST) {
pairs = new ArrayList<NameValuePair>();
}
pairs.add(evp);
}
public int getTypeIndex() {
return typeIndex;
}
public String getTypeSignature() {
ConstantUtf8 utf8 = (ConstantUtf8) cpool.getConstant(typeIndex);
return utf8.getValue();
}
public String getTypeName() {
return Utility.signatureToString(getTypeSignature());
}
public List<NameValuePair> getValues() {
return pairs;
}
@Override
public String toString() {
StringBuffer s = new StringBuffer();
s.append("AnnotationGen:[" + getTypeName() + " #" + pairs.size() + " {");
for (int i = 0; i < pairs.size(); i++) {
s.append(pairs.get(i));
if (i + 1 < pairs.size())
s.append(",");
}
s.append("}]");
return s.toString();
}
public String toShortString() {
StringBuffer s = new StringBuffer();
s.append("@").append(getTypeName());
if (pairs.size()!=0) {
s.append("(");
for (int i = 0; i < pairs.size(); i++) {
s.append(pairs.get(i));
if (i + 1 < pairs.size())
s.append(",");
}
s.append(")");
}
return s.toString();
}
private void isRuntimeVisible(boolean b) {
isRuntimeVisible = b;
}
public boolean isRuntimeVisible() {
return isRuntimeVisible;
}
/**
* @return true if the annotation has a value with the specified name and (toString'd) value
*/
public boolean hasNameValuePair(String name, String value) {
for (NameValuePair pair : pairs) {
if (pair.getNameString().equals(name)) {
if (pair.getValue().stringifyValue().equals(value)) {
return true;
}
}
}
return false;
}
/**
* @return true if the annotation has a value with the specified name
*/
public boolean hasNamedValue(String name) {
for (NameValuePair pair : pairs) {
if (pair.getNameString().equals(name)) {
return true;
}
}
return false;
}
}