Class ControllerActionTransformer

  • All Implemented Interfaces:
    grails.compiler.ast.AnnotatedClassInjector, grails.compiler.ast.ClassInjector, grails.compiler.ast.GrailsArtefactClassInjector, groovy.transform.CompilationUnitAware

    public class ControllerActionTransformer
    extends java.lang.Object
    implements grails.compiler.ast.GrailsArtefactClassInjector, grails.compiler.ast.AnnotatedClassInjector, groovy.transform.CompilationUnitAware
    Enhances controller classes by converting closures actions to method actions and binding request parameters to action arguments.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      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.ClassNode controllerClassNode, org.codehaus.groovy.ast.Parameter[] parameters, org.codehaus.groovy.ast.MethodNode methodNode)  
      java.lang.String[] getArtefactTypes()  
      protected org.codehaus.groovy.ast.stmt.BlockStatement getCodeToHandleAllowedMethods​(org.codehaus.groovy.ast.ClassNode controllerClass, java.lang.String methodName)  
      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​(org.codehaus.groovy.ast.ClassNode classNode, 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.ClassNode classNode, org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.Parameter param, java.lang.String requestParameterName)  
      protected void initializeStringParameter​(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.Parameter param, java.lang.String requestParameterName)  
      protected boolean methodShouldBeConfiguredAsControllerAction​(org.codehaus.groovy.ast.MethodNode method)  
      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)  
      void setCompilationUnit​(org.codehaus.groovy.control.CompilationUnit compilationUnit)  
      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.ClassNode controllerClassNode, 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

      • DELEGATING_METHOD_ANNOATION

        public static final org.codehaus.groovy.ast.AnnotationNode DELEGATING_METHOD_ANNOATION
      • CONTROLLER_PATTERN

        public static java.util.regex.Pattern CONTROLLER_PATTERN
      • 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
      • CONVERT_CLOSURES_KEY

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

      • ControllerActionTransformer

        public ControllerActionTransformer()
    • Method Detail

      • getArtefactTypes

        public java.lang.String[] getArtefactTypes()
        Specified by:
        getArtefactTypes in interface grails.compiler.ast.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 grails.compiler.ast.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 grails.compiler.ast.AnnotatedClassInjector
      • performInjectionOnAnnotatedClass

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

        protected boolean methodShouldBeConfiguredAsControllerAction​(org.codehaus.groovy.ast.MethodNode method)
        Parameters:
        method - a potential controller action method
        Returns:
        true if the method should be configured as a controller action, false otherwise
      • getExceptionHandlerMethods

        protected java.util.Collection<org.codehaus.groovy.ast.MethodNode> getExceptionHandlerMethods​(org.codehaus.groovy.ast.ClassNode classNode,
                                                                                                      org.codehaus.groovy.control.SourceUnit sourceUnit)
      • 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.ClassNode controllerClassNode,
                                            org.codehaus.groovy.ast.Parameter[] parameters,
                                            org.codehaus.groovy.ast.MethodNode methodNode)
      • getCodeToHandleAllowedMethods

        protected org.codehaus.groovy.ast.stmt.BlockStatement getCodeToHandleAllowedMethods​(org.codehaus.groovy.ast.ClassNode controllerClass,
                                                                                            java.lang.String methodName)
      • wrapMethodBodyWithExceptionHandling

        protected void wrapMethodBodyWithExceptionHandling​(org.codehaus.groovy.ast.ClassNode controllerClassNode,
                                                           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.ClassNode classNode,
                                                 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.ClassNode classNode,
                                                                 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​(org.codehaus.groovy.ast.ClassNode classNode,
                                                                                   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 grails.compiler.ast.ClassInjector
      • shouldInject

        public boolean shouldInject​(java.net.URL url)
        Specified by:
        shouldInject in interface grails.compiler.ast.ClassInjector
      • setCompilationUnit

        public void setCompilationUnit​(org.codehaus.groovy.control.CompilationUnit compilationUnit)
        Specified by:
        setCompilationUnit in interface groovy.transform.CompilationUnitAware