Home | History | Annotate | Download | only in attribute
      1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
      2  *
      3  * This program and the accompanying materials are made available under
      4  * the terms of the Common Public License v1.0 which accompanies this distribution,
      5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
      6  *
      7  * $Id: GenericAttribute_info.java,v 1.1.1.1 2004/05/09 16:57:48 vlad_r Exp $
      8  */
      9 package com.vladium.jcd.cls.attribute;
     10 
     11 import java.io.IOException;
     12 
     13 import com.vladium.jcd.lib.UDataInputStream;
     14 import com.vladium.jcd.lib.UDataOutputStream;
     15 
     16 // ----------------------------------------------------------------------------
     17 /**
     18  * This attribute structure is used during parsing to absorb all attribute types
     19  * that are not currently recognized.
     20  *
     21  * @see Attribute_info
     22  *
     23  * @author (C) 2001, Vlad Roubtsov
     24  */
     25 public
     26 final class GenericAttribute_info extends Attribute_info
     27 {
     28     // public: ................................................................
     29 
     30 
     31     public byte [] m_info;
     32 
     33 
     34     public GenericAttribute_info (final int attribute_name_index, final byte [] info)
     35     {
     36         super (attribute_name_index, (info != null ? info.length : 0));
     37 
     38         m_info = (info != null ? info : EMPTY_BYTE_ARRAY);
     39     }
     40 
     41 
     42     public long length ()
     43     {
     44         return 6 + m_info.length;
     45     }
     46 
     47     // Visitor:
     48 
     49     public void accept (final IAttributeVisitor visitor, final Object ctx)
     50     {
     51         visitor.visit (this, ctx);
     52     }
     53 
     54     public String toString ()
     55     {
     56         return "generic attribute_info: [attribute_name_index = " + m_name_index + ", attribute_length = " + m_attribute_length + ']';
     57     }
     58 
     59     // Cloneable:
     60 
     61     /**
     62      * Performs a deep copy.
     63      */
     64     public Object clone ()
     65     {
     66         final GenericAttribute_info _clone = (GenericAttribute_info) super.clone ();
     67 
     68         // do deep copy:
     69         _clone.m_info = (m_info.length == 0 ? EMPTY_BYTE_ARRAY : (byte []) m_info.clone ());
     70 
     71         return _clone;
     72     }
     73 
     74     // IClassFormatOutput:
     75 
     76     public void writeInClassFormat (final UDataOutputStream out) throws IOException
     77     {
     78         super.writeInClassFormat (out);
     79 
     80         out.write (m_info, 0, m_info.length);
     81     }
     82 
     83     // protected: .............................................................
     84 
     85     // package: ...............................................................
     86 
     87 
     88     GenericAttribute_info (final int attribute_name_index, final long attribute_length,
     89                            final UDataInputStream bytes)
     90         throws IOException
     91     {
     92         super (attribute_name_index, attribute_length);
     93 
     94         m_info = new byte [(int) m_attribute_length];
     95         bytes.readFully (m_info);
     96     }
     97 
     98     // private: ...............................................................
     99 
    100 
    101     private static final byte [] EMPTY_BYTE_ARRAY = new byte [0];
    102 
    103 } // end of class
    104 // ----------------------------------------------------------------------------
    105