1   package org.apache.bcel.classfile;
2   
3   /* ====================================================================
4    * The Apache Software License, Version 1.1
5    *
6    * Copyright (c) 2001 The Apache Software Foundation.  All rights
7    * reserved.
8    *
9    * Redistribution and use in source and binary forms, with or without
10   * modification, are permitted provided that the following conditions
11   * are met:
12   *
13   * 1. Redistributions of source code must retain the above copyright
14   *    notice, this list of conditions and the following disclaimer.
15   *
16   * 2. Redistributions in binary form must reproduce the above copyright
17   *    notice, this list of conditions and the following disclaimer in
18   *    the documentation and/or other materials provided with the
19   *    distribution.
20   *
21   * 3. The end-user documentation included with the redistribution,
22   *    if any, must include the following acknowledgment:
23   *       "This product includes software developed by the
24   *        Apache Software Foundation (http://www.apache.org/)."
25   *    Alternately, this acknowledgment may appear in the software itself,
26   *    if and wherever such third-party acknowledgments normally appear.
27   *
28   * 4. The names "Apache" and "Apache Software Foundation" and
29   *    "Apache BCEL" must not be used to endorse or promote products
30   *    derived from this software without prior written permission. For
31   *    written permission, please contact apache@apache.org.
32   *
33   * 5. Products derived from this software may not be called "Apache",
34   *    "Apache BCEL", nor may "Apache" appear in their name, without
35   *    prior written permission of the Apache Software Foundation.
36   *
37   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48   * SUCH DAMAGE.
49   * ====================================================================
50   *
51   * This software consists of voluntary contributions made by many
52   * individuals on behalf of the Apache Software Foundation.  For more
53   * information on the Apache Software Foundation, please see
54   * <http://www.apache.org/>.
55   */
56  
57  import org.apache.bcel.Constants;
58  import java.io.*;
59  import java.util.*;
60  
61  /***
62   * This class represents a reference to an unknown (i.e.,
63   * application-specific) attribute of a class.  It is instantiated from the
64   * <em>Attribute.readAttribute()</em> method.  Applications that need to
65   * read in application-specific attributes should create an <a
66   * href="./AttributeReader.html">AttributeReader</a> implementation and
67   * attach it via <a
68   * href="./Attribute.html#addAttributeReader(java.lang.String,
69   * org.apache.bcel.classfile.AttributeReader)">Attribute.addAttributeReader</a>.
70  
71   *
72   * @version $Id: Unknown.java,v 1.3 2002/03/11 16:16:35 mdahm Exp $
73   * @see org.apache.bcel.classfile.Attribute
74   * @see org.apache.bcel.classfile.AttributeReader
75   * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
76   */
77  public final class Unknown extends Attribute {
78    private byte[] bytes;
79    private String name;
80  
81    private static HashMap unknown_attributes = new HashMap();
82  
83    /*** @return array of unknown attributes, but just one for each kind.
84     */
85    static Unknown[] getUnknownAttributes() {
86      Unknown[] unknowns = new Unknown[unknown_attributes.size()];
87      Iterator  entries  = unknown_attributes.values().iterator();
88  
89      for(int i=0; entries.hasNext(); i++)
90        unknowns[i] = (Unknown)entries.next();
91  
92      unknown_attributes.clear();
93      return unknowns;
94    }
95  
96    /***
97     * Initialize from another object. Note that both objects use the same
98     * references (shallow copy). Use clone() for a physical copy.
99     */
100   public Unknown(Unknown c) {
101     this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool());
102   }
103 
104   /***
105    * Create a non-standard attribute.
106    *
107    * @param name_index Index in constant pool
108    * @param length Content length in bytes
109    * @param bytes Attribute contents
110    * @param constant_pool Array of constants
111    */
112   public Unknown(int name_index, int length, byte[] bytes,
113 		 ConstantPool constant_pool)
114   {
115     super(Constants.ATTR_UNKNOWN, name_index, length, constant_pool);
116     this.bytes = bytes;
117 
118     name = ((ConstantUtf8)constant_pool.getConstant(name_index,
119 						    Constants.CONSTANT_Utf8)).getBytes();
120     unknown_attributes.put(name, this);
121   }
122 
123   /***
124    * Construct object from file stream.
125    * @param name_index Index in constant pool
126    * @param length Content length in bytes
127    * @param file Input stream
128    * @param constant_pool Array of constants
129    * @throws IOException
130    */
131   Unknown(int name_index, int length, DataInputStream file,
132 	  ConstantPool constant_pool)
133        throws IOException
134   {
135     this(name_index, length, (byte [])null, constant_pool);
136 
137     if(length > 0) {
138       bytes = new byte[length];
139       file.readFully(bytes);
140     }
141   }    
142 
143   /***
144    * Called by objects that are traversing the nodes of the tree implicitely
145    * defined by the contents of a Java class. I.e., the hierarchy of methods,
146    * fields, attributes, etc. spawns a tree of objects.
147    *
148    * @param v Visitor object
149    */
150   public void accept(Visitor v) {
151     v.visitUnknown(this);
152   }    
153   /***
154    * Dump unknown bytes to file stream.
155    *
156    * @param file Output file stream
157    * @throws IOException
158    */ 
159   public final void dump(DataOutputStream file) throws IOException
160   {
161     super.dump(file);
162     if(length > 0)
163       file.write(bytes, 0, length);
164   }    
165   /***
166    * @return data bytes.
167    */  
168   public final byte[] getBytes() { return bytes; }    
169 
170   /***
171    * @return name of attribute.
172    */  
173   public final String getName() { return name; }    
174 
175   /***
176    * @param bytes.
177    */
178   public final void setBytes(byte[] bytes) {
179     this.bytes = bytes;
180   }
181 
182   /***
183    * @return String representation.
184    */ 
185   public final String toString() {
186     if(length == 0 || bytes == null)
187       return "(Unknown attribute " + name + ")";
188 
189     String hex;
190     if(length > 10) {
191       byte[] tmp = new byte[10];
192       System.arraycopy(bytes, 0, tmp, 0, 10);
193       hex = Utility.toHexString(tmp) + "... (truncated)";
194     }
195     else
196       hex = Utility.toHexString(bytes);
197 
198     return "(Unknown attribute " + name + ": " + hex + ")";
199   }
200 
201   /***
202    * @return deep copy of this attribute
203    */
204   public Attribute copy(ConstantPool constant_pool) {
205     Unknown c = (Unknown)clone();
206 
207     if(bytes != null)
208       c.bytes = (byte[])bytes.clone();
209 
210     c.constant_pool = constant_pool;
211     return c;
212   }
213 }
This page was automatically generated by Maven