Skip to content

Commit 8cca291

Browse files
committed
cli: code cleanup
1 parent fee6362 commit 8cca291

File tree

5 files changed

+115
-88
lines changed

5 files changed

+115
-88
lines changed

modules/jooby-cli/src/main/java/io/jooby/cli/CommandContext.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
import com.github.jknack.handlebars.io.TemplateLoader;
1111
import org.jline.reader.LineReader;
1212

13+
import java.io.IOException;
1314
import java.io.PrintWriter;
15+
import java.io.Writer;
16+
import java.nio.file.Files;
17+
import java.nio.file.Path;
1418

1519
public class CommandContext {
1620

@@ -31,4 +35,18 @@ public CommandContext(LineReader reader) {
3135
public void exit(int code) {
3236
System.exit(code);
3337
}
38+
39+
public void writeTemplate(String template, Object model, Path file) throws IOException {
40+
Path parent = file.getParent();
41+
if (!Files.exists(parent)) {
42+
Files.createDirectories(parent);
43+
}
44+
try (PrintWriter writer = new PrintWriter(file.toFile())) {
45+
writeTemplate(template, model, writer);
46+
}
47+
}
48+
49+
public void writeTemplate(String template, Object model, Writer writer) throws IOException {
50+
templates.compile(template).apply(model, writer);
51+
}
3452
}

modules/jooby-cli/src/main/java/io/jooby/cli/CreateApp.java

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,23 @@
55
*/
66
package io.jooby.cli;
77

8-
import io.jooby.SneakyThrows;
98
import picocli.CommandLine;
109

1110
import java.io.IOException;
1211
import java.io.InputStream;
13-
import java.io.PrintWriter;
1412
import java.nio.file.Files;
1513
import java.nio.file.Path;
1614
import java.nio.file.Paths;
1715
import java.nio.file.attribute.PosixFilePermission;
16+
import java.util.ArrayList;
1817
import java.util.Collections;
1918
import java.util.EnumSet;
2019
import java.util.HashMap;
20+
import java.util.List;
2121
import java.util.Map;
2222
import java.util.Set;
2323
import java.util.stream.Stream;
2424

25-
import static java.nio.file.attribute.PosixFilePermission.GROUP_EXECUTE;
26-
import static java.nio.file.attribute.PosixFilePermission.OWNER_EXECUTE;
27-
import static java.util.Collections.singleton;
28-
2925
@CommandLine.Command(name = "create", description = "Creates a new application")
3026
public class CreateApp extends Command implements Runnable {
3127
@CommandLine.Parameters
@@ -63,17 +59,15 @@ public class CreateApp extends Command implements Runnable {
6359
model.put("joobyVersion", new VersionProvider().getVersion()[0]);
6460
model.put("server", "netty");
6561
model.put("kotlin", kotlin);
62+
model.put("dependencies", dependencies("netty", kotlin));
63+
model.put("testDependencies", testDependencies(kotlin));
6664

67-
withWriter(projectDir.resolve(buildFileName),
68-
writer -> ctx.templates.compile(templateName).apply(model, writer));
65+
ctx.writeTemplate(templateName, model, projectDir.resolve(buildFileName));
6966

7067
// Copy conf
7168
Path confDir = projectDir.resolve("conf");
72-
Files.createDirectory(confDir);
73-
withInputStream("/cli/conf/application.conf",
74-
in -> Files.copy(in, confDir.resolve("application.conf")));
75-
withInputStream("/cli/conf/logback.xml",
76-
in -> Files.copy(in, confDir.resolve("logback.xml")));
69+
copyResource("/cli/conf/application.conf", confDir.resolve("application.conf"));
70+
copyResource("/cli/conf/logback.xml", confDir.resolve("logback.xml"));
7771

7872
if (gradle) {
7973
gradleWrapper(ctx, projectDir, model);
@@ -85,42 +79,35 @@ public class CreateApp extends Command implements Runnable {
8579
Path packagePath = Stream.of(packageName.split("\\."))
8680
.reduce(javaPath, Path::resolve, Path::resolve);
8781

88-
Files.createDirectories(packagePath);
89-
withWriter(packagePath.resolve("App." + extension),
90-
writer -> ctx.templates.compile("App." + extension).apply(model, writer));
82+
ctx.writeTemplate("App." + extension, model, packagePath.resolve("App." + extension));
9183

9284
/** Test directories: */
9385
Path testPath = projectDir.resolve("src").resolve("test");
9486
Path testJavaPath = testPath.resolve(language);
9587
Path testPackagePath = Stream.of(packageName.split("\\."))
9688
.reduce(testJavaPath, Path::resolve, Path::resolve);
97-
Files.createDirectories(testPackagePath);
98-
withWriter(testPackagePath.resolve("UnitTest." + extension),
99-
writer -> ctx.templates.compile("UnitTest." + extension).apply(model, writer));
100-
withWriter(testPackagePath.resolve("IntegrationTest." + extension),
101-
writer -> ctx.templates.compile("IntegrationTest." + extension).apply(model, writer));
89+
90+
ctx.writeTemplate("UnitTest." + extension, model,
91+
testPackagePath.resolve("UnitTest." + extension));
92+
ctx.writeTemplate("IntegrationTest." + extension, model,
93+
testPackagePath.resolve("IntegrationTest." + extension));
10294
}
10395

10496
private void gradleWrapper(CommandContext ctx, Path projectDir, Map<String, Object> model)
10597
throws IOException {
10698
Path wrapperDir = projectDir.resolve("gradle").resolve("wrapper");
10799
Files.createDirectories(wrapperDir);
108100

109-
withWriter(projectDir.resolve("settings.gradle"),
110-
w -> ctx.templates.compile("gradle/settings.gradle").apply(model, w));
111-
withInputStream("/cli/gradle/gradlew", in -> {
112-
Path gradlew = projectDir.resolve("gradlew");
113-
Files.copy(in, gradlew);
114-
Set<PosixFilePermission> permissions = EnumSet.allOf(PosixFilePermission.class);
115-
Files.setPosixFilePermissions(gradlew, permissions);
116-
});
117-
withInputStream("/cli/gradle/gradlew.bat",
118-
in -> Files.copy(in, projectDir.resolve("gradlew.bat")));
119-
120-
withInputStream("/cli/gradle/gradle/wrapper/gradle-wrapper.jar",
121-
in -> Files.copy(in, wrapperDir.resolve("gradle-wrapper.jar")));
122-
withInputStream("/cli/gradle/gradle/wrapper/gradle-wrapper.properties",
123-
in -> Files.copy(in, wrapperDir.resolve("gradle-wrapper.properties")));
101+
ctx.writeTemplate("gradle/settings.gradle", model, projectDir.resolve("settings.gradle"));
102+
copyResource("/cli/gradle/gradlew", projectDir.resolve("gradlew"),
103+
EnumSet.allOf(PosixFilePermission.class));
104+
105+
copyResource("/cli/gradle/gradlew.bat", projectDir.resolve("gradlew.bat"));
106+
107+
copyResource("/cli/gradle/gradle/wrapper/gradle-wrapper.jar",
108+
wrapperDir.resolve("gradle-wrapper.jar"));
109+
copyResource("/cli/gradle/gradle/wrapper/gradle-wrapper.properties",
110+
wrapperDir.resolve("gradle-wrapper.properties"));
124111
}
125112

126113
private void debug(CommandContext ctx) {
@@ -139,18 +126,41 @@ private void debug(CommandContext ctx) {
139126
ctx.out.println(buffer.toString());
140127
}
141128

142-
private void withInputStream(String resource, SneakyThrows.Consumer<InputStream> consumer)
129+
private void copyResource(String source, Path dest) throws IOException {
130+
copyResource(source, dest, Collections.emptySet());
131+
}
132+
133+
private void copyResource(String source, Path dest, Set<PosixFilePermission> permissions)
143134
throws IOException {
144-
try (InputStream in = getClass().getResourceAsStream(resource)) {
145-
consumer.accept(in);
135+
Path parent = dest.getParent();
136+
if (!Files.exists(parent)) {
137+
Files.createDirectories(parent);
138+
}
139+
try (InputStream in = getClass().getResourceAsStream(source)) {
140+
Files.copy(in, dest);
141+
}
142+
143+
if (permissions.size() > 0) {
144+
Files.setPosixFilePermissions(dest, permissions);
146145
}
147146
}
148147

149-
private void withWriter(Path file, SneakyThrows.Consumer<PrintWriter> consumer)
150-
throws IOException {
151-
try (PrintWriter writer = new PrintWriter(file.toFile(), "UTF-8")) {
152-
consumer.accept(writer);
153-
writer.flush();
148+
private List<Dependency> dependencies(String server, boolean kotlin) {
149+
List<Dependency> dependencies = new ArrayList<>();
150+
dependencies.add(new Dependency("io.jooby", "jooby-" + server));
151+
if (kotlin) {
152+
dependencies.add(new Dependency("org.jetbrains.kotlin", "kotlin-stdlib-jdk8"));
154153
}
154+
dependencies.add(new Dependency("ch.qos.logback", "logback-classic"));
155+
return dependencies;
156+
}
157+
158+
private List<Dependency> testDependencies(boolean kotlin) {
159+
List<Dependency> dependencies = new ArrayList<>();
160+
dependencies.add(new Dependency("org.junit.jupiter", "junit-jupiter-api"));
161+
dependencies.add(new Dependency("org.junit.jupiter", "junit-jupiter-engine"));
162+
dependencies.add(new Dependency("io.jooby", "jooby-test"));
163+
dependencies.add(new Dependency("com.squareup.okhttp3", "okhttp"));
164+
return dependencies;
155165
}
156166
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.jooby.cli;
2+
3+
public class Dependency {
4+
private String groupId;
5+
6+
private String artifactId;
7+
8+
public Dependency(String groupId, String artifactId) {
9+
this.groupId = groupId;
10+
this.artifactId = artifactId;
11+
}
12+
13+
public String getGroupId() {
14+
return groupId;
15+
}
16+
17+
public String getArtifactId() {
18+
return artifactId;
19+
}
20+
21+
@Override public String toString() {
22+
return groupId + ":" + artifactId;
23+
}
24+
}

modules/jooby-cli/src/main/resources/cli/build.gradle.hbs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,24 @@ dependencyManagement {
4242
}
4343

4444
dependencies {
45-
compile "io.jooby:jooby-{{server}}"
46-
compile "ch.qos.logback:logback-classic"
45+
{{#each dependencies}}
46+
compile "{{this}}"
47+
{{/each}}
4748

48-
testImplementation "org.junit.jupiter:junit-jupiter-api"
49-
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
50-
testCompile "io.jooby:jooby-test"
51-
testCompile "com.squareup.okhttp3:okhttp"
49+
{{#each testDependencies}}
50+
testCompile "{{this}}"
51+
{{/each}}
5252
}
5353

5454
test {
5555
useJUnitPlatform()
5656
}
5757

58-
{{#if koltin}}
58+
{{#if kotlin}}
59+
/** Kotlin debug information: */
60+
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
61+
kotlinOptions.javaParameters = true
62+
}
5963
{{else}}
6064
/** Java debug information: */
6165
tasks.withType(JavaCompile) {

modules/jooby-cli/src/main/resources/cli/maven.hbs

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
<jooby.version>{{joobyVersion}}</jooby.version>
1919

2020
{{#if kotlin}}
21-
<kotlin.version>1.3.41</kotlin.version>
2221
<kotlin.compiler.incremental>true</kotlin.compiler.incremental>
23-
2422
{{/if}}
2523
<maven.compiler.source>1.8</maven.compiler.source>
2624
<maven.compiler.target>1.8</maven.compiler.target>
@@ -29,49 +27,22 @@
2927
</properties>
3028

3129
<dependencies>
32-
<!-- Server -->
30+
{{#each dependencies}}
3331
<dependency>
34-
<groupId>io.jooby</groupId>
35-
<artifactId>jooby-{{server}}</artifactId>
36-
</dependency>
37-
38-
{{#if kotlin}}
39-
<dependency>
40-
<groupId>org.jetbrains.kotlin</groupId>
41-
<artifactId>kotlin-stdlib-jdk8</artifactId>
42-
<version>${kotlin.version}</version>
43-
</dependency>
44-
45-
{{/if}}
46-
<!-- logging -->
47-
<dependency>
48-
<groupId>ch.qos.logback</groupId>
49-
<artifactId>logback-classic</artifactId>
32+
<groupId>{{groupId}}</groupId>
33+
<artifactId>{{artifactId}}</artifactId>
5034
</dependency>
5135

36+
{{/each}}
5237
<!-- Tests -->
38+
{{#each testDependencies}}
5339
<dependency>
54-
<groupId>org.junit.jupiter</groupId>
55-
<artifactId>junit-jupiter-api</artifactId>
56-
<scope>test</scope>
57-
</dependency>
58-
59-
<dependency>
60-
<groupId>org.junit.jupiter</groupId>
61-
<artifactId>junit-jupiter-engine</artifactId>
40+
<groupId>{{groupId}}</groupId>
41+
<artifactId>{{artifactId}}</artifactId>
6242
<scope>test</scope>
6343
</dependency>
6444

65-
<dependency>
66-
<groupId>io.jooby</groupId>
67-
<artifactId>jooby-test</artifactId>
68-
</dependency>
69-
70-
<dependency>
71-
<groupId>com.squareup.okhttp3</groupId>
72-
<artifactId>okhttp</artifactId>
73-
<scope>test</scope>
74-
</dependency>
45+
{{/each}}
7546
</dependencies>
7647

7748
<build>

0 commit comments

Comments
 (0)