View Javadoc
1   /*
2    * reserved comment block
3    * DO NOT REMOVE OR ALTER!
4    */
5   package com.sun.org.apache.bcel.internal.classfile;
6   
7   /* ====================================================================
8    * The Apache Software License, Version 1.1
9    *
10   * Copyright (c) 2001 The Apache Software Foundation.  All rights
11   * reserved.
12   *
13   * Redistribution and use in source and binary forms, with or without
14   * modification, are permitted provided that the following conditions
15   * are met:
16   *
17   * 1. Redistributions of source code must retain the above copyright
18   *    notice, this list of conditions and the following disclaimer.
19   *
20   * 2. Redistributions in binary form must reproduce the above copyright
21   *    notice, this list of conditions and the following disclaimer in
22   *    the documentation and/or other materials provided with the
23   *    distribution.
24   *
25   * 3. The end-user documentation included with the redistribution,
26   *    if any, must include the following acknowledgment:
27   *       "This product includes software developed by the
28   *        Apache Software Foundation (http://www.apache.org/)."
29   *    Alternately, this acknowledgment may appear in the software itself,
30   *    if and wherever such third-party acknowledgments normally appear.
31   *
32   * 4. The names "Apache" and "Apache Software Foundation" and
33   *    "Apache BCEL" must not be used to endorse or promote products
34   *    derived from this software without prior written permission. For
35   *    written permission, please contact apache@apache.org.
36   *
37   * 5. Products derived from this software may not be called "Apache",
38   *    "Apache BCEL", nor may "Apache" appear in their name, without
39   *    prior written permission of the Apache Software Foundation.
40   *
41   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52   * SUCH DAMAGE.
53   * ====================================================================
54   *
55   * This software consists of voluntary contributions made by many
56   * individuals on behalf of the Apache Software Foundation.  For more
57   * information on the Apache Software Foundation, please see
58   * <http://www.apache.org/>.
59   */
60  
61  import  com.sun.org.apache.bcel.internal.Constants;
62  import  java.io.*;
63  
64  /**
65   * This class is derived from <em>Attribute</em> and denotes that this class
66   * is an Inner class of another.
67   * to the source file of this class.
68   * It is instantiated from the <em>Attribute.readAttribute()</em> method.
69   *
70   * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
71   * @see     Attribute
72   */
73  public final class InnerClasses extends Attribute {
74    private InnerClass[] inner_classes;
75    private int          number_of_classes;
76  
77    /**
78     * Initialize from another object. Note that both objects use the same
79     * references (shallow copy). Use clone() for a physical copy.
80     */
81    public InnerClasses(InnerClasses c) {
82      this(c.getNameIndex(), c.getLength(), c.getInnerClasses(),
83           c.getConstantPool());
84    }
85  
86    /**
87     * @param name_index Index in constant pool to CONSTANT_Utf8
88     * @param length Content length in bytes
89     * @param inner_classes array of inner classes attributes
90     * @param constant_pool Array of constants
91     * @param sourcefile_index Index in constant pool to CONSTANT_Utf8
92     */
93    public InnerClasses(int name_index, int length,
94                        InnerClass[] inner_classes,
95                        ConstantPool constant_pool)
96    {
97      super(Constants.ATTR_INNER_CLASSES, name_index, length, constant_pool);
98      setInnerClasses(inner_classes);
99    }
100 
101   /**
102    * Construct object from file stream.
103    *
104    * @param name_index Index in constant pool to CONSTANT_Utf8
105    * @param length Content length in bytes
106    * @param file Input stream
107    * @param constant_pool Array of constants
108    * @throws IOException
109    */
110   InnerClasses(int name_index, int length, DataInputStream file,
111                ConstantPool constant_pool) throws IOException
112   {
113     this(name_index, length, (InnerClass[])null, constant_pool);
114 
115     number_of_classes = file.readUnsignedShort();
116     inner_classes = new InnerClass[number_of_classes];
117 
118     for(int i=0; i < number_of_classes; i++)
119       inner_classes[i] = new InnerClass(file);
120   }
121   /**
122    * Called by objects that are traversing the nodes of the tree implicitely
123    * defined by the contents of a Java class. I.e., the hierarchy of methods,
124    * fields, attributes, etc. spawns a tree of objects.
125    *
126    * @param v Visitor object
127    */
128   public void accept(Visitor v) {
129     v.visitInnerClasses(this);
130   }
131   /**
132    * Dump source file attribute to file stream in binary format.
133    *
134    * @param file Output file stream
135    * @throws IOException
136    */
137   public final void dump(DataOutputStream file) throws IOException
138   {
139     super.dump(file);
140     file.writeShort(number_of_classes);
141 
142     for(int i=0; i < number_of_classes; i++)
143       inner_classes[i].dump(file);
144   }
145 
146   /**
147    * @return array of inner class "records"
148    */
149   public final InnerClass[] getInnerClasses() { return inner_classes; }
150 
151   /**
152    * @param inner_classes.
153    */
154   public final void setInnerClasses(InnerClass[] inner_classes) {
155     this.inner_classes = inner_classes;
156     number_of_classes = (inner_classes == null)? 0 : inner_classes.length;
157   }
158 
159   /**
160    * @return String representation.
161    */
162   public final String toString() {
163     StringBuffer buf = new StringBuffer();
164 
165     for(int i=0; i < number_of_classes; i++)
166       buf.append(inner_classes[i].toString(constant_pool) + "\n");
167 
168     return buf.toString();
169   }
170 
171   /**
172    * @return deep copy of this attribute
173    */
174   public Attribute copy(ConstantPool constant_pool) {
175     InnerClasses c = (InnerClasses)clone();
176 
177     c.inner_classes = new InnerClass[number_of_classes];
178     for(int i=0; i < number_of_classes; i++)
179       c.inner_classes[i] = inner_classes[i].copy();
180 
181     c.constant_pool = constant_pool;
182     return c;
183   }
184 }