diff --git a/pom.xml b/pom.xml
index 28be0da..9a813da 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,16 @@
javalin
3.10.1
+
+ org.apache.commons
+ commons-compress
+ 1.20
+
+
+ org.koin
+ koin-core
+ 2.1.6
+
diff --git a/src/main/kotlin/starter/KotlinStarter.kt b/src/main/kotlin/starter/KotlinStarter.kt
index 34f23fd..9b3c774 100644
--- a/src/main/kotlin/starter/KotlinStarter.kt
+++ b/src/main/kotlin/starter/KotlinStarter.kt
@@ -1,8 +1,21 @@
package starter
+import org.koin.core.context.startKoin
+import org.koin.dsl.module
+
+val module = module {
+ single { Config().load() }
+ single { PebbleModule().engine() }
+ single { Server(get(), get(), get()) }
+ single { Templates(get()) }
+ single { Views(get()) }
+ single { ProjectZip(get()) }
+}
+
fun main() {
- val config = Config()
- val loaded = config.load()
- val server = Server(Views(PebbleModule().engine()),loaded)
+ val koin = startKoin {
+ modules(module)
+ }.koin
+ val server = koin.get()
server.run()
}
diff --git a/src/main/kotlin/starter/Models.kt b/src/main/kotlin/starter/Models.kt
index 0cb1836..3ac1711 100644
--- a/src/main/kotlin/starter/Models.kt
+++ b/src/main/kotlin/starter/Models.kt
@@ -18,4 +18,6 @@ data class Dependency(
val scope: Scope
)
-data class Input(val name: String, val display: String, val value: String? = null)
\ No newline at end of file
+data class Input(val name: String, val display: String, val value: String? = null)
+
+data class Project(val name: String, val basePackage: String)
\ No newline at end of file
diff --git a/src/main/kotlin/starter/ProjectZip.kt b/src/main/kotlin/starter/ProjectZip.kt
new file mode 100644
index 0000000..f892584
--- /dev/null
+++ b/src/main/kotlin/starter/ProjectZip.kt
@@ -0,0 +1,18 @@
+package starter
+
+import starter.utils.ZipOutput
+import starter.utils.prettyPrintXml
+
+class ProjectZip(private val templates: Templates) {
+
+ fun createZip(project: Project, inputs: List, dependencies: List) {
+ val pom = templates.pom(dependencies, inputs)
+ val prettyPom = prettyPrintXml(pom)
+
+ ZipOutput(project.name).use {
+ it.write("pom.xml", prettyPom)
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/starter/Server.kt b/src/main/kotlin/starter/Server.kt
index ba11bee..b5832b5 100644
--- a/src/main/kotlin/starter/Server.kt
+++ b/src/main/kotlin/starter/Server.kt
@@ -2,7 +2,11 @@ package starter
import io.javalin.Javalin
-class Server(private val views: Views, private val conf: StarterConfig) {
+class Server(
+ private val views: Views,
+ private val conf: StarterConfig,
+ private val projectZip: ProjectZip,
+) {
fun run() {
val app = Javalin.create {
it.addStaticFiles("/assets")
@@ -25,8 +29,13 @@ class Server(private val views: Views, private val conf: StarterConfig) {
conf.inputs.find { it.name == name }!!.copy(value = value.first())
}
- val generatedPom = views.pom(deps, inputs)
- ctx.result(prettyPrintXml(generatedPom))
+ val projectName = inputs.find { it.name == "name" }!!.value!!
+ val basePackage = inputs.find { it.name == "basePackage" }!!.value!!
+ val project = Project(projectName, basePackage)
+
+ projectZip.createZip(project, inputs, deps)
+ TODO()
+ ctx.result("prettyPrintXml(generatedPom)")
ctx.contentType("text/xml")
}
}
diff --git a/src/main/kotlin/starter/Templates.kt b/src/main/kotlin/starter/Templates.kt
new file mode 100644
index 0000000..3e3f540
--- /dev/null
+++ b/src/main/kotlin/starter/Templates.kt
@@ -0,0 +1,21 @@
+package starter
+
+import com.mitchellbosecke.pebble.PebbleEngine
+import starter.utils.render
+
+class Templates(private val engine: PebbleEngine) {
+ fun pom(dependencies: List, inputs: List): String {
+
+ val args: MutableMap = mutableMapOf(
+ "dependencies" to dependencies.sortedBy { it.scope },
+ )
+
+ inputs.forEach {
+ args[it.name] = it.value
+ }
+
+ return engine.render("starter/pom",
+ args
+ )
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/starter/Views.kt b/src/main/kotlin/starter/Views.kt
index e596a84..2999ad9 100644
--- a/src/main/kotlin/starter/Views.kt
+++ b/src/main/kotlin/starter/Views.kt
@@ -2,14 +2,7 @@ package starter
import com.mitchellbosecke.pebble.PebbleEngine
import org.slf4j.LoggerFactory
-import java.io.StringWriter
-
-private fun PebbleEngine.render(name: String, args: Map = mapOf()): String {
- val template = getTemplate(name)
- val writer = StringWriter()
- template.evaluate(writer, args)
- return writer.toString()
-}
+import starter.utils.render
class Views(private val engine: PebbleEngine) {
private val logger = LoggerFactory.getLogger(javaClass)
@@ -21,18 +14,4 @@ class Views(private val engine: PebbleEngine) {
)
}
- fun pom(dependencies: List, inputs: List): String {
-
- val args: MutableMap = mutableMapOf(
- "dependencies" to dependencies.sortedBy { it.scope },
- )
-
- inputs.forEach {
- args[it.name] = it.value
- }
-
- return engine.render("starter/pom",
- args
- )
- }
}
\ No newline at end of file
diff --git a/src/main/kotlin/starter/utils/PebbleUtils.kt b/src/main/kotlin/starter/utils/PebbleUtils.kt
new file mode 100644
index 0000000..6a52f56
--- /dev/null
+++ b/src/main/kotlin/starter/utils/PebbleUtils.kt
@@ -0,0 +1,11 @@
+package starter.utils
+
+import com.mitchellbosecke.pebble.PebbleEngine
+import java.io.StringWriter
+
+fun PebbleEngine.render(name: String, args: Map = mapOf()): String {
+ val template = getTemplate(name)
+ val writer = StringWriter()
+ template.evaluate(writer, args)
+ return writer.toString()
+}
\ No newline at end of file
diff --git a/src/main/kotlin/starter/Utils.kt b/src/main/kotlin/starter/utils/XmlUtils.kt
similarity index 98%
rename from src/main/kotlin/starter/Utils.kt
rename to src/main/kotlin/starter/utils/XmlUtils.kt
index 9048e2c..7e1a7de 100644
--- a/src/main/kotlin/starter/Utils.kt
+++ b/src/main/kotlin/starter/utils/XmlUtils.kt
@@ -1,4 +1,4 @@
-package starter
+package starter.utils
import org.w3c.dom.Document
import org.w3c.dom.NodeList
diff --git a/src/main/kotlin/starter/utils/ZipOutput.kt b/src/main/kotlin/starter/utils/ZipOutput.kt
new file mode 100644
index 0000000..23b3646
--- /dev/null
+++ b/src/main/kotlin/starter/utils/ZipOutput.kt
@@ -0,0 +1,27 @@
+package starter.utils
+
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
+import java.io.File
+import java.nio.file.Paths
+
+class ZipOutput(name: String) : AutoCloseable {
+ private val baseDir = File(".").canonicalFile
+ private val zipPath = Paths.get(baseDir.path, "$name.zip")
+ private val zipFile = zipPath.toAbsolutePath().normalize().toFile().apply {
+ createNewFile()
+ }
+ private val outputStream = ZipArchiveOutputStream(zipFile.outputStream())
+
+ fun write(path: String, content: String) {
+ val entry = ZipArchiveEntry(path)
+ outputStream.putArchiveEntry(entry)
+ outputStream.write(content.toByteArray())
+ outputStream.closeArchiveEntry()
+ }
+
+ override fun close() {
+ outputStream.finish()
+ outputStream.close()
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/starter/@dependencies.twig b/src/main/resources/starter/@dependencies.twig
index d999ec8..e609248 100644
--- a/src/main/resources/starter/@dependencies.twig
+++ b/src/main/resources/starter/@dependencies.twig
@@ -4,7 +4,7 @@
{{ dep.groupId }}
{{ dep.artifactId }}
{{ dep.version }}
- {% if dep.scope.toString == "Test" %}
+ {% if dep.scope == "Test" %}
test
{% endif %}