Package org.grails.compiler.injection
Class AbstractGrailsArtefactTransformer
- java.lang.Object
-
- org.grails.compiler.injection.AbstractGrailsArtefactTransformer
-
- All Implemented Interfaces:
AnnotatedClassInjector,ClassInjector,GrailsArtefactClassInjector,java.lang.Comparable
public abstract class AbstractGrailsArtefactTransformer extends java.lang.Object implements GrailsArtefactClassInjector, AnnotatedClassInjector, java.lang.Comparable
Abstract transformer that takes an implementation class and creates methods in a target ClassNode that delegate to that implementation class. Subclasses should override to provide the implementation class details- Since:
- 2.0
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.StringCURRENT_PREFIXstatic java.lang.StringMETHOD_MISSING_METHOD_NAMEprotected static org.codehaus.groovy.ast.ClassNodeOBJECT_CLASSstatic intPUBLIC_STATIC_MODIFIERstatic java.lang.StringSTATIC_METHOD_MISSING_METHOD_NAME-
Fields inherited from interface grails.compiler.ast.ClassInjector
PRIVATE_STATIC_MODIFIER
-
Fields inherited from interface grails.compiler.ast.GrailsArtefactClassInjector
EMPTY_CLASS_ARRAY, ZERO_ARGS, ZERO_PARAMETERS
-
-
Constructor Summary
Constructors Constructor Description AbstractGrailsArtefactTransformer()
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected voidaddApiLookupFieldAndSetter(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.ClassNode implementationNode, java.lang.String apiProperty, org.codehaus.groovy.ast.expr.Expression initialValueExpression)protected voidaddDelegateInstanceMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.expr.Expression delegate, org.codehaus.groovy.ast.MethodNode declaredMethod, org.codehaus.groovy.ast.AnnotationNode markerAnnotation, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders)protected voidaddDelegateStaticMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.expr.MethodCallExpression apiLookupMethod, org.codehaus.groovy.ast.MethodNode declaredMethod, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders)protected voidaddEnhancedAnnotation(org.codehaus.groovy.ast.ClassNode classNode)static voidaddToTransformedClasses(java.lang.String name)voidclearCachedState()intcompareTo(java.lang.Object o)Used for ordering not equality.protected java.lang.StringgetArtefactType()java.lang.String[]getArtefactTypes()abstract java.lang.ClassgetInstanceImplementation()The class that provides the implementation of all instance methods and propertiesprotected org.codehaus.groovy.ast.AnnotationNodegetMarkerAnnotation()A marker annotation to be applied to added methods, defaults to nullabstract java.lang.ClassgetStaticImplementation()The class that provides static methodsstatic java.util.Collection<java.lang.String>getTransformedClassNames()protected booleanhasArtefactAnnotation(org.codehaus.groovy.ast.ClassNode classNode)protected booleanisCandidateInstanceMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)protected booleanisStaticCandidateMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)protected booleanisStaticMethodExcluded(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)protected booleanisStaticMethodIncluded(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)protected booleanisValidArtefactType()protected booleanisValidTargetClassNode(org.codehaus.groovy.ast.ClassNode classNode)voidperformInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)Handles injection of properties, methods etc.voidperformInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)Handles injection of properties, methods etc.protected voidperformInjectionInternal(java.lang.String apiInstanceProperty, org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)Subclasses can override to provide additional transformationvoidperformInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)Handles injection of properties, methods etc.voidperformInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)Performs injection on an annotated entityprotected voidperformInstanceImplementationInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders, java.lang.Class instanceImplementation)protected voidperformStaticImplementationInjection(org.codehaus.groovy.ast.ClassNode classNode, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders, java.lang.Class staticImplementation)protected org.codehaus.groovy.ast.MethodNodepopulateAutowiredApiLookupMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.ClassNode implementationNode, java.lang.String apiProperty, java.lang.String methodName, org.codehaus.groovy.ast.stmt.BlockStatement methodBody)protected org.codehaus.groovy.ast.MethodNodepopulateDefaultApiLookupMethod(org.codehaus.groovy.ast.ClassNode implementationNode, java.lang.String apiInstanceProperty, java.lang.String methodName, org.codehaus.groovy.ast.stmt.BlockStatement methodBody)protected booleanrequiresAutowiring()If the API requires autowiring then a @Autowired property will be added.protected booleanrequiresStaticLookupMethod()Subclasses should override in the instance API requires a static lookup method instead of autowiring.protected java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode>resolveGenericsPlaceHolders(org.codehaus.groovy.ast.ClassNode classNode)protected booleanshouldSkipInjection(org.codehaus.groovy.ast.ClassNode classNode)-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface grails.compiler.ast.ClassInjector
shouldInject
-
-
-
-
Field Detail
-
OBJECT_CLASS
protected static final org.codehaus.groovy.ast.ClassNode OBJECT_CLASS
-
PUBLIC_STATIC_MODIFIER
public static final int PUBLIC_STATIC_MODIFIER
- See Also:
- Constant Field Values
-
CURRENT_PREFIX
public static final java.lang.String CURRENT_PREFIX
- See Also:
- Constant Field Values
-
METHOD_MISSING_METHOD_NAME
public static final java.lang.String METHOD_MISSING_METHOD_NAME
- See Also:
- Constant Field Values
-
STATIC_METHOD_MISSING_METHOD_NAME
public static final java.lang.String STATIC_METHOD_MISSING_METHOD_NAME
- See Also:
- Constant Field Values
-
-
Method Detail
-
getArtefactTypes
public java.lang.String[] getArtefactTypes()
- Specified by:
getArtefactTypesin interfaceGrailsArtefactClassInjector
-
getArtefactType
protected java.lang.String getArtefactType()
-
clearCachedState
public void clearCachedState()
-
compareTo
public int compareTo(java.lang.Object o)
Used for ordering not equality. Note: this class has a natural ordering that is inconsistent with equals.- Specified by:
compareToin interfacejava.lang.Comparable- See Also:
Comparable.compareTo(Object)
-
performInjection
public void performInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)Description copied from interface:ClassInjectorHandles injection of properties, methods etc. into a class.- Specified by:
performInjectionin interfaceClassInjector- Parameters:
source- The source unitcontext- The generator contextclassNode- The ClassNode instance
-
performInjectionOnAnnotatedClass
public void performInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)Description copied from interface:ClassInjectorHandles injection of properties, methods etc. into a class.- Specified by:
performInjectionOnAnnotatedClassin interfaceClassInjector- Parameters:
source- The source unitclassNode- The ClassNode instance
-
performInjectionOnAnnotatedClass
public void performInjectionOnAnnotatedClass(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.classgen.GeneratorContext context, org.codehaus.groovy.ast.ClassNode classNode)Description copied from interface:AnnotatedClassInjectorPerforms injection on an annotated entity- Specified by:
performInjectionOnAnnotatedClassin interfaceAnnotatedClassInjector- Parameters:
source- The source unitclassNode- The class node
-
performInstanceImplementationInjection
protected void performInstanceImplementationInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders, java.lang.Class instanceImplementation)
-
performStaticImplementationInjection
protected void performStaticImplementationInjection(org.codehaus.groovy.ast.ClassNode classNode, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders, java.lang.Class staticImplementation)
-
addEnhancedAnnotation
protected void addEnhancedAnnotation(org.codehaus.groovy.ast.ClassNode classNode)
-
shouldSkipInjection
protected boolean shouldSkipInjection(org.codehaus.groovy.ast.ClassNode classNode)
-
hasArtefactAnnotation
protected boolean hasArtefactAnnotation(org.codehaus.groovy.ast.ClassNode classNode)
-
isValidTargetClassNode
protected boolean isValidTargetClassNode(org.codehaus.groovy.ast.ClassNode classNode)
-
isValidArtefactType
protected boolean isValidArtefactType()
-
resolveGenericsPlaceHolders
protected java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> resolveGenericsPlaceHolders(org.codehaus.groovy.ast.ClassNode classNode)
-
addDelegateInstanceMethod
protected void addDelegateInstanceMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.expr.Expression delegate, org.codehaus.groovy.ast.MethodNode declaredMethod, org.codehaus.groovy.ast.AnnotationNode markerAnnotation, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders)
-
addDelegateStaticMethod
protected void addDelegateStaticMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.expr.MethodCallExpression apiLookupMethod, org.codehaus.groovy.ast.MethodNode declaredMethod, java.util.Map<java.lang.String,org.codehaus.groovy.ast.ClassNode> genericsPlaceholders)
-
isCandidateInstanceMethod
protected boolean isCandidateInstanceMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)
-
isStaticCandidateMethod
protected boolean isStaticCandidateMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)
-
isStaticMethodExcluded
protected boolean isStaticMethodExcluded(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)
-
isStaticMethodIncluded
protected boolean isStaticMethodIncluded(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.MethodNode declaredMethod)
-
requiresStaticLookupMethod
protected boolean requiresStaticLookupMethod()
Subclasses should override in the instance API requires a static lookup method instead of autowiring. Defaults to false.- Returns:
- Whether a static lookup method is used for the instance API
-
populateAutowiredApiLookupMethod
protected org.codehaus.groovy.ast.MethodNode populateAutowiredApiLookupMethod(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.ClassNode implementationNode, java.lang.String apiProperty, java.lang.String methodName, org.codehaus.groovy.ast.stmt.BlockStatement methodBody)
-
addApiLookupFieldAndSetter
protected void addApiLookupFieldAndSetter(org.codehaus.groovy.ast.ClassNode classNode, org.codehaus.groovy.ast.ClassNode implementationNode, java.lang.String apiProperty, org.codehaus.groovy.ast.expr.Expression initialValueExpression)
-
populateDefaultApiLookupMethod
protected org.codehaus.groovy.ast.MethodNode populateDefaultApiLookupMethod(org.codehaus.groovy.ast.ClassNode implementationNode, java.lang.String apiInstanceProperty, java.lang.String methodName, org.codehaus.groovy.ast.stmt.BlockStatement methodBody)
-
requiresAutowiring
protected boolean requiresAutowiring()
If the API requires autowiring then a @Autowired property will be added. If not a private field that instantiates the API will be crated. Defaults to true.- Returns:
- Whether autowiring is required
-
performInjectionInternal
protected void performInjectionInternal(java.lang.String apiInstanceProperty, org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)Subclasses can override to provide additional transformation- Parameters:
apiInstanceProperty-source- The sourceclassNode- The class node
-
getInstanceImplementation
public abstract java.lang.Class getInstanceImplementation()
The class that provides the implementation of all instance methods and properties- Returns:
- A class whose methods contain a first argument of type object that is the instance
-
getStaticImplementation
public abstract java.lang.Class getStaticImplementation()
The class that provides static methods- Returns:
- A class or null if non is provided
-
performInjection
public void performInjection(org.codehaus.groovy.control.SourceUnit source, org.codehaus.groovy.ast.ClassNode classNode)Description copied from interface:ClassInjectorHandles injection of properties, methods etc. into a class.- Specified by:
performInjectionin interfaceClassInjector- Parameters:
source- The source unitclassNode- The ClassNode instance
-
getMarkerAnnotation
protected org.codehaus.groovy.ast.AnnotationNode getMarkerAnnotation()
A marker annotation to be applied to added methods, defaults to null- Returns:
- The annotation node
-
getTransformedClassNames
public static java.util.Collection<java.lang.String> getTransformedClassNames()
-
addToTransformedClasses
public static void addToTransformedClasses(java.lang.String name)
-
-