org.codehaus.groovy.grails.compiler.web
Class ControllerActionTransformer

java.lang.Object
  extended by org.codehaus.groovy.grails.compiler.web.ControllerActionTransformer
All Implemented Interfaces:
org.codehaus.groovy.grails.compiler.injection.AnnotatedClassInjector, org.codehaus.groovy.grails.compiler.injection.ClassInjector, org.codehaus.groovy.grails.compiler.injection.GrailsArtefactClassInjector

public class ControllerActionTransformer
extends java.lang.Object
implements org.codehaus.groovy.grails.compiler.injection.GrailsArtefactClassInjector, org.codehaus.groovy.grails.compiler.injection.AnnotatedClassInjector

Enhances controller classes by converting closures actions to method actions and binding request parameters to action arguments.


Field Summary
static org.codehaus.groovy.ast.AnnotationNode ACTION_ANNOTATION_NODE
           
static java.lang.String EXCEPTION_HANDLER_META_DATA_FIELD_NAME
           
static java.lang.String VOID_TYPE
           
 
Fields inherited from interface org.codehaus.groovy.grails.compiler.injection.GrailsArtefactClassInjector
EMPTY_CLASS_ARRAY, ZERO_ARGS, ZERO_PARAMETERS
 
Fields inherited from interface org.codehaus.groovy.grails.compiler.injection.ClassInjector
PRIVATE_STATIC_MODIFIER
 
Constructor Summary
ControllerActionTransformer()
           
 
Method Summary
protected  void addMethodToInvokeClosure(org.codehaus.groovy.ast.ClassNode controllerClassNode, org.codehaus.groovy.ast.PropertyNode closureProperty, org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context)
           
protected  void annotateActionMethod(org.codehaus.groovy.ast.Parameter[] parameters, org.codehaus.groovy.ast.MethodNode methodNode)
           
protected  void copyAnnotations(org.codehaus.groovy.ast.MethodNode from, org.codehaus.groovy.ast.MethodNode to)
           
 java.lang.String[] getArtefactTypes()
           
protected  java.util.Collection<org.codehaus.groovy.ast.MethodNode> getExceptionHandlerMethods(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.control.SourceUnit sourceUnit)
           
protected  org.codehaus.groovy.ast.expr.Expression getRejectValueExpression(java.lang.String methodParamName)
           
protected  org.codehaus.groovy.ast.stmt.BlockStatement initializeActionParameters(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.ASTNode actionNode, java.lang.String actionName, org.codehaus.groovy.ast.Parameter[] actionParameters, org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context)
           
protected  void initializeAndValidateCommandObjectParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.ClassNode controllerNode, org.codehaus.groovy.ast.ClassNode commandObjectNode, org.codehaus.groovy.ast.ASTNode actionNode, java.lang.String actionName, java.lang.String paramName, org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context)
           
protected  void initializeCommandObjectParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.ClassNode commandObjectNode, java.lang.String paramName, org.codehaus.groovy.control.SourceUnit source)
           
protected  void initializeMethodParameter(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.ASTNode actionNode, java.lang.String actionName, org.codehaus.groovy.ast.Parameter param, org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context)
           
protected  void initializePrimitiveOrTypeWrapperParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.Parameter param, java.lang.String requestParameterName)
           
protected  void initializeStringParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.Parameter param, java.lang.String requestParameterName)
           
 void performInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)
           
 void performInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)
           
 void performInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)
           
 void performInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)
           
 boolean shouldInject(java.net.URL url)
           
protected  void transformClosureToMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.expr.ClosureExpression closureAction, org.codehaus.groovy.ast.PropertyNode property, org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context)
           
protected  void wrapMethodBodyWithExceptionHandling(org.codehaus.groovy.ast.MethodNode methodNode)
          This will wrap the method body in a try catch block which does something like this:
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

ACTION_ANNOTATION_NODE

public static final org.codehaus.groovy.ast.AnnotationNode ACTION_ANNOTATION_NODE

EXCEPTION_HANDLER_META_DATA_FIELD_NAME

public static final java.lang.String EXCEPTION_HANDLER_META_DATA_FIELD_NAME
See Also:
Constant Field Values

VOID_TYPE

public static final java.lang.String VOID_TYPE
See Also:
Constant Field Values
Constructor Detail

ControllerActionTransformer

public ControllerActionTransformer()
Method Detail

getArtefactTypes

public java.lang.String[] getArtefactTypes()
Specified by:
getArtefactTypes in interface org.codehaus.groovy.grails.compiler.injection.GrailsArtefactClassInjector

performInjection

public void performInjection(org.codehaus.groovy.control.SourceUnit source,
                             org.codehaus.groovy.classgen.GeneratorContext context,
                             org.codehaus.groovy.ast.ClassNode classNode)
Specified by:
performInjection in interface org.codehaus.groovy.grails.compiler.injection.ClassInjector

performInjectionOnAnnotatedClass

public void performInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source,
                                             org.codehaus.groovy.classgen.GeneratorContext context,
                                             org.codehaus.groovy.ast.ClassNode classNode)
Specified by:
performInjectionOnAnnotatedClass in interface org.codehaus.groovy.grails.compiler.injection.AnnotatedClassInjector

performInjectionOnAnnotatedClass

public void performInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source,
                                             org.codehaus.groovy.ast.ClassNode classNode)
Specified by:
performInjectionOnAnnotatedClass in interface org.codehaus.groovy.grails.compiler.injection.ClassInjector

getExceptionHandlerMethods

protected java.util.Collection<org.codehaus.groovy.ast.MethodNode> getExceptionHandlerMethods(org.codehaus.groovy.ast.ClassNode classNode,
                                                                                              org.codehaus.groovy.control.SourceUnit sourceUnit)

copyAnnotations

protected void copyAnnotations(org.codehaus.groovy.ast.MethodNode from,
                               org.codehaus.groovy.ast.MethodNode to)

addMethodToInvokeClosure

protected void addMethodToInvokeClosure(org.codehaus.groovy.ast.ClassNode controllerClassNode,
                                        org.codehaus.groovy.ast.PropertyNode closureProperty,
                                        org.codehaus.groovy.control.SourceUnit source,
                                        org.codehaus.groovy.classgen.GeneratorContext context)

annotateActionMethod

protected void annotateActionMethod(org.codehaus.groovy.ast.Parameter[] parameters,
                                    org.codehaus.groovy.ast.MethodNode methodNode)

wrapMethodBodyWithExceptionHandling

protected void wrapMethodBodyWithExceptionHandling(org.codehaus.groovy.ast.MethodNode methodNode)
This will wrap the method body in a try catch block which does something like this:
 try {
     // original method body here
 } catch (Exception $caughtException) {
     Method $method = getExceptionHandlerMethod($caughtException.getClass())
     if($method) {
         return $method.invoke(this, $caughtException)
     } else {
         throw $caughtException
     }
 }
 

Parameters:
methodNode - the method to add the try catch block to

transformClosureToMethod

protected void transformClosureToMethod(org.codehaus.groovy.ast.ClassNode classNode,
                                        org.codehaus.groovy.ast.expr.ClosureExpression closureAction,
                                        org.codehaus.groovy.ast.PropertyNode property,
                                        org.codehaus.groovy.control.SourceUnit source,
                                        org.codehaus.groovy.classgen.GeneratorContext context)

initializeActionParameters

protected org.codehaus.groovy.ast.stmt.BlockStatement initializeActionParameters(org.codehaus.groovy.ast.ClassNode classNode,
                                                                                 org.codehaus.groovy.ast.ASTNode actionNode,
                                                                                 java.lang.String actionName,
                                                                                 org.codehaus.groovy.ast.Parameter[] actionParameters,
                                                                                 org.codehaus.groovy.control.SourceUnit source,
                                                                                 org.codehaus.groovy.classgen.GeneratorContext context)

initializeMethodParameter

protected void initializeMethodParameter(org.codehaus.groovy.ast.ClassNode classNode,
                                         org.codehaus.groovy.ast.stmt.BlockStatement wrapper,
                                         org.codehaus.groovy.ast.ASTNode actionNode,
                                         java.lang.String actionName,
                                         org.codehaus.groovy.ast.Parameter param,
                                         org.codehaus.groovy.control.SourceUnit source,
                                         org.codehaus.groovy.classgen.GeneratorContext context)

initializeAndValidateCommandObjectParameter

protected void initializeAndValidateCommandObjectParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper,
                                                           org.codehaus.groovy.ast.ClassNode controllerNode,
                                                           org.codehaus.groovy.ast.ClassNode commandObjectNode,
                                                           org.codehaus.groovy.ast.ASTNode actionNode,
                                                           java.lang.String actionName,
                                                           java.lang.String paramName,
                                                           org.codehaus.groovy.control.SourceUnit source,
                                                           org.codehaus.groovy.classgen.GeneratorContext context)

initializeCommandObjectParameter

protected void initializeCommandObjectParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper,
                                                org.codehaus.groovy.ast.ClassNode commandObjectNode,
                                                java.lang.String paramName,
                                                org.codehaus.groovy.control.SourceUnit source)

initializeStringParameter

protected void initializeStringParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper,
                                         org.codehaus.groovy.ast.Parameter param,
                                         java.lang.String requestParameterName)

initializePrimitiveOrTypeWrapperParameter

protected void initializePrimitiveOrTypeWrapperParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper,
                                                         org.codehaus.groovy.ast.Parameter param,
                                                         java.lang.String requestParameterName)

getRejectValueExpression

protected org.codehaus.groovy.ast.expr.Expression getRejectValueExpression(java.lang.String methodParamName)

performInjection

public void performInjection(org.codehaus.groovy.control.SourceUnit source,
                             org.codehaus.groovy.ast.ClassNode classNode)
Specified by:
performInjection in interface org.codehaus.groovy.grails.compiler.injection.ClassInjector

shouldInject

public boolean shouldInject(java.net.URL url)
Specified by:
shouldInject in interface org.codehaus.groovy.grails.compiler.injection.ClassInjector