55 */
66package io .jooby .cli ;
77
8- import io .jooby .SneakyThrows ;
98import picocli .CommandLine ;
109
1110import java .io .IOException ;
1211import java .io .InputStream ;
13- import java .io .PrintWriter ;
1412import java .nio .file .Files ;
1513import java .nio .file .Path ;
1614import java .nio .file .Paths ;
1715import java .nio .file .attribute .PosixFilePermission ;
16+ import java .util .ArrayList ;
1817import java .util .Collections ;
1918import java .util .EnumSet ;
2019import java .util .HashMap ;
20+ import java .util .List ;
2121import java .util .Map ;
2222import java .util .Set ;
2323import 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" )
3026public 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}
0 commit comments