001    /*
002     * @(#)APoolInfo.java   1.5 95/08/16 Chuck McManis
003     *
004     * Copyright (c) 1996 Chuck McManis, All Rights Reserved.
005     *
006     * Permission to use, copy, modify, and distribute this software
007     * and its documentation for NON-COMMERCIAL purposes and without
008     * fee is hereby granted provided that this copyright notice
009     * appears in all copies.
010     *
011     * CHUCK MCMANIS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
012     * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
013     * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
014     * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. CHUCK MCMANIS SHALL NOT BE
015     * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
016     * MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
017     */
018    
019    package sysModel.classFile.constantPool;
020    
021    import sysModel.classFile.constantPool.visitors.IPoolInfoVisitor;
022    
023    import java.io.DataInputStream;
024    import java.io.DataOutputStream;
025    import java.io.IOException;
026    
027    /**
028     * Represents an abstract constant pool object.
029     *
030     * @author Mathias Ricken
031     */
032    public abstract class APoolInfo {
033        // Constant pool object types
034        public static final int CONSTANT_Class = 7;
035        public static final int CONSTANT_Fieldref = 9;
036        public static final int CONSTANT_Methodref = 10;
037        public static final int CONSTANT_InterfaceMethodref = 11;
038        public static final int CONSTANT_String = 8;
039        public static final int CONSTANT_Integer = 3;
040        public static final int CONSTANT_Float = 4;
041        public static final int CONSTANT_Long = 5;
042        public static final int CONSTANT_Double = 6;
043        public static final int CONSTANT_NameAndType = 12;
044        public static final int CONSTANT_Utf8_ASCII = 1;
045        public static final int CONSTANT_Utf8_Unicode = 2;
046    
047        /**
048         * Object type.
049         */
050        protected int _type;
051    
052        /**
053         * Reference to the constant pool.
054         */
055        protected ConstantPool _constantPool;
056    
057        /**
058         * Constructor
059         *
060         * @param type object type
061         */
062        public APoolInfo(int type, ConstantPool cp) {
063            _type = type;
064            _constantPool = cp;
065        }
066    
067        /**
068         * Read from stream and return unresolved constant pool object.
069         *
070         * @param dis stream
071         *
072         * @return unresolved constant pool object.
073         *
074         * @throws IOException
075         * @throws ClassFormatError
076         */
077        public static APoolInfo read(DataInputStream dis, ConstantPool cp) throws IOException, ClassFormatError {
078            int type = dis.readByte();
079            APoolInfo item;
080            switch(type) {
081                case CONSTANT_Class:
082                    item = new ClassPoolInfo(dis, cp);
083                    break;
084                case CONSTANT_Fieldref:
085                    item = new FieldPoolInfo(dis, cp);
086                    break;
087                case CONSTANT_Methodref:
088                    item = new MethodPoolInfo(dis, cp);
089                    break;
090                case CONSTANT_InterfaceMethodref:
091                    item = new InterfaceMethodPoolInfo(dis, cp);
092                    break;
093                case CONSTANT_NameAndType:
094                    item = new NameAndTypePoolInfo(dis, cp);
095                    break;
096                case CONSTANT_String:
097                    item = new StringPoolInfo(dis, cp);
098                    break;
099                case CONSTANT_Integer:
100                    item = new IntegerPoolInfo(dis, cp);
101                    break;
102                case CONSTANT_Float:
103                    item = new FloatPoolInfo(dis, cp);
104                    break;
105                case CONSTANT_Long:
106                    item = new LongPoolInfo(dis, cp);
107                    break;
108                case CONSTANT_Double:
109                    item = new DoublePoolInfo(dis, cp);
110                    break;
111                case CONSTANT_Utf8_ASCII:
112                    item = new ASCIIPoolInfo(dis, cp);
113                    break;
114                case CONSTANT_Utf8_Unicode:
115                    item = new UnicodePoolInfo(dis, cp);
116                    break;
117                default:
118                    throw new ClassFormatError("Unknown constant pool item type");
119            }
120            return item;
121        }
122    
123        /**
124         * Return the reference to the constant pool item that is already in pool, that matches this one.
125         *
126         * @param pool constant pool
127         *
128         * @return matching object or null if not found
129         */
130        public APoolInfo inPool(ConstantPool pool) {
131            for(APoolInfo cpi : pool) {
132                if (equals(cpi)) {
133                    return cpi;
134                }
135            }
136            return null;
137        }
138    
139        /**
140         * Write this constant pool object into the stream, including the type byte.
141         *
142         * @param dos stream
143         *
144         * @throws IOException
145         */
146        public abstract void write(DataOutputStream dos) throws IOException;
147    
148        /**
149         * Resolve constant pool objects. This makes sure that the object links match the index links.
150         */
151        public abstract void resolve();
152    
153        /**
154         * Reindex constant pool indices. This makes sure the index links match the object links.
155         */
156        public abstract void reindex();
157    
158        /**
159         * Return a human-readable version of this constant pool object.
160         *
161         * @return string
162         */
163        public abstract String toStringVerbose();
164    
165        /**
166         * Return a human-readable version of this constant pool object.
167         *
168         * @return string
169         */
170        public abstract String toString();
171    
172        /**
173         * Return a hash code.
174         *
175         * @return hash code
176         */
177        public abstract int hashCode();
178    
179        /**
180         * Compare this object and another one.
181         *
182         * @param obj other object
183         *
184         * @return true if the same
185         */
186        public abstract boolean equals(Object obj);
187    
188        /**
189         * Execute a visitor.
190         *
191         * @param visitor visitor
192         * @param data    visitor-specific parameter
193         *
194         * @return visitor-specific return value
195         */
196        public abstract <R, D> R execute(IPoolInfoVisitor<R, D> visitor, D data);
197    }