Source code: com/chaoswg/xtc4y/classdesc/InnerClassInfo.java
1 //$Header: /cvsroot/xtc4y/xtc4y/src/com/chaoswg/xtc4y/classdesc/AttributeInfo.java,v 1.2 2003/08/25 10:50:14 toggm Exp $
2 /******************************************************************************
3 * XTC4y - eXtreme Testing Collection 4 you *
4 * -------------------------------------------------------------------------- *
5 * URL: http://www.chaoswg.com/xtc4y *
6 * Author: Mike Toggweiler (2.dog@gmx.ch) *
7 * *
8 * Last Updated: $Date: 2003/08/25 10:50:14 $, by $Author: toggm $ *
9 * Version: $Revision: 1.2 $ *
10 * -------------------------------------------------------------------------- *
11 * COPYRIGHT: (c) 2003 by Mike Toggweiler *
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
17 *****************************************************************************/
18 package com.chaoswg.xtc4y.classdesc;
19
20 import java.io.DataInputStream;
21 import java.io.DataOutputStream;
22 import java.io.IOException;
23
24 /**
25 * this container class describes an information for an innerclass
26 * @author Mike Toggweiler
27 **/
28 public class InnerClassInfo {
29 private ClassCPEntry innerClass;
30 private ClassCPEntry outerClass;
31 private UTF8CPEntry name;
32 private InnerClassAccessFlags accessFlags;
33
34 /**
35 * Creates a InnnerClassInfo and initializes it from a DataInputStream
36 * @param dis the DataInputStream to read from
37 * @param cp the constant pool to resolve indices
38 **/
39 protected InnerClassInfo(DataInputStream dis, ConstantPool cp)
40 throws IOException {
41 short innerClassIndex = (short)dis.readUnsignedShort();
42 short outerClassIndex = (short)dis.readUnsignedShort();
43 short innerNameIndex = (short)dis.readUnsignedShort();
44 short access = (short)dis.readUnsignedShort();
45
46 if (innerClassIndex == 0) {
47 innerClass = null;
48 }
49 else {
50 innerClass = (ClassCPEntry)cp.getCPEntryAt(innerClassIndex);
51 }
52 if (outerClassIndex == 0) {
53 //is not a member
54 outerClass = null;
55 }
56 else {
57 outerClass = (ClassCPEntry)cp.getCPEntryAt(outerClassIndex);
58 }
59
60 if (innerNameIndex == 0) {
61 //it is an anonymous inner class
62 name = null;
63 }
64 else {
65 name = (UTF8CPEntry)cp.getCPEntryAt(innerNameIndex);
66 }
67 accessFlags = new InnerClassAccessFlags(access);
68 }
69
70 /**
71 * Construct a innerclassinfo and initializes with the
72 * the innerclass, outerclass and the name as well as
73 * the access flags
74 * @param innerClass the innerClass cp entry
75 * @param outerClass the outerClass cp entry
76 * @param name the name cp entry
77 * @param access the InnerclassAccessFlags
78 **/
79 public InnerClassInfo(ClassCPEntry innerClass, ClassCPEntry outerClass,
80 UTF8CPEntry name, InnerClassAccessFlags access) {
81 this.innerClass = innerClass;
82 this.outerClass = outerClass;
83 this.name = name;
84 this.accessFlags = access;
85 }
86
87 /**
88 * Write the constant pool information into a DataOutputStream
89 * @param dos the DataOutputStream to write on
90 * @param cp the constant pool to store variables
91 **/
92 protected final void write(DataOutputStream dos, ConstantPool cp)
93 throws IOException {
94 if (innerClass == null) {
95 dos.writeShort(0);
96 }
97 else {
98 dos.writeShort(cp.addCPEntry(innerClass));
99 }
100 if (outerClass == null) {
101 dos.writeShort(0);
102 }
103 else {
104 dos.writeShort(cp.addCPEntry(outerClass));
105 }
106 if (name == null) {
107 dos.writeShort(0);
108 }
109 else {
110 dos.writeShort(cp.addCPEntry(name));
111 }
112 dos.writeShort(accessFlags.getAccessFlag());
113 }
114
115 /**
116 * @return the innerclass
117 **/
118 public ClassCPEntry getInnerClass() {
119 return innerClass;
120 }
121
122 /**
123 * @return the outerclass
124 **/
125 public ClassCPEntry getOuterClass() {
126 return outerClass;
127 }
128
129 /**
130 * @return the class name
131 **/
132 public UTF8CPEntry getInnerName() {
133 return name;
134 }
135
136 /**
137 * @return the access flags
138 **/
139 public InnerClassAccessFlags getAccessFlags() {
140 return accessFlags;
141 }
142
143 /**
144 * Set the new inner class
145 * @param innerClass
146 **/
147 public void setInnerClass(ClassCPEntry innerClass) {
148 this.innerClass = innerClass;
149 }
150
151 /**
152 * Set the new outer class
153 * @param outerClass
154 **/
155 public void setOuterClass(ClassCPEntry outerClass) {
156 this.outerClass = outerClass;
157 }
158
159 /**
160 * Set the new inner class name
161 * @param name
162 **/
163 public void setInnerName(UTF8CPEntry name) {
164 this.name = name;
165 }
166
167 /**
168 * Set the new access flags
169 * @param access
170 **/
171 public void setAccessFlags(InnerClassAccessFlags access) {
172 this.accessFlags = access;
173 }
174
175 /**
176 * Write in a readable way
177 **/
178 public String toString() {
179 return innerClass+":"+outerClass+":"+name+":"+accessFlags;
180 }
181 }