001 package edu.rice.cs.cunit.classFile.attributes;
002
003 import edu.rice.cs.cunit.classFile.constantPool.AUTFPoolInfo;
004 import edu.rice.cs.cunit.classFile.constantPool.ConstantPool;
005 import edu.rice.cs.cunit.classFile.attributes.visitors.IAttributeVisitor;
006 import edu.rice.cs.cunit.classFile.code.instructions.LineNumberTable;
007
008 import java.io.ByteArrayOutputStream;
009 import java.io.IOException;
010
011 /**
012 * Represents the AnnotationDefault attribute in a class file.
013 *
014 * @author Mathias Ricken
015 */
016 public class AnnotationDefaultAttributeInfo extends AAttributeInfo {
017 /**
018 * Constructor.
019 *
020 * @param name attribute name
021 * @param data attribute data
022 * @param cp constant pool
023 *
024 * @throws ClassFormatError
025 */
026 public AnnotationDefaultAttributeInfo(AUTFPoolInfo name, byte[] data, ConstantPool cp) throws ClassFormatError {
027 super(name, data, cp);
028 }
029
030 /**
031 * Execute a visitor on this attribute.
032 *
033 * @param visitor visitor
034 * @param param visitor-specific parameter
035 *
036 * @return visitor-specific return value
037 */
038 public <R, D> R execute(IAttributeVisitor<R, D> visitor, D param) {
039 return visitor.annotationDefaultCase(this, param);
040 }
041
042 /**
043 * Returns the name of the attribute as it appears in the class file.
044 *
045 * @return name of the attribute.
046 */
047 public static String getAttributeName() {
048 return "AnnotationDefault";
049 }
050
051 /**
052 * Returns the default value stored in this attribute.
053 *
054 * @return default value
055 */
056 public AAnnotationsAttributeInfo.Annotation.AMemberValue getDefaultValue() {
057 return AAnnotationsAttributeInfo.Annotation.AMemberValue.read(_constantPool, _data, 0);
058 }
059
060 /**
061 * Set the default value stored in this attribute.
062 *
063 * @param defaultValue new default value
064 */
065 public void setDefaultValue(AAnnotationsAttributeInfo.Annotation.AMemberValue defaultValue) {
066 ByteArrayOutputStream baos = new ByteArrayOutputStream();
067 try {
068 defaultValue.writeToByteArrayOutputStream(_constantPool, baos);
069 }
070 catch(IOException ioe) {
071 throw new ClassFormatError("Error while writing out default value");
072 }
073 setData(baos.toByteArray());
074 }
075
076 /**
077 * Return a human-readable version of this attribute.
078 *
079 * @return string
080 */
081 public String toString() {
082 StringBuilder x = new StringBuilder();
083 x.append(_name);
084 x.append(" <");
085 x.append(getDefaultValue().toString());
086 x.append(">");
087 return x.toString();
088 }
089
090
091 /**
092 * Adjust program counter values contained in this attribute, starting at startPC, by adding deltaPC to them.
093 *
094 * @param startPC program counter to start at
095 * @param deltaPC change in program counter values
096 */
097 public void adjustPC(int startPC, int deltaPC) {
098 // nothing to do
099 }
100
101 /**
102 * Translate the program counter values contained in this attribute from an old line number table to a new one.
103 *
104 * @param index critical point (insertion or deletion point)
105 * @param deltaIndex delta value to add to all old line numbers greater than the critical point
106 * @param oldLnt old line number table
107 * @param newLnt new line number table
108 */
109 public void translatePC(int index, int deltaIndex, LineNumberTable oldLnt, LineNumberTable newLnt) {
110 // nothing to do
111 }
112 }