View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   https://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.bcel.classfile;
20  
21  import java.io.DataInput;
22  import java.io.DataOutputStream;
23  import java.io.IOException;
24  
25  import org.apache.bcel.Const;
26  import org.apache.bcel.util.Args;
27  
28  /**
29   * This class is derived from <em>Attribute</em> and represents a reference to a PMG attribute.
30   *
31   * @see Attribute
32   */
33  public final class PMGClass extends Attribute {
34  
35      private int pmgClassIndex;
36      private int pmgIndex;
37  
38      /**
39       * Constructs object from input stream.
40       *
41       * @param nameIndex Index in constant pool to CONSTANT_Utf8.
42       * @param length Content length in bytes.
43       * @param input Input stream.
44       * @param constantPool Array of constants.
45       * @throws IOException Thrown if an I/O error occurs.
46       */
47      PMGClass(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) throws IOException {
48          this(nameIndex, length, input.readUnsignedShort(), input.readUnsignedShort(), constantPool);
49      }
50  
51      /**
52       * Constructs a PMGClass.
53       *
54       * @param nameIndex Index in constant pool to CONSTANT_Utf8.
55       * @param length Content length in bytes.
56       * @param pmgIndex index in constant pool for source file name.
57       * @param pmgClassIndex Index in constant pool to CONSTANT_Utf8.
58       * @param constantPool Array of constants.
59       */
60      public PMGClass(final int nameIndex, final int length, final int pmgIndex, final int pmgClassIndex, final ConstantPool constantPool) {
61          super(Const.ATTR_PMG, nameIndex, Args.require(length, 4, "PMG attribute length"), constantPool);
62          this.pmgIndex = pmgIndex;
63          this.pmgClassIndex = pmgClassIndex;
64      }
65  
66      /**
67       * Initialize from another object. Note that both objects use the same references (shallow copy). Use copy() for a
68       * physical copy.
69       *
70       * @param pgmClass Source to copy.
71       */
72      public PMGClass(final PMGClass pgmClass) {
73          this(pgmClass.getNameIndex(), pgmClass.getLength(), pgmClass.getPMGIndex(), pgmClass.getPMGClassIndex(), pgmClass.getConstantPool());
74      }
75  
76      /**
77       * Called by objects that are traversing the nodes of the tree implicitly defined by the contents of a Java class.
78       * I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects.
79       *
80       * @param v Visitor object.
81       */
82      @Override
83      public void accept(final Visitor v) {
84          println("Visiting non-standard PMGClass object");
85      }
86  
87      /**
88       * @return deep copy of this attribute.
89       */
90      @Override
91      public Attribute copy(final ConstantPool constantPool) {
92          return (Attribute) clone();
93      }
94  
95      /**
96       * Dumps source file attribute to file stream in binary format.
97       *
98       * @param file Output file stream.
99       * @throws IOException Thrown if an I/O error occurs.
100      */
101     @Override
102     public void dump(final DataOutputStream file) throws IOException {
103         super.dump(file);
104         file.writeShort(pmgIndex);
105         file.writeShort(pmgClassIndex);
106     }
107 
108     /**
109      * Gets the PMG class index.
110      *
111      * @return Index in constant pool of source file name.
112      */
113     public int getPMGClassIndex() {
114         return pmgClassIndex;
115     }
116 
117     /**
118      * Gets the PMG class name.
119      *
120      * @return PMG class name.
121      */
122     public String getPMGClassName() {
123         return super.getConstantPool().getConstantUtf8(pmgClassIndex).getBytes();
124     }
125 
126     /**
127      * Gets the PMG index.
128      *
129      * @return Index in constant pool of source file name.
130      */
131     public int getPMGIndex() {
132         return pmgIndex;
133     }
134 
135     /**
136      * Gets the PMG name.
137      *
138      * @return PMG name.
139      */
140     public String getPMGName() {
141         return super.getConstantPool().getConstantUtf8(pmgIndex).getBytes();
142     }
143 
144     /**
145      * Sets the PMG class index.
146      *
147      * @param pmgClassIndex The class index.
148      */
149     public void setPMGClassIndex(final int pmgClassIndex) {
150         this.pmgClassIndex = pmgClassIndex;
151     }
152 
153     /**
154      * Sets the PMG index.
155      *
156      * @param pmgIndex The index.
157      */
158     public void setPMGIndex(final int pmgIndex) {
159         this.pmgIndex = pmgIndex;
160     }
161 
162     /**
163      * @return String representation.
164      */
165     @Override
166     public String toString() {
167         return "PMGClass(" + getPMGName() + ", " + getPMGClassName() + ")";
168     }
169 }