diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/DependencyAutoConfigurationTransformation.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/DependencyAutoConfigurationTransformation.java new file mode 100644 index 00000000000..8d62ac5a3de --- /dev/null +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/DependencyAutoConfigurationTransformation.java @@ -0,0 +1,73 @@ +/* + * Copyright 2012-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.cli.compiler; + +import groovy.lang.GroovyClassLoader; + +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.ModuleNode; +import org.codehaus.groovy.control.SourceUnit; +import org.codehaus.groovy.transform.ASTTransformation; + +/** + * {@link ASTTransformation} to apply + * {@link CompilerAutoConfiguration#applyDependencies(DependencyCustomizer) dependency + * auto-configuration}. + * + * @author Phillip Webb + * @author Dave Syer + * @author Andy Wilkinson + */ +class DependencyAutoConfigurationTransformation implements ASTTransformation { + + private final GroovyClassLoader loader; + + private final ArtifactCoordinatesResolver coordinatesResolver; + + private final Iterable compilerAutoConfigurations; + + DependencyAutoConfigurationTransformation(GroovyClassLoader loader, + ArtifactCoordinatesResolver coordinatesResolver, + Iterable compilerAutoConfigurations) { + this.loader = loader; + this.coordinatesResolver = coordinatesResolver; + this.compilerAutoConfigurations = compilerAutoConfigurations; + + } + + @Override + public void visit(ASTNode[] nodes, SourceUnit source) { + for (ASTNode astNode : nodes) { + if (astNode instanceof ModuleNode) { + visitModule((ModuleNode) astNode); + } + } + } + + private void visitModule(ModuleNode module) { + DependencyCustomizer dependencies = new DependencyCustomizer(this.loader, module, + this.coordinatesResolver); + for (ClassNode classNode : module.getClasses()) { + for (CompilerAutoConfiguration autoConfiguration : this.compilerAutoConfigurations) { + if (autoConfiguration.matches(classNode)) { + autoConfiguration.applyDependencies(dependencies); + } + } + } + } +} diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/DependencyCustomizer.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/DependencyCustomizer.java index a7e652de7a9..e2b43d2884c 100644 --- a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/DependencyCustomizer.java +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/DependencyCustomizer.java @@ -41,17 +41,17 @@ public class DependencyCustomizer { private final ClassNode classNode; - private final ArtifactCoordinatesResolver artifactCoordinatesResolver; + private final ArtifactCoordinatesResolver coordinatesResolver; /** * Create a new {@link DependencyCustomizer} instance. * @param loader */ public DependencyCustomizer(GroovyClassLoader loader, ModuleNode moduleNode, - ArtifactCoordinatesResolver artifactCoordinatesResolver) { + ArtifactCoordinatesResolver coordinatesResolver) { this.loader = loader; this.classNode = moduleNode.getClasses().get(0); - this.artifactCoordinatesResolver = artifactCoordinatesResolver; + this.coordinatesResolver = coordinatesResolver; } /** @@ -61,7 +61,7 @@ public class DependencyCustomizer { protected DependencyCustomizer(DependencyCustomizer parent) { this.loader = parent.loader; this.classNode = parent.classNode; - this.artifactCoordinatesResolver = parent.artifactCoordinatesResolver; + this.coordinatesResolver = parent.coordinatesResolver; } public String getVersion(String artifactId) { @@ -70,7 +70,7 @@ public class DependencyCustomizer { } public String getVersion(String artifactId, String defaultVersion) { - String version = this.artifactCoordinatesResolver.getVersion(artifactId); + String version = this.coordinatesResolver.getVersion(artifactId); if (version == null) { version = defaultVersion; } @@ -184,8 +184,8 @@ public class DependencyCustomizer { * @return this {@link DependencyCustomizer} for continued use */ public DependencyCustomizer add(String module) { - return this.add(this.artifactCoordinatesResolver.getGroupId(module), module, - this.artifactCoordinatesResolver.getVersion(module), true); + return this.add(this.coordinatesResolver.getGroupId(module), module, + this.coordinatesResolver.getVersion(module), true); } /** @@ -198,8 +198,8 @@ public class DependencyCustomizer { * @return this {@link DependencyCustomizer} for continued use */ public DependencyCustomizer add(String module, boolean transitive) { - return this.add(this.artifactCoordinatesResolver.getGroupId(module), module, - this.artifactCoordinatesResolver.getVersion(module), transitive); + return this.add(this.coordinatesResolver.getGroupId(module), module, + this.coordinatesResolver.getVersion(module), transitive); } private DependencyCustomizer add(String group, String module, String version, diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/GroovyCompiler.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/GroovyCompiler.java index bc044682729..e55ffd6aa0f 100644 --- a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/GroovyCompiler.java +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/GroovyCompiler.java @@ -17,7 +17,6 @@ package org.springframework.boot.cli.compiler; import groovy.grape.GrapeEngine; -import groovy.lang.Grab; import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyClassLoader.ClassCollector; @@ -34,14 +33,7 @@ import java.util.List; import java.util.ServiceLoader; import org.codehaus.groovy.ast.ASTNode; -import org.codehaus.groovy.ast.AnnotatedNode; -import org.codehaus.groovy.ast.AnnotationNode; -import org.codehaus.groovy.ast.ClassCodeVisitorSupport; import org.codehaus.groovy.ast.ClassNode; -import org.codehaus.groovy.ast.ImportNode; -import org.codehaus.groovy.ast.ModuleNode; -import org.codehaus.groovy.ast.expr.ConstantExpression; -import org.codehaus.groovy.ast.expr.Expression; import org.codehaus.groovy.classgen.GeneratorContext; import org.codehaus.groovy.control.CompilationFailedException; import org.codehaus.groovy.control.CompilationUnit; @@ -66,6 +58,7 @@ import org.codehaus.groovy.transform.ASTTransformationVisitor; * *
  • Generated class files can also be loaded using * {@link ClassLoader#getResource(String)}
  • + * *