FileDocCategorySizeDatePackage
ASMContentHandler.javaAPI DocGlassfish v2 API36710Thu Mar 02 11:51:20 GMT 2006oracle.toplink.libraries.asm.xml

ASMContentHandler

public class ASMContentHandler extends DefaultHandler implements Constants
A {@link org.xml.sax.ContentHandler ContentHandler} that transforms XML document into Java class file. This class can be feeded by any kind of SAX 2.0 event producers, e.g. XML parser, XSLT or XPath engines, or custom code.
see
oracle.toplink.libraries.asm.xml.SAXClassAdapter
see
oracle.toplink.libraries.asm.xml.Processor
author
Eugene Kuleshov

Fields Summary
private List
stack
Stack of the intermediate processing contexts.
private String
match
Complete name of the current element.
protected boolean
computeMax
true if the maximum stack size and number of local variables must be automatically computed.
protected OutputStream
os
Output stream to write result bytecode.
protected ClassWriter
cw
Current instance of the {@link ClassWriter ClassWriter} used to write class bytecode.
protected CodeVisitor
mw
Current instance of the {@link CodeVisitor CodeVisitor} used to write method bytecode
protected Map
labels
Map of the active {@link Label Label} instances for current method.
private static final String
BASE
private final Rule[]
RULES
static final Map
OPCODES
Map of the opcode names to opcode and opcode group
Constructors Summary
public ASMContentHandler(OutputStream os, boolean computeMax)
Constructs a new {@link ASMContentHandler ASMContentHandler} object.

param
os output stream to write generated class.
param
computeMax true if the maximum stack size and the maximum number of local variables must be automatically computed. This value is passed to {@link ClassWriter ClassWriter} instance.

   
    OPCODES.put( "NOP", new Opcode( NOP, OpcodeGroup.INSN));
    OPCODES.put( "ACONST_NULL", new Opcode( ACONST_NULL, OpcodeGroup.INSN));
    OPCODES.put( "ICONST_M1", new Opcode( ICONST_M1, OpcodeGroup.INSN));
    OPCODES.put( "ICONST_0", new Opcode( ICONST_0, OpcodeGroup.INSN));
    OPCODES.put( "ICONST_1", new Opcode( ICONST_1, OpcodeGroup.INSN));
    OPCODES.put( "ICONST_2", new Opcode( ICONST_2, OpcodeGroup.INSN));
    OPCODES.put( "ICONST_3", new Opcode( ICONST_3, OpcodeGroup.INSN));
    OPCODES.put( "ICONST_4", new Opcode( ICONST_4, OpcodeGroup.INSN));
    OPCODES.put( "ICONST_5", new Opcode( ICONST_5, OpcodeGroup.INSN));
    OPCODES.put( "LCONST_0", new Opcode( LCONST_0, OpcodeGroup.INSN));
    OPCODES.put( "LCONST_1", new Opcode( LCONST_1, OpcodeGroup.INSN));
    OPCODES.put( "FCONST_0", new Opcode( FCONST_0, OpcodeGroup.INSN));
    OPCODES.put( "FCONST_1", new Opcode( FCONST_1, OpcodeGroup.INSN));
    OPCODES.put( "FCONST_2", new Opcode( FCONST_2, OpcodeGroup.INSN));
    OPCODES.put( "DCONST_0", new Opcode( DCONST_0, OpcodeGroup.INSN));
    OPCODES.put( "DCONST_1", new Opcode( DCONST_1, OpcodeGroup.INSN));
    OPCODES.put( "BIPUSH", new Opcode( BIPUSH, OpcodeGroup.INSN_INT));
    OPCODES.put( "SIPUSH", new Opcode( SIPUSH, OpcodeGroup.INSN_INT));
    OPCODES.put( "LDC", new Opcode( LDC, OpcodeGroup.INSN_LDC));
    OPCODES.put( "ILOAD", new Opcode( ILOAD, OpcodeGroup.INSN_VAR));
    OPCODES.put( "LLOAD", new Opcode( LLOAD, OpcodeGroup.INSN_VAR));
    OPCODES.put( "FLOAD", new Opcode( FLOAD, OpcodeGroup.INSN_VAR));
    OPCODES.put( "DLOAD", new Opcode( DLOAD, OpcodeGroup.INSN_VAR));
    OPCODES.put( "ALOAD", new Opcode( ALOAD, OpcodeGroup.INSN_VAR));
    OPCODES.put( "IALOAD", new Opcode( IALOAD, OpcodeGroup.INSN));
    OPCODES.put( "LALOAD", new Opcode( LALOAD, OpcodeGroup.INSN));
    OPCODES.put( "FALOAD", new Opcode( FALOAD, OpcodeGroup.INSN));
    OPCODES.put( "DALOAD", new Opcode( DALOAD, OpcodeGroup.INSN));
    OPCODES.put( "AALOAD", new Opcode( AALOAD, OpcodeGroup.INSN));
    OPCODES.put( "BALOAD", new Opcode( BALOAD, OpcodeGroup.INSN));
    OPCODES.put( "CALOAD", new Opcode( CALOAD, OpcodeGroup.INSN));
    OPCODES.put( "SALOAD", new Opcode( SALOAD, OpcodeGroup.INSN));
    OPCODES.put( "ISTORE", new Opcode( ISTORE, OpcodeGroup.INSN_VAR));
    OPCODES.put( "LSTORE", new Opcode( LSTORE, OpcodeGroup.INSN_VAR));
    OPCODES.put( "FSTORE", new Opcode( FSTORE, OpcodeGroup.INSN_VAR));
    OPCODES.put( "DSTORE", new Opcode( DSTORE, OpcodeGroup.INSN_VAR));
    OPCODES.put( "ASTORE", new Opcode( ASTORE, OpcodeGroup.INSN_VAR));
    OPCODES.put( "IASTORE", new Opcode( IASTORE, OpcodeGroup.INSN));
    OPCODES.put( "LASTORE", new Opcode( LASTORE, OpcodeGroup.INSN));
    OPCODES.put( "FASTORE", new Opcode( FASTORE, OpcodeGroup.INSN));
    OPCODES.put( "DASTORE", new Opcode( DASTORE, OpcodeGroup.INSN));
    OPCODES.put( "AASTORE", new Opcode( AASTORE, OpcodeGroup.INSN));
    OPCODES.put( "BASTORE", new Opcode( BASTORE, OpcodeGroup.INSN));
    OPCODES.put( "CASTORE", new Opcode( CASTORE, OpcodeGroup.INSN));
    OPCODES.put( "SASTORE", new Opcode( SASTORE, OpcodeGroup.INSN));
    OPCODES.put( "POP", new Opcode( POP, OpcodeGroup.INSN));
    OPCODES.put( "POP2", new Opcode( POP2, OpcodeGroup.INSN));
    OPCODES.put( "DUP", new Opcode( DUP, OpcodeGroup.INSN));
    OPCODES.put( "DUP_X1", new Opcode( DUP_X1, OpcodeGroup.INSN));
    OPCODES.put( "DUP_X2", new Opcode( DUP_X2, OpcodeGroup.INSN));
    OPCODES.put( "DUP2", new Opcode( DUP2, OpcodeGroup.INSN));
    OPCODES.put( "DUP2_X1", new Opcode( DUP2_X1, OpcodeGroup.INSN));
    OPCODES.put( "DUP2_X2", new Opcode( DUP2_X2, OpcodeGroup.INSN));
    OPCODES.put( "SWAP", new Opcode( SWAP, OpcodeGroup.INSN));
    OPCODES.put( "IADD", new Opcode( IADD, OpcodeGroup.INSN));
    OPCODES.put( "LADD", new Opcode( LADD, OpcodeGroup.INSN));
    OPCODES.put( "FADD", new Opcode( FADD, OpcodeGroup.INSN));
    OPCODES.put( "DADD", new Opcode( DADD, OpcodeGroup.INSN));
    OPCODES.put( "ISUB", new Opcode( ISUB, OpcodeGroup.INSN));
    OPCODES.put( "LSUB", new Opcode( LSUB, OpcodeGroup.INSN));
    OPCODES.put( "FSUB", new Opcode( FSUB, OpcodeGroup.INSN));
    OPCODES.put( "DSUB", new Opcode( DSUB, OpcodeGroup.INSN));
    OPCODES.put( "IMUL", new Opcode( IMUL, OpcodeGroup.INSN));
    OPCODES.put( "LMUL", new Opcode( LMUL, OpcodeGroup.INSN));
    OPCODES.put( "FMUL", new Opcode( FMUL, OpcodeGroup.INSN));
    OPCODES.put( "DMUL", new Opcode( DMUL, OpcodeGroup.INSN));
    OPCODES.put( "IDIV", new Opcode( IDIV, OpcodeGroup.INSN));
    OPCODES.put( "LDIV", new Opcode( LDIV, OpcodeGroup.INSN));
    OPCODES.put( "FDIV", new Opcode( FDIV, OpcodeGroup.INSN));
    OPCODES.put( "DDIV", new Opcode( DDIV, OpcodeGroup.INSN));
    OPCODES.put( "IREM", new Opcode( IREM, OpcodeGroup.INSN));
    OPCODES.put( "LREM", new Opcode( LREM, OpcodeGroup.INSN));
    OPCODES.put( "FREM", new Opcode( FREM, OpcodeGroup.INSN));
    OPCODES.put( "DREM", new Opcode( DREM, OpcodeGroup.INSN));
    OPCODES.put( "INEG", new Opcode( INEG, OpcodeGroup.INSN));
    OPCODES.put( "LNEG", new Opcode( LNEG, OpcodeGroup.INSN));
    OPCODES.put( "FNEG", new Opcode( FNEG, OpcodeGroup.INSN));
    OPCODES.put( "DNEG", new Opcode( DNEG, OpcodeGroup.INSN));
    OPCODES.put( "ISHL", new Opcode( ISHL, OpcodeGroup.INSN));
    OPCODES.put( "LSHL", new Opcode( LSHL, OpcodeGroup.INSN));
    OPCODES.put( "ISHR", new Opcode( ISHR, OpcodeGroup.INSN));
    OPCODES.put( "LSHR", new Opcode( LSHR, OpcodeGroup.INSN));
    OPCODES.put( "IUSHR", new Opcode( IUSHR, OpcodeGroup.INSN));
    OPCODES.put( "LUSHR", new Opcode( LUSHR, OpcodeGroup.INSN));
    OPCODES.put( "IAND", new Opcode( IAND, OpcodeGroup.INSN));
    OPCODES.put( "LAND", new Opcode( LAND, OpcodeGroup.INSN));
    OPCODES.put( "IOR", new Opcode( IOR, OpcodeGroup.INSN));
    OPCODES.put( "LOR", new Opcode( LOR, OpcodeGroup.INSN));
    OPCODES.put( "IXOR", new Opcode( IXOR, OpcodeGroup.INSN));
    OPCODES.put( "LXOR", new Opcode( LXOR, OpcodeGroup.INSN));
    OPCODES.put( "IINC", new Opcode( IINC, OpcodeGroup.INSN_IINC));
    OPCODES.put( "I2L", new Opcode( I2L, OpcodeGroup.INSN));
    OPCODES.put( "I2F", new Opcode( I2F, OpcodeGroup.INSN));
    OPCODES.put( "I2D", new Opcode( I2D, OpcodeGroup.INSN));
    OPCODES.put( "L2I", new Opcode( L2I, OpcodeGroup.INSN));
    OPCODES.put( "L2F", new Opcode( L2F, OpcodeGroup.INSN));
    OPCODES.put( "L2D", new Opcode( L2D, OpcodeGroup.INSN));
    OPCODES.put( "F2I", new Opcode( F2I, OpcodeGroup.INSN));
    OPCODES.put( "F2L", new Opcode( F2L, OpcodeGroup.INSN));
    OPCODES.put( "F2D", new Opcode( F2D, OpcodeGroup.INSN));
    OPCODES.put( "D2I", new Opcode( D2I, OpcodeGroup.INSN));
    OPCODES.put( "D2L", new Opcode( D2L, OpcodeGroup.INSN));
    OPCODES.put( "D2F", new Opcode( D2F, OpcodeGroup.INSN));
    OPCODES.put( "I2B", new Opcode( I2B, OpcodeGroup.INSN));
    OPCODES.put( "I2C", new Opcode( I2C, OpcodeGroup.INSN));
    OPCODES.put( "I2S", new Opcode( I2S, OpcodeGroup.INSN));
    OPCODES.put( "LCMP", new Opcode( LCMP, OpcodeGroup.INSN));
    OPCODES.put( "FCMPL", new Opcode( FCMPL, OpcodeGroup.INSN));
    OPCODES.put( "FCMPG", new Opcode( FCMPG, OpcodeGroup.INSN));
    OPCODES.put( "DCMPL", new Opcode( DCMPL, OpcodeGroup.INSN));
    OPCODES.put( "DCMPG", new Opcode( DCMPG, OpcodeGroup.INSN));
    OPCODES.put( "IFEQ", new Opcode( IFEQ, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IFNE", new Opcode( IFNE, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IFLT", new Opcode( IFLT, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IFGE", new Opcode( IFGE, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IFGT", new Opcode( IFGT, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IFLE", new Opcode( IFLE, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ICMPEQ", new Opcode( IF_ICMPEQ, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ICMPNE", new Opcode( IF_ICMPNE, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ICMPLT", new Opcode( IF_ICMPLT, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ICMPGE", new Opcode( IF_ICMPGE, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ICMPGT", new Opcode( IF_ICMPGT, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ICMPLE", new Opcode( IF_ICMPLE, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ACMPEQ", new Opcode( IF_ACMPEQ, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IF_ACMPNE", new Opcode( IF_ACMPNE, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "GOTO", new Opcode( GOTO, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "JSR", new Opcode( JSR, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "RET", new Opcode( RET, OpcodeGroup.INSN_VAR));
    // OPCODES.put( "TABLESWITCH", new Opcode( TABLESWITCH, "visiTableSwitchInsn"));
    // OPCODES.put( "LOOKUPSWITCH", new Opcode( LOOKUPSWITCH, "visitLookupSwitch"));
    OPCODES.put( "IRETURN", new Opcode( IRETURN, OpcodeGroup.INSN));
    OPCODES.put( "LRETURN", new Opcode( LRETURN, OpcodeGroup.INSN));
    OPCODES.put( "FRETURN", new Opcode( FRETURN, OpcodeGroup.INSN));
    OPCODES.put( "DRETURN", new Opcode( DRETURN, OpcodeGroup.INSN));
    OPCODES.put( "ARETURN", new Opcode( ARETURN, OpcodeGroup.INSN));
    OPCODES.put( "RETURN", new Opcode( RETURN, OpcodeGroup.INSN));
    OPCODES.put( "GETSTATIC", new Opcode( GETSTATIC, OpcodeGroup.INSN_FIELD));
    OPCODES.put( "PUTSTATIC", new Opcode( PUTSTATIC, OpcodeGroup.INSN_FIELD));
    OPCODES.put( "GETFIELD", new Opcode( GETFIELD, OpcodeGroup.INSN_FIELD));
    OPCODES.put( "PUTFIELD", new Opcode( PUTFIELD, OpcodeGroup.INSN_FIELD));
    OPCODES.put( "INVOKEVIRTUAL", new Opcode( INVOKEVIRTUAL, OpcodeGroup.INSN_METHOD));
    OPCODES.put( "INVOKESPECIAL", new Opcode( INVOKESPECIAL, OpcodeGroup.INSN_METHOD));
    OPCODES.put( "INVOKESTATIC", new Opcode( INVOKESTATIC, OpcodeGroup.INSN_METHOD));
    OPCODES.put( "INVOKEINTERFACE", new Opcode( INVOKEINTERFACE, OpcodeGroup.INSN_METHOD));
    OPCODES.put( "NEW", new Opcode( NEW, OpcodeGroup.INSN_TYPE));
    OPCODES.put( "NEWARRAY", new Opcode( NEWARRAY, OpcodeGroup.INSN_INT));
    OPCODES.put( "ANEWARRAY", new Opcode( ANEWARRAY, OpcodeGroup.INSN_TYPE));
    OPCODES.put( "ARRAYLENGTH", new Opcode( ARRAYLENGTH, OpcodeGroup.INSN));
    OPCODES.put( "ATHROW", new Opcode( ATHROW, OpcodeGroup.INSN));
    OPCODES.put( "CHECKCAST", new Opcode( CHECKCAST, OpcodeGroup.INSN_TYPE));
    OPCODES.put( "INSTANCEOF", new Opcode( INSTANCEOF, OpcodeGroup.INSN_TYPE));
    OPCODES.put( "MONITORENTER", new Opcode( MONITORENTER, OpcodeGroup.INSN));
    OPCODES.put( "MONITOREXIT", new Opcode( MONITOREXIT, OpcodeGroup.INSN));
    OPCODES.put( "MULTIANEWARRAY", new Opcode( MULTIANEWARRAY, OpcodeGroup.INSN_MULTIANEWARRAY));
    OPCODES.put( "IFNULL", new Opcode( IFNULL, OpcodeGroup.INSN_JUMP));
    OPCODES.put( "IFNONNULL", new Opcode( IFNONNULL, OpcodeGroup.INSN_JUMP));
  
    this.os = os;
    this.computeMax = computeMax;
  
Methods Summary
public final voidendDocument()
Process notification of the end of a document and write generated bytecode into output stream.

exception
SAXException if parsing or writing error is to be reported.

    try {
      os.write( cw.toByteArray());
    } catch( IOException ex) {
      throw new SAXException( ex.toString(), ex);
    }
  
public final voidendElement(java.lang.String ns, java.lang.String localName, java.lang.String qName)
Process notification of the end of an XML element being reached.

param
ns - The Namespace URI, or the empty string if the element has no Namespace URI or if Namespace processing is not being performed.
param
localName - The local name (without prefix), or the empty string if Namespace processing is not being performed.
param
qName - The qualified XML 1.0 name (with prefix), or the empty string if qualified names are not available.
exception
SAXException if a parsing error is to be reported

    // the actual element name is either in localName or qName, depending
    // on whether the parser is namespace aware
    String name = localName;
    if( name == null || name.length() < 1) {
      name = qName;
    }

    // Fire "end" events for all relevant rules in reverse order
    for( int i = 0; i < RULES.length; i++) {
      if( RULES[ i].match( match, name)) {
        RULES[ i].end( name);
      }
    }

    // Recover the previous match expression
    int slash = match.lastIndexOf( '/");
    if( slash >= 0) {
      match = match.substring( 0, slash);
    } else {
      match = "";
    }
  
final java.lang.Objectpeek()
Return the top object on the stack without removing it. If there are no objects on the stack, return null.

    return stack.size()==0 ? null : stack.get( stack.size()-1);
  
final java.lang.Objectpeek(int n)
Return the n'th object down the stack, where 0 is the top element and [getCount()-1] is the bottom element. If the specified index is out of range, return null.

param
n Index of the desired element, where 0 is the top of the stack, 1 is the next element down, and so on.

    return stack.size()<( n+1) ? null : stack.get( n);
  
final java.lang.Objectpop()
Pop the top object off of the stack, and return it. If there are no objects on the stack, return null.

    return stack.size()==0 ? null : stack.remove( stack.size()-1);
  
final voidpush(java.lang.Object object)
Push a new object onto the top of the object stack.

param
object The new object

    stack.add( object);
  
public final voidstartElement(java.lang.String ns, java.lang.String localName, java.lang.String qName, org.xml.sax.Attributes list)
Process notification of the start of an XML element being reached.

param
ns - The Namespace URI, or the empty string if the element has no Namespace URI or if Namespace processing is not being performed.
param
localName - The local name (without prefix), or the empty string if Namespace processing is not being performed.
param
qName - The qualified name (with prefix), or the empty string if qualified names are not available.
param
list - The attributes attached to the element. If there are no attributes, it shall be an empty Attributes object.
exception
SAXException if a parsing error is to be reported

    // the actual element name is either in localName or qName, depending
    // on whether the parser is namespace aware
    String name = localName;
    if( name==null || name.length()<1) {
      name = qName;
    }

    // Compute the current matching rule
    StringBuffer sb = new StringBuffer( match);
    if( match.length() > 0) {
      sb.append( '/");
    }
    sb.append( name);
    match = sb.toString();

    // Fire "begin" events for all relevant rules
    for( int i = 0; i < RULES.length; i++) {
      if( RULES[ i].match( match, name)) {
        RULES[ i].begin( name, list);
      }
    }
  
public byte[]toByteArray()
Returns the bytecode of the class that was build with underneath class writer.

return
the bytecode of the class that was build with underneath class writer or null if there are no classwriter created.

    return cw==null ? null : cw.toByteArray();