001    package edu.rice.cs.cunit.classFile.attributes;
002    
003    import edu.rice.cs.cunit.classFile.attributes.visitors.IAttributeVisitor;
004    import edu.rice.cs.cunit.classFile.code.instructions.LineNumberTable;
005    import edu.rice.cs.cunit.classFile.constantPool.APoolInfo;
006    import edu.rice.cs.cunit.classFile.constantPool.AUTFPoolInfo;
007    import edu.rice.cs.cunit.classFile.constantPool.ConstantPool;
008    import edu.rice.cs.cunit.classFile.constantPool.visitors.CheckUTFVisitor;
009    import edu.rice.cs.cunit.util.Types;
010    
011    import java.util.ArrayList;
012    
013    /**
014     * Represents the Signature attribute in a class file.
015     *
016     * @author Mathias Ricken
017     */
018    public class SignatureAttributeInfo extends AAttributeInfo {
019        /**
020         * Constructor.
021         *
022         * @param name attribute name
023         * @param data attribute data
024         * @param cp   constant pool
025         *
026         * @throws ClassFormatError
027         */
028        public SignatureAttributeInfo(AUTFPoolInfo name, byte[] data, ConstantPool cp) throws ClassFormatError {
029            super(name, data, cp);
030        }
031    
032        /**
033         * Return the source file name information.
034         *
035         * @return source file name information
036         *
037         * @throws ClassFormatError
038         */
039        public AUTFPoolInfo getSignature() throws ClassFormatError {
040            return _constantPool.get(Types.ushortFromBytes(_data, 0)).execute(CheckUTFVisitor.singleton(), null);
041        }
042    
043        /**
044         * Set the source file name information.
045         *
046         * @param newFileName constant pool
047         */
048        public void setSignature(AUTFPoolInfo newFileName) {
049            _data = new byte[2];
050            Types.bytesFromShort(_constantPool.indexOf(newFileName), _data, 0);
051        }
052    
053        /**
054         * Execute a visitor on this attribute.
055         *
056         * @param visitor visitor
057         * @param param   visitor-specific parameter
058         *
059         * @return visitor-specific return value
060         */
061        public <R, D> R execute(IAttributeVisitor<R, D> visitor, D param) {
062            return visitor.signatureCase(this, param);
063        }
064    
065        /**
066         * Adjust program counter values contained in this attribute, starting at startPC, by adding deltaPC to them.
067         *
068         * @param startPC program counter to start at
069         * @param deltaPC change in program counter values
070         */
071        public void adjustPC(int startPC, int deltaPC) {
072            // nothing to do
073        }
074    
075        /**
076         * Translate the program counter values contained in this attribute from an old line number table to a new one.
077         *
078         * @param index      critical point (insertion or deletion point)
079         * @param deltaIndex delta value to add to all old line numbers greater than the critical point
080         * @param oldLnt     old line number table
081         * @param newLnt     new line number table
082         */
083        public void translatePC(int index, int deltaIndex, LineNumberTable oldLnt, LineNumberTable newLnt) {
084            // nothing to do
085        }
086    
087        /**
088         * Creates and returns a copy of this object.
089         */
090        public Object clone() throws CloneNotSupportedException {
091            return super.clone();
092        }
093    
094        /**
095         * Return a human-readable version of this attribute.
096         *
097         * @return string
098         */
099        public String toString() {
100            return "Signature = "+getSignature().toString();
101        }
102    
103        /**
104         * Returns the name of the attribute as it appears in the class file.
105         *
106         * @return name of the attribute.
107         */
108        public static String getAttributeName() {
109            return "Signature";
110        }
111    }