From faf17d83d76cca487e410f5fde221e7c28ea6838 Mon Sep 17 00:00:00 2001 From: Jeff Scott Brown Date: Tue, 18 Nov 2014 09:49:47 -0600 Subject: [PATCH 1/2] Use GrailsASTUtils helper method We need to reorganize how some of this code works. Right now there are 2 entry points into ArtefactTypeAstTransformation. When triggered directly by the groovy compiler the visit method is invoked. When triggered by GlobalGrailsClassInjectorTransformation the static performInjection method is invoked. The visit method already has a check to see if the transformation has been applied and will quickly return if it has. A problem occurs if the GlobalGrailsClassInjectorTransformation is run after ArtefactTypeAstTransformation is run because the isApplied check doesn't happen when GlobalGrailsClassInjectorTransformation invokes performInjection. This change adds the isApplied check to performInjection and uses a different key (the injector class instead of the transformation class). --- .../ArtefactTypeAstTransformation.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java b/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java index 644bb8ebeb7..b6e67b6cc57 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java @@ -17,12 +17,6 @@ import grails.artefact.Artefact; import grails.build.logging.GrailsConsole; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - import grails.compiler.ast.AllArtefactClassInjector; import grails.compiler.ast.ClassInjector; import grails.compiler.ast.GlobalClassInjector; @@ -30,6 +24,11 @@ import grails.compiler.traits.TraitInjector; import groovy.transform.CompilationUnitAware; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotatedNode; import org.codehaus.groovy.ast.AnnotationNode; @@ -184,11 +183,8 @@ public static void doPerformInjectionOnArtefactType(SourceUnit sourceUnit, Class public static void performInjection(SourceUnit sourceUnit, ClassNode cNode, Collection injectors) { try { for (ClassInjector injector : injectors) { - final String injectorName = injector.getClass().getName(); - final String key = "Processed_by_" + injectorName; - final Object nodeMetaData = cNode.getNodeMetaData(key); - if(!Boolean.TRUE.equals(nodeMetaData)) { - cNode.setNodeMetaData(key, Boolean.TRUE); + if(!GrailsASTUtils.isApplied(cNode, injector.getClass())) { + GrailsASTUtils.markApplied(cNode, injector.getClass()); injector.performInjectionOnAnnotatedClass(sourceUnit, cNode); } } From 0ab55618b228101b211ed8b9051b3a5beebb698c Mon Sep 17 00:00:00 2001 From: Jeff Scott Brown Date: Mon, 24 Nov 2014 07:58:45 -0600 Subject: [PATCH 2/2] remove references to GrailsWebConfiguration I am not yet sure what role these config classes play but this change at least allows the build to succeed. Pending investigation. --- .../grails/boot/EmbeddedContainerWithGrailsSpec.groovy | 6 ++++-- .../groovy/grails/boot/GrailsSpringApplicationSpec.groovy | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/grails-web-boot/src/test/groovy/grails/boot/EmbeddedContainerWithGrailsSpec.groovy b/grails-web-boot/src/test/groovy/grails/boot/EmbeddedContainerWithGrailsSpec.groovy index 5a0c00a2b5d..387653b835e 100644 --- a/grails-web-boot/src/test/groovy/grails/boot/EmbeddedContainerWithGrailsSpec.groovy +++ b/grails-web-boot/src/test/groovy/grails/boot/EmbeddedContainerWithGrailsSpec.groovy @@ -1,13 +1,15 @@ package grails.boot import grails.artefact.Artefact -import grails.boot.config.GrailsWebConfiguration +import grails.boot.config.GrailsAutoConfiguration import grails.web.Controller + import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration + import spock.lang.Specification /** @@ -32,7 +34,7 @@ class EmbeddedContainerWithGrailsSpec extends Specification { } @Configuration - static class Application extends GrailsWebConfiguration { + static class Application extends GrailsAutoConfiguration { @Bean public EmbeddedServletContainerFactory containerFactory() { return new TomcatEmbeddedServletContainerFactory(0); diff --git a/grails-web-boot/src/test/groovy/grails/boot/GrailsSpringApplicationSpec.groovy b/grails-web-boot/src/test/groovy/grails/boot/GrailsSpringApplicationSpec.groovy index 7c7ca38e840..7805ef6fa8e 100644 --- a/grails-web-boot/src/test/groovy/grails/boot/GrailsSpringApplicationSpec.groovy +++ b/grails-web-boot/src/test/groovy/grails/boot/GrailsSpringApplicationSpec.groovy @@ -1,12 +1,14 @@ package grails.boot -import grails.boot.config.GrailsWebConfiguration +import grails.boot.config.GrailsAutoConfiguration + import org.springframework.boot.SpringApplication import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory import org.springframework.context.ConfigurableApplicationContext import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration + import spock.lang.Specification /** @@ -31,7 +33,7 @@ class GrailsSpringApplicationSpec extends Specification{ @Configuration - static class Application extends GrailsWebConfiguration { + static class Application extends GrailsAutoConfiguration { @Bean public EmbeddedServletContainerFactory containerFactory() { return new TomcatEmbeddedServletContainerFactory(0);