Package org.grails.compiler.web
Class ControllerActionTransformer
- java.lang.Object
-
- org.grails.compiler.web.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.CompilationUnitAwareEnhances controller classes by converting closures actions to method actions and binding request parameters to action arguments.
-
-
Field Summary
Fields Modifier and Type Field Description static org.codehaus.groovy.ast.AnnotationNodeACTION_ANNOTATION_NODEstatic java.util.regex.PatternCONTROLLER_PATTERNstatic java.lang.StringCONVERT_CLOSURES_KEYstatic org.codehaus.groovy.ast.AnnotationNodeDELEGATING_METHOD_ANNOATIONstatic java.lang.StringEXCEPTION_HANDLER_META_DATA_FIELD_NAMEstatic java.lang.StringVOID_TYPE
-
Constructor Summary
Constructors Constructor Description ControllerActionTransformer()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidaddMethodToInvokeClosure(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 voidannotateActionMethod(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.BlockStatementgetCodeToHandleAllowedMethods(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.ExpressiongetRejectValueExpression(org.codehaus.groovy.ast.ClassNode classNode, java.lang.String methodParamName)protected org.codehaus.groovy.ast.stmt.BlockStatementinitializeActionParameters(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 voidinitializeAndValidateCommandObjectParameter(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 voidinitializeCommandObjectParameter(org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.ClassNode commandObjectNode, java.lang.String paramName, org.codehaus.groovy.control.SourceUnit source)protected voidinitializeMethodParameter(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 voidinitializePrimitiveOrTypeWrapperParameter(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.Parameter param, java.lang.String requestParameterName)protected voidinitializeStringParameter(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.stmt.BlockStatement wrapper, org.codehaus.groovy.ast.Parameter param, java.lang.String requestParameterName)protected booleanmethodShouldBeConfiguredAsControllerAction(org.codehaus.groovy.ast.MethodNode method)voidperformInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)voidperformInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)voidperformInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)voidperformInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)voidsetCompilationUnit(org.codehaus.groovy.control.CompilationUnit compilationUnit)booleanshouldInject(java.net.URL url)protected voidtransformClosureToMethod(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 voidwrapMethodBodyWithExceptionHandling(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:
-
-
-
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
-
VOID_TYPE
public static final java.lang.String VOID_TYPE
- See Also:
- Constant Field Values
-
CONVERT_CLOSURES_KEY
public static final java.lang.String CONVERT_CLOSURES_KEY
- See Also:
- Constant Field Values
-
-
Method Detail
-
getArtefactTypes
public java.lang.String[] getArtefactTypes()
- Specified by:
getArtefactTypesin interfacegrails.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:
performInjectionin interfacegrails.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:
performInjectionOnAnnotatedClassin interfacegrails.compiler.ast.AnnotatedClassInjector
-
performInjectionOnAnnotatedClass
public void performInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)- Specified by:
performInjectionOnAnnotatedClassin interfacegrails.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:
performInjectionin interfacegrails.compiler.ast.ClassInjector
-
shouldInject
public boolean shouldInject(java.net.URL url)
- Specified by:
shouldInjectin interfacegrails.compiler.ast.ClassInjector
-
setCompilationUnit
public void setCompilationUnit(org.codehaus.groovy.control.CompilationUnit compilationUnit)
- Specified by:
setCompilationUnitin interfacegroovy.transform.CompilationUnitAware
-
-