KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > yworks > yguard > obf > classfile > CpInfo


1 /**
2  * YGuard -- an obfuscation library for Java(TM) classfiles.
3  *
4  * Original Copyright (c) 1999 Mark Welsh (markw@retrologic.com)
5  * Modifications Copyright (c) 2002 yWorks GmbH (yguard@yworks.com)
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  *
21  * The author may be contacted at yguard@yworks.com
22  *
23  * Java and all Java-based marks are trademarks or registered
24  * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
25  */

26 package com.yworks.yguard.obf.classfile;
27
28 import java.io.*;
29 import java.util.*;
30
31 /**
32  * Representation of an entry in the ConstantPool. Specific types of entry
33  * have their representations sub-classed from this.
34  *
35  * @author Mark Welsh
36  */

37 abstract public class CpInfo implements ClassConstants
38 {
39     // Constants -------------------------------------------------------------
40

41
42     // Fields ----------------------------------------------------------------
43
private int u1tag;
44     private byte info[];
45
46     protected int refCount = 0; // Used for reference counting in Constant Pool
47

48
49     // Class Methods ---------------------------------------------------------
50
/**
51      * Create a new CpInfo from the data passed.
52      *
53      * @throws IOException if class file is corrupt or incomplete
54      */

55     public static CpInfo create(DataInput din) throws java.io.IOException JavaDoc
56     {
57         if (din == null) throw new NullPointerException JavaDoc("No input stream was provided.");
58
59         // Instantiate based on tag byte
60
CpInfo ci = null;
61         switch (din.readUnsignedByte())
62         {
63         case CONSTANT_Utf8: ci = new Utf8CpInfo(); break;
64         case CONSTANT_Integer: ci = new IntegerCpInfo(); break;
65         case CONSTANT_Float: ci = new FloatCpInfo(); break;
66         case CONSTANT_Long: ci = new LongCpInfo(); break;
67         case CONSTANT_Double: ci = new DoubleCpInfo(); break;
68         case CONSTANT_Class: ci = new ClassCpInfo(); break;
69         case CONSTANT_String: ci = new StringCpInfo(); break;
70         case CONSTANT_Fieldref: ci = new FieldrefCpInfo(); break;
71         case CONSTANT_Methodref: ci = new MethodrefCpInfo(); break;
72         case CONSTANT_InterfaceMethodref: ci = new InterfaceMethodrefCpInfo();break;
73         case CONSTANT_NameAndType: ci = new NameAndTypeCpInfo(); break;
74         default: throw new IOException("Unknown tag type in constant pool.");
75         }
76         ci.readInfo(din);
77         return ci;
78     }
79
80
81     // Instance Methods ------------------------------------------------------
82
protected CpInfo(int tag)
83     {
84         u1tag = tag;
85     }
86
87     /** Read the 'info' data following the u1tag byte; over-ride this in sub-classes. */
88     abstract protected void readInfo(DataInput din) throws java.io.IOException JavaDoc;
89
90     /** Check for Utf8 references to constant pool and mark them; over-ride this in sub-classes. */
91     protected void markUtf8Refs(ConstantPool pool) {}
92
93     /** Check for NameAndType references to constant pool and mark them; over-ride this in sub-classes. */
94     protected void markNTRefs(ConstantPool pool) {}
95
96     /** Export the representation to a DataOutput stream. */
97     public void write(DataOutput dout) throws java.io.IOException JavaDoc
98     {
99         if (dout == null) throw new IOException("No output stream was provided.");
100         dout.writeByte(u1tag);
101         writeInfo(dout);
102     }
103
104     /** Write the 'info' data following the u1tag byte; over-ride this in sub-classes. */
105     abstract protected void writeInfo(DataOutput dout) throws java.io.IOException JavaDoc;
106
107     /** Return the reference count. */
108     public int getRefCount() {return refCount;}
109
110     /** Increment the reference count. */
111     public void incRefCount() {refCount++;}
112
113     /** Decrement the reference count. */
114     public void decRefCount()
115     {
116         if (refCount == 0) throw new IllegalStateException JavaDoc("Illegal to reference count is already zero.");
117         refCount--;
118     }
119
120     /** Reset the reference count to zero. */
121     public void resetRefCount() {refCount = 0;}
122
123     /** Dump the content of the class file to the specified file (used for debugging). */
124     public void dump(PrintWriter pw, ClassFile cf, int index) {
125       pw.println(this.getClass().getName());
126     }
127 }
128
Popular Tags