FileDocCategorySizeDatePackage
Signature.javaAPI DocJava SE 6 API9249Tue Jun 10 00:22:18 BST 2008com.sun.org.apache.bcel.internal.classfile

Signature

public final class Signature extends Attribute
This class is derived from Attribute and represents a reference to a GJ attribute.
version
$Id: Signature.java,v 1.1.2.1 2005/07/31 23:46:34 jeffsuttor Exp $
author
M. Dahm
see
Attribute

Fields Summary
private int
signature_index
Constructors Summary
public Signature(Signature c)
Initialize from another object. Note that both objects use the same references (shallow copy). Use clone() for a physical copy.

    this(c.getNameIndex(), c.getLength(), c.getSignatureIndex(), c.getConstantPool());
  
Signature(int name_index, int length, DataInputStream file, ConstantPool constant_pool)
Construct object from file stream.

param
name_index Index in constant pool to CONSTANT_Utf8
param
length Content length in bytes
param
file Input stream
param
constant_pool Array of constants
throws
IOException

    this(name_index, length, file.readUnsignedShort(), constant_pool);
  
public Signature(int name_index, int length, int signature_index, ConstantPool constant_pool)

param
name_index Index in constant pool to CONSTANT_Utf8
param
length Content length in bytes
param
constant_pool Array of constants
param
Signature_index Index in constant pool to CONSTANT_Utf8

    super(Constants.ATTR_SIGNATURE, name_index, length, constant_pool);
    this.signature_index = signature_index;
  
Methods Summary
public voidaccept(com.sun.org.apache.bcel.internal.classfile.Visitor v)
Called by objects that are traversing the nodes of the tree implicitely defined by the contents of a Java class. I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects.

param
v Visitor object

     System.err.println("Visiting non-standard Signature object");
     v.visitSignature(this);
   
public com.sun.org.apache.bcel.internal.classfile.Attributecopy(com.sun.org.apache.bcel.internal.classfile.ConstantPool constant_pool)

return
deep copy of this attribute

    return (Signature)clone();
  
public final voiddump(java.io.DataOutputStream file)
Dump source file attribute to file stream in binary format.

param
file Output file stream
throws
IOException

    super.dump(file);
    file.writeShort(signature_index);
  
public final java.lang.StringgetSignature()

return
GJ signature.

    ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(signature_index, 
							     Constants.CONSTANT_Utf8);
    return c.getBytes();
  
public final intgetSignatureIndex()

return
Index in constant pool of source file name.

 return signature_index; 
private static booleanidentPart(int ch)

    return ch == '/" || ch == ';";
  
private static booleanidentStart(int ch)

    return ch == 'T" || ch == 'L";
  
public static final booleanisActualParameterList(java.lang.String s)

    return s.startsWith("L") && s.endsWith(">;");
  
public static final booleanisFormalParameterList(java.lang.String s)

    return s.startsWith("<") && (s.indexOf(':") > 0);
  
private static final voidmatchGJIdent(com.sun.org.apache.bcel.internal.classfile.Signature$MyByteArrayInputStream in, java.lang.StringBuffer buf)

    int ch;

    matchIdent(in, buf);

    ch = in.read();
    if((ch == '<") || ch == '(") { // Parameterized or method
      //System.out.println("Enter <");
      buf.append((char)ch);
      matchGJIdent(in, buf);
      
      while(((ch = in.read()) != '>") && (ch != ')")) { // List of parameters
	if(ch == -1)
	  throw new RuntimeException("Illegal signature: " + in.getData() +
				     " reaching EOF");

	//System.out.println("Still no >");
	buf.append(", ");
	in.unread();
	matchGJIdent(in, buf); // Recursive call
      }

      //System.out.println("Exit >");

      buf.append((char)ch);
    } else
      in.unread();

    ch = in.read();
    if(identStart(ch)) {
      in.unread();
      matchGJIdent(in, buf);
    } else if(ch == ')") {
      in.unread();
      return;
    } else if(ch != ';")
      throw new RuntimeException("Illegal signature: " + in.getData() + " read " +
				 (char)ch);
  
private static final voidmatchIdent(com.sun.org.apache.bcel.internal.classfile.Signature$MyByteArrayInputStream in, java.lang.StringBuffer buf)

    int ch;

    if((ch = in.read()) == -1)
      throw new RuntimeException("Illegal signature: " + in.getData() +
				 " no ident, reaching EOF");

    //System.out.println("return from ident:" + (char)ch);

    if(!identStart(ch)) {
      StringBuffer buf2 = new StringBuffer();

      int count = 1;
      while(Character.isJavaIdentifierPart((char)ch)) {
	buf2.append((char)ch);
	count++;
	ch = in.read();
      }
      
      if(ch == ':") { // Ok, formal parameter
	in.skip("Ljava/lang/Object".length());
	buf.append(buf2);

        ch = in.read();
	in.unread();
	//System.out.println("so far:" + buf2 + ":next:" +(char)ch);
      } else {
	for(int i=0; i < count; i++)
	  in.unread();
      }

      return;
    }

    StringBuffer buf2 = new StringBuffer();
    ch = in.read();

    do {
      buf2.append((char)ch);
      ch = in.read();
      //System.out.println("within ident:"+ (char)ch);

    } while((ch != -1) && (Character.isJavaIdentifierPart((char)ch) || (ch == '/")));

    buf.append(buf2.toString().replace('/", '."));

    //System.out.println("regular return ident:"+ (char)ch + ":" + buf2);

    if(ch != -1)
      in.unread();
  
public final voidsetSignatureIndex(int signature_index)

param
Signature_index.

    this.signature_index = signature_index;
  
public final java.lang.StringtoString()

return
String representation

    String s = getSignature();

    return "Signature(" + s + ")";
  
public static java.lang.Stringtranslate(java.lang.String s)

    //System.out.println("Sig:" + s);
    StringBuffer buf = new StringBuffer();

    matchGJIdent(new MyByteArrayInputStream(s), buf);

    return buf.toString();