Improve imports and annotations model

This commit is contained in:
Stephane Nicoll
2017-10-27 11:43:27 +02:00
parent 9ada0dfb60
commit 9d7b2e95d6
4 changed files with 110 additions and 74 deletions
@@ -414,9 +414,7 @@ public class ProjectGenerator {
} }
model.put("isRelease", request.getBootVersion().contains("RELEASE")); model.put("isRelease", request.getBootVersion().contains("RELEASE"));
// @SpringBootApplication available as from 1.2.0.RC1 setupApplicationModel(request, model);
model.put("useSpringBootApplication", VERSION_1_2_0_RC1
.compareTo(Version.safeParse(request.getBootVersion())) <= 0);
// Gradle plugin has changed as from 1.3.0 // Gradle plugin has changed as from 1.3.0
model.put("bootOneThreeAvailable", VERSION_1_3_0_M1 model.put("bootOneThreeAvailable", VERSION_1_3_0_M1
@@ -483,34 +481,48 @@ public class ProjectGenerator {
return property.toStandardFormat(); return property.toStandardFormat();
} }
protected void setupTestModel(ProjectRequest request, Map<String, Object> model) { protected void setupApplicationModel(ProjectRequest request,
String imports = ""; Map<String, Object> model) {
String testAnnotations = ""; Imports imports = new Imports(request.getLanguage());
boolean newTestInfrastructure = isNewTestInfrastructureAvailable(request); Annotations annotations = new Annotations();
if (newTestInfrastructure) { boolean useSpringBootApplication = VERSION_1_2_0_RC1
imports += String.format( .compareTo(Version.safeParse(request.getBootVersion())) <= 0;
generateImport("org.springframework.boot.test.context.SpringBootTest", if (useSpringBootApplication) {
request.getLanguage()) + "%n"); imports.add("org.springframework.boot.autoconfigure.SpringBootApplication");
imports += String.format( annotations.add("@SpringBootApplication");
generateImport("org.springframework.test.context.junit4.SpringRunner",
request.getLanguage()) + "%n");
} }
else { else {
imports += String.format(generateImport( imports.add("org.springframework.boot.autoconfigure.EnableAutoConfiguration")
"org.springframework.boot.test.SpringApplicationConfiguration", .add("org.springframework.context.annotation.ComponentScan")
request.getLanguage()) + "%n"); .add("org.springframework.context.annotation.Configuration");
imports += String.format(generateImport( annotations.add("@EnableAutoConfiguration")
"org.springframework.test.context.junit4.SpringJUnit4ClassRunner", .add("@ComponentScan")
request.getLanguage()) + "%n"); .add("@Configuration");
}
model.put("applicationImports", imports.toString());
model.put("applicationAnnotations", annotations.toString());
}
protected void setupTestModel(ProjectRequest request, Map<String, Object> model) {
Imports imports = new Imports(request.getLanguage());
Annotations testAnnotations = new Annotations();
boolean newTestInfrastructure = isNewTestInfrastructureAvailable(request);
if (newTestInfrastructure) {
imports.add("org.springframework.boot.test.context.SpringBootTest")
.add("org.springframework.test.context.junit4.SpringRunner");
}
else {
imports.add("org.springframework.boot.test.SpringApplicationConfiguration")
.add("org.springframework.test.context.junit4.SpringJUnit4ClassRunner");
} }
if (request.hasWebFacet() && !newTestInfrastructure) { if (request.hasWebFacet() && !newTestInfrastructure) {
imports += String.format(generateImport( imports.add("org.springframework.test.context.web.WebAppConfiguration");
"org.springframework.test.context.web.WebAppConfiguration", testAnnotations.add("@WebAppConfiguration");
request.getLanguage()) + "%n");
testAnnotations = String.format("@WebAppConfiguration%n");
} }
model.put("testImports", imports); model.put("testImports", imports.withFinalCarriageReturn().toString());
model.put("testAnnotations", testAnnotations); model.put("testAnnotations", testAnnotations.withFinalCarriageReturn().toString());
} }
protected String getServletInitializrClass(ProjectRequest request) { protected String getServletInitializrClass(ProjectRequest request) {
@@ -526,11 +538,17 @@ public class ProjectGenerator {
} }
} }
protected String addImport(String type, String language) {
return String.format("%s%n", generateImport(type, language));
}
protected String generateImport(String type, String language) { protected String generateImport(String type, String language) {
String end = ("groovy".equals(language) || "kotlin".equals(language)) ? "" : ";"; String end = ("groovy".equals(language) || "kotlin".equals(language)) ? "" : ";";
return "import " + type + end; return "import " + type + end;
} }
private static boolean isGradleBuild(ProjectRequest request) { private static boolean isGradleBuild(ProjectRequest request) {
return "gradle".equals(request.getBuild()); return "gradle".equals(request.getBuild());
} }
@@ -661,4 +679,64 @@ public class ProjectGenerator {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private static class Imports {
private final List<String> statements = new ArrayList<>();
private final String language;
private boolean finalCarriageReturn;
public Imports(String language) {
this.language = language;
}
public Imports add(String type) {
this.statements.add(generateImport(type, language));
return this;
}
public Imports withFinalCarriageReturn() {
this.finalCarriageReturn = true;
return this;
}
private String generateImport(String type, String language) {
String end = ("groovy".equals(language) || "kotlin".equals(language)) ? "" : ";";
return "import " + type + end;
}
public String toString() {
if (this.statements.isEmpty()) {
return "";
}
String content = String.join(String.format("%n"), this.statements);
return (finalCarriageReturn ? String.format("%s%n", content) : content);
}
}
private static class Annotations {
private final List<String> statements = new ArrayList<>();
private boolean finalCarriageReturn;
public Annotations add(String type) {
this.statements.add(type);
return this;
}
public Annotations withFinalCarriageReturn() {
this.finalCarriageReturn = true;
return this;
}
public String toString() {
if (this.statements.isEmpty()) {
return "";
}
String content = String.join(String.format("%n"), this.statements);
return (finalCarriageReturn ? String.format("%s%n", content) : content);
}
}
} }
@@ -1,23 +1,9 @@
package {{packageName}} package {{packageName}}
import org.springframework.boot.SpringApplication import org.springframework.boot.SpringApplication
{{#useSpringBootApplication}} {{applicationImports}}
import org.springframework.boot.autoconfigure.SpringBootApplication
{{/useSpringBootApplication}}
{{^useSpringBootApplication}}
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
{{/useSpringBootApplication}}
{{#useSpringBootApplication}} {{applicationAnnotations}}
@SpringBootApplication
{{/useSpringBootApplication}}
{{^useSpringBootApplication}}
@Configuration
@ComponentScan
@EnableAutoConfiguration
{{/useSpringBootApplication}}
class {{applicationName}} { class {{applicationName}} {
static void main(String[] args) { static void main(String[] args) {
@@ -1,23 +1,9 @@
package {{packageName}}; package {{packageName}};
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
{{#useSpringBootApplication}} {{applicationImports}}
import org.springframework.boot.autoconfigure.SpringBootApplication;
{{/useSpringBootApplication}}
{{^useSpringBootApplication}}
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
{{/useSpringBootApplication}}
{{#useSpringBootApplication}} {{applicationAnnotations}}
@SpringBootApplication
{{/useSpringBootApplication}}
{{^useSpringBootApplication}}
@Configuration
@ComponentScan
@EnableAutoConfiguration
{{/useSpringBootApplication}}
public class {{applicationName}} { public class {{applicationName}} {
public static void main(String[] args) { public static void main(String[] args) {
@@ -1,23 +1,9 @@
package {{packageName}} package {{packageName}}
import org.springframework.boot.SpringApplication import org.springframework.boot.SpringApplication
{{#useSpringBootApplication}} {{applicationImports}}
import org.springframework.boot.autoconfigure.SpringBootApplication
{{/useSpringBootApplication}}
{{^useSpringBootApplication}}
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
{{/useSpringBootApplication}}
{{#useSpringBootApplication}} {{applicationAnnotations}}
@SpringBootApplication
{{/useSpringBootApplication}}
{{^useSpringBootApplication}}
@Configuration
@ComponentScan
@EnableAutoConfiguration
{{/useSpringBootApplication}}
class {{applicationName}} class {{applicationName}}
fun main(args: Array<String>) { fun main(args: Array<String>) {