View Javadoc

    1   /*
    2    * Copyright  2000-2004 The Apache Software Foundation
    3    *
    4    *  Licensed under the Apache License, Version 2.0 (the "License");
    5    *  you may not use this file except in compliance with the License.
    6    *  You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   *  Unless required by applicable law or agreed to in writing, software
    11   *  distributed under the License is distributed on an "AS IS" BASIS,
    12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   *  See the License for the specific language governing permissions and
    14   *  limitations under the License.
    15   *
    16   */
    17  package org.apache.bcel.classfile;
    18
    19  import java.io.DataInputStream;
    20  import java.io.DataOutputStream;
    21  import java.io.IOException;
    22  import org.apache.bcel.Constants;
    23
    24  /***
    25   * This class is derived from <em>Attribute</em> and represents a reference
    26   * to the source file of this class.  At most one SourceFile attribute
    27   * should appear per classfile.  The intention of this class is that it is
    28   * instantiated from the <em>Attribute.readAttribute()</em> method.
    29   *
    30   * @version $Id: SourceFile.java 386056 2006-03-15 11:31:56Z tcurdt $
    31   * @author  <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
    32   * @see     Attribute
    33   */
    34  public final class SourceFile extends Attribute {
    35
    36      private int sourcefile_index;
    37
    38
    39      /***
    40       * Initialize from another object. Note that both objects use the same
    41       * references (shallow copy). Use clone() for a physical copy.
    42       */
    43      public SourceFile(SourceFile c) {
    44          this(c.getNameIndex(), c.getLength(), c.getSourceFileIndex(), c.getConstantPool());
    45      }
    46
    47
    48      /***
    49       * Construct object from file stream.
    50       * @param name_index Index in constant pool to CONSTANT_Utf8
    51       * @param length Content length in bytes
    52       * @param file Input stream
    53       * @param constant_pool Array of constants
    54       * @throws IOException
    55       */
    56      SourceFile(int name_index, int length, DataInputStream file, ConstantPool constant_pool)
    57              throws IOException {
    58          this(name_index, length, file.readUnsignedShort(), constant_pool);
    59      }
    60
    61
    62      /***
    63       * @param name_index Index in constant pool to CONSTANT_Utf8, which
    64       * should represent the string "SourceFile".
    65       * @param length Content length in bytes, the value should be 2.
    66       * @param constant_pool The constant pool that this attribute is
    67       * associated with.
    68       * @param sourcefile_index Index in constant pool to CONSTANT_Utf8.  This
    69       * string will be interpreted as the name of the file from which this
    70       * class was compiled.  It will not be interpreted as indicating the name
    71       * of the directory contqining the file or an absolute path; this
    72       * information has to be supplied the consumer of this attribute - in
    73       * many cases, the JVM.
    74       */
    75      public SourceFile(int name_index, int length, int sourcefile_index, ConstantPool constant_pool) {
    76          super(Constants.ATTR_SOURCE_FILE, name_index, length, constant_pool);
    77          this.sourcefile_index = sourcefile_index;
    78      }
    79
    80
    81      /***
    82       * Called by objects that are traversing the nodes of the tree implicitely
    83       * defined by the contents of a Java class. I.e., the hierarchy of methods,
    84       * fields, attributes, etc. spawns a tree of objects.
    85       *
    86       * @param v Visitor object
    87       */
    88      public void accept( Visitor v ) {
    89          v.visitSourceFile(this);
    90      }
    91
    92
    93      /***
    94       * Dump source file attribute to file stream in binary format.
    95       *
    96       * @param file Output file stream
    97       * @throws IOException
    98       */
    99      public final void dump( DataOutputStream file ) throws IOException {
    100         super.dump(file);
    101         file.writeShort(sourcefile_index);
    102     }
    103
    104
    105     /***
    106      * @return Index in constant pool of source file name.
    107      */
    108     public final int getSourceFileIndex() {
    109         return sourcefile_index;
    110     }
    111
    112
    113     /***
    114      * @param sourcefile_index
    115      */
    116     public final void setSourceFileIndex( int sourcefile_index ) {
    117         this.sourcefile_index = sourcefile_index;
    118     }
    119
    120
    121     /***
    122      * @return Source file name.
    123      */
    124     public final String getSourceFileName() {
    125         ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(sourcefile_index,
    126                 Constants.CONSTANT_Utf8);
    127         return c.getBytes();
    128     }
    129
    130
    131     /***
    132      * @return String representation
    133      */
    134     public final String toString() {
    135         return "SourceFile(" + getSourceFileName() + ")";
    136     }
    137
    138
    139     /***
    140      * @return deep copy of this attribute
    141      */
    142     public Attribute copy( ConstantPool _constant_pool ) {
    143         return (SourceFile) clone();
    144     }
    145 }