groovy.beans
Class VetoableASTTransformation

java.lang.Object
  extended by groovy.beans.BindableASTTransformation
      extended by groovy.beans.VetoableASTTransformation
All Implemented Interfaces:
ASTTransformation, org.objectweb.asm.Opcodes

public class VetoableASTTransformation
extends BindableASTTransformation

Handles generation of code for the @Vetoable annotation, and @Bindable if also present.

Generally, it adds (if needed) a VetoableChangeSupport field and the needed add/removeVetoableChangeListener methods to support the listeners.

It also generates the setter and wires the setter through the VetoableChangeSupport.

If a Bindable annotaton is detected it also adds support similar to what BindableASTTransformation would do.

Author:
Danno Ferrin (shemnon), Chris Reeves

Field Summary
protected static ClassNode constrainedClassNode
           
protected  ClassNode vcsClassNode
           
 
Fields inherited from class groovy.beans.BindableASTTransformation
boundClassNode, pcsClassNode
 
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6
 
Constructor Summary
VetoableASTTransformation()
           
 
Method Summary
protected  void addVetoableChangeSupport(ClassNode declaringClass)
          Adds the necessary field and methods to support vetoable change support.
protected  Statement createConstrainedStatement(PropertyNode propertyNode, Expression fieldExpression)
          Creates a statement body silimar to: this.fireVetoableChange("field", field, field = value)
protected  Statement createSetStatement(Expression fieldExpression)
          Creates a statement body similar to: field = value

Used when the field is not also @Bindable

protected  void createSetterMethod(ClassNode declaringClass, PropertyNode propertyNode, String setterName, Statement setterBlock)
          Creates a setter method with the given body.
static boolean hasVetoableAnnotation(AnnotatedNode node)
          Convenience method to see if an annotated node is @Vetoable.
protected  boolean needsVetoableChangeSupport(ClassNode declaringClass, SourceUnit sourceUnit)
          Snoops through the declaring class and all parents looking for a field of type VetoableChangeSupport.
 void visit(ASTNode[] nodes, SourceUnit source)
          Handles the bulk of the processing, mostly delegating to other methods.
 
Methods inherited from class groovy.beans.BindableASTTransformation
addPropertyChangeSupport, createBindableStatement, hasBindableAnnotation, needsPropertyChangeSupport
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

constrainedClassNode

protected static ClassNode constrainedClassNode

vcsClassNode

protected ClassNode vcsClassNode
Constructor Detail

VetoableASTTransformation

public VetoableASTTransformation()
Method Detail

hasVetoableAnnotation

public static boolean hasVetoableAnnotation(AnnotatedNode node)
Convenience method to see if an annotated node is @Vetoable.

Parameters:
node - the node to check
Returns:
true if the node is constrained

visit

public void visit(ASTNode[] nodes,
                  SourceUnit source)
Handles the bulk of the processing, mostly delegating to other methods.

Specified by:
visit in interface ASTTransformation
Overrides:
visit in class BindableASTTransformation
Parameters:
nodes - the AST nodes
source - the source unit for the nodes

createConstrainedStatement

protected Statement createConstrainedStatement(PropertyNode propertyNode,
                                               Expression fieldExpression)
Creates a statement body silimar to: this.fireVetoableChange("field", field, field = value)

Parameters:
propertyNode - the field node for the property
fieldExpression - a field expression for setting the property value
Returns:
the created statement

createSetStatement

protected Statement createSetStatement(Expression fieldExpression)
Creates a statement body similar to: field = value

Used when the field is not also @Bindable

Parameters:
fieldExpression - a field expression for setting the property value
Returns:
the created statement

needsVetoableChangeSupport

protected boolean needsVetoableChangeSupport(ClassNode declaringClass,
                                             SourceUnit sourceUnit)
Snoops through the declaring class and all parents looking for a field of type VetoableChangeSupport. Remembers the field and returns false if found otherwise returns true to indicate that such support should be added.

Parameters:
declaringClass - the class to search
Returns:
true if vetoable change support should be added

createSetterMethod

protected void createSetterMethod(ClassNode declaringClass,
                                  PropertyNode propertyNode,
                                  String setterName,
                                  Statement setterBlock)
Creates a setter method with the given body.

This differs from normal setters in that we need to add a declared exception java.beans.PropertyVetoException

Overrides:
createSetterMethod in class BindableASTTransformation
Parameters:
declaringClass - the class to which we will add the setter
propertyNode - the field to back the setter
setterName - the name of the setter
setterBlock - the statement representing the setter block

addVetoableChangeSupport

protected void addVetoableChangeSupport(ClassNode declaringClass)
Adds the necessary field and methods to support vetoable change support.

Adds a new field: "protected final java.beans.VetoableChangeSupport this$vetoableChangeSupport = new java.beans.VetoableChangeSupport(this)"

Also adds support methods: public void addVetoableChangeListener(java.beans.VetoableChangeListener) public void addVetoableChangeListener(String, java.beans.VetoableChangeListener) public void removeVetoableChangeListener(java.beans.VetoableChangeListener) public void removeVetoableChangeListener(String, java.beans.VetoableChangeListener) public java.beans.VetoableChangeListener[] getVetoableChangeListeners()

Parameters:
declaringClass - the class to which we add the support field and methods

Copyright © 2003-2010 The Codehaus. All rights reserved.