001    package sysModel.classFile.constantPool;
002    
003    import sysModel.classFile.constantPool.visitors.CheckUTFVisitor;
004    import sysModel.classFile.constantPool.visitors.IPoolInfoVisitor;
005    
006    import java.io.DataInputStream;
007    import java.io.DataOutputStream;
008    import java.io.IOException;
009    
010    /**
011     * Represents a string in the constant pool.
012     *
013     * @author Mathias Ricken
014     */
015    public class StringPoolInfo extends APoolInfo {
016        /**
017         * Utf information.
018         */
019        private AUTFPoolInfo _utf;
020    
021        /**
022         * Utf index.
023         */
024        private short _utfIndex;
025    
026        /**
027         * Constructor.
028         *
029         * @param utf utf information
030         */
031        public StringPoolInfo(AUTFPoolInfo utf, ConstantPool cp) {
032            super(CONSTANT_String, cp);
033            _utf = utf;
034            reindex();
035        }
036    
037        /**
038         * Constructor reading from a stream.
039         *
040         * @param dis input stream
041         * @param cp  constant pool
042         *
043         * @throws IOException
044         */
045        public StringPoolInfo(DataInputStream dis, ConstantPool cp) throws IOException {
046            super(CONSTANT_String, cp);
047            _utfIndex = dis.readShort();
048        }
049    
050        /**
051         * Accessor for the utf information.
052         *
053         * @return utf information
054         */
055        public AUTFPoolInfo getUtf() {
056            return _utf;
057        }
058    
059        /**
060         * Mutator for the utf information.
061         *
062         * @param utf new utf information
063         */
064        public void setUtf(AUTFPoolInfo utf) {
065            _utf = utf;
066        }
067    
068        /**
069         * Write this constant pool object into the stream, including the type byte.
070         *
071         * @param dos stream
072         *
073         * @throws IOException
074         */
075        public void write(DataOutputStream dos) throws IOException {
076            reindex();
077            dos.writeByte(_type);
078            dos.writeShort(_utfIndex);
079        }
080    
081        /**
082         * Resolve constant pool objects. This makes sure that the object links match the index links.
083         */
084        public void resolve() {
085            _utf = _constantPool.get(_utfIndex).execute(CheckUTFVisitor.singleton(), null);
086        }
087    
088        /**
089         * Reindex constant pool indices. This makes sure the index links match the object links.
090         */
091        public void reindex() {
092            _utfIndex = _constantPool.indexOf(_utf);
093        }
094    
095        /**
096         * Return a human-readable version of this constant pool object.
097         *
098         * @return string
099         */
100        public String toString() {
101            StringBuffer s;
102    
103            s = new StringBuffer();
104            s.append("CONSTANT_String: Name = #");
105            s.append(_utfIndex);
106    
107            return s.toString();
108        }
109    
110        /**
111         * Return a human-readable version of this constant pool object.
112         *
113         * @return string
114         */
115        public String toStringVerbose() {
116            return toString();
117        }
118    
119        /**
120         * Return a hash code.
121         *
122         * @return hash code
123         */
124        public int hashCode() {
125            return _utfIndex;
126        }
127    
128        /**
129         * Compare this object and another one.
130         *
131         * @param obj other object
132         *
133         * @return true if the same
134         */
135        public boolean equals(Object obj) {
136            return (obj instanceof StringPoolInfo) && (
137                (((StringPoolInfo)obj)._utfIndex == _utfIndex) ||
138                (((StringPoolInfo)obj)._utf == _utf)
139                );
140        }
141    
142        /**
143         * Execute a visitor.
144         *
145         * @param visitor visitor
146         * @param data    visitor-specific parameter
147         *
148         * @return visitor-specific return value
149         */
150        public <R, D> R execute(IPoolInfoVisitor<R, D> visitor, D data) {
151            return visitor.stringCase(this, data);
152        }
153    }