From ae66fe3c611c8536dfc9a71912d42399459af3c5 Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Mon, 22 Dec 2025 00:22:42 +0100 Subject: [PATCH] add Hibernate to kontor-javalin --- kontor-javalin/build.gradle | 90 ++++++++++++++++++- kontor-javalin/gradle.properties | 2 + kontor-javalin/gradle/libs.versions.toml | 30 +++++-- .../java/de/thpeetz/kontor/JavalinApp.java | 26 ++++++ .../src/main/java/de/thpeetz/kontor/Main.java | 15 ++++ .../main/java/de/thpeetz/kontor/api/Main.java | 37 -------- .../de/thpeetz/kontor/web/PersonHandler.java | 16 ++++ kontor-javalin/src/main/resources/logback.xml | 24 +++++ 8 files changed, 193 insertions(+), 47 deletions(-) create mode 100644 kontor-javalin/src/main/java/de/thpeetz/kontor/JavalinApp.java create mode 100644 kontor-javalin/src/main/java/de/thpeetz/kontor/Main.java delete mode 100644 kontor-javalin/src/main/java/de/thpeetz/kontor/api/Main.java create mode 100644 kontor-javalin/src/main/java/de/thpeetz/kontor/web/PersonHandler.java create mode 100644 kontor-javalin/src/main/resources/logback.xml diff --git a/kontor-javalin/build.gradle b/kontor-javalin/build.gradle index 468a464..a26f87d 100644 --- a/kontor-javalin/build.gradle +++ b/kontor-javalin/build.gradle @@ -1,5 +1,10 @@ plugins { id 'java' + //id 'application' + id 'jacoco' + id 'test-report-aggregation' + id 'jacoco-report-aggregation' + alias(libs.plugins.lombok) } repositories { @@ -7,14 +12,92 @@ repositories { } dependencies { - implementation libs.javalin // Pulling in Javalin + implementation libs.javalin.bundle + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + implementation libs.postgresql + implementation libs.hibernate + annotationProcessor libs.hibernate.modelgen + testImplementation( platform( libs.junit.bom.get().toString() )) + testImplementation "org.junit.jupiter:junit-jupiter" + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation libs.jackson // For JSON serialization of persons implementation libs.slf4j // To see some Javalin logging } +testing { + suites { + configureEach { + useJUnitJupiter() + dependencies { + implementation project() + implementation libs.hsqldb + implementation libs.sqlite.jdbc + runtimeOnly 'org.junit.platform:junit-platform-launcher' + } + } + test(JvmTestSuite) { + targets { + all { + testTask.configure { + reports { + junitXml { + outputPerTestCase = true // defaults to false + mergeReruns = true // defaults to false + } + } + finalizedBy(jacocoTestReport) + } + } + } + } + integrationTest(JvmTestSuite) { + targets { + all { + testTask.configure { + shouldRunAfter(test) + finalizedBy(jacocoTestReport) + } + } + } + } + } +} + +tasks.named('check') { + dependsOn(testing.suites.integrationTest) + dependsOn(testing.suites.test) + dependsOn tasks.named('testAggregateTestReport', TestReport) + dependsOn tasks.named('integrationTestAggregateTestReport', TestReport) +} + + +jacocoTestReport { + dependsOn test, integrationTest + reports { + xml.required = true + csv.required = false + } +} + +reporting { + reports { + testAggregateTestReport(AggregateTestReport) { + } + integrationTestAggregateTestReport(AggregateTestReport) { + } + integrationTestCodeCoverageReport(JacocoCoverageReport) { + } + } +} + +// application { +// mainClass = 'de.thpeetz.kontor.api.Main' +// } + task fatJar(type: Jar) { manifest { - attributes 'Main-Class': 'de.thpeetz.kontor.api.Main' + attributes 'Main-Class': 'de.thpeetz.kontor.Main' } duplicatesStrategy = DuplicatesStrategy.EXCLUDE from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } @@ -22,6 +105,9 @@ task fatJar(type: Jar) { } build.dependsOn fatJar +// distZip.dependsOn fatJar +// distTar.dependsOn fatJar +// startScripts.dependsOn fatJar wrapper { gradleVersion = "9.2.1" diff --git a/kontor-javalin/gradle.properties b/kontor-javalin/gradle.properties index ba98070..71446a1 100644 --- a/kontor-javalin/gradle.properties +++ b/kontor-javalin/gradle.properties @@ -1,3 +1,5 @@ description='Kontor with Spring Boot' version=0.2.0-SNAPSHOT group=de.thpeetz +org.gradle.warning.mode=none + diff --git a/kontor-javalin/gradle/libs.versions.toml b/kontor-javalin/gradle/libs.versions.toml index 4488442..eb566f5 100644 --- a/kontor-javalin/gradle/libs.versions.toml +++ b/kontor-javalin/gradle/libs.versions.toml @@ -1,18 +1,32 @@ [versions] gradle = "8.6" -junit = "5.8.2" -#slf4j = "1.7.36" -slf4j = "2.0.16" +hibernate = "6.4.4.Final" hsqldb = "2.7.1" -sqlite = "3.25.2" jackson = "2.16.1" -#javalin = "4.6.4" javalin = "6.7.0" +junit = "5.8.2" +lombok = "8.6" +postgresql = "42.6.2" +slf4j = "2.0.16" +sonarqube = "3.3" +spotbugs = "6.0.7" +sqlite = "3.25.2" [libraries] -junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } -slf4j = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" } +hibernate = { module = "org.hibernate.orm:hibernate-core", version.ref = "hibernate" } +hibernate-modelgen = { module = "org.hibernate.orm:hibernate-jpamodelgen", version.ref = "hibernate" } hsqldb = { module = "org.hsqldb:hsqldb", version.ref = "hsqldb" } jackson = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson" } -sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" } javalin = { module = "io.javalin:javalin", version.ref = "javalin" } +javalin-bundle = { module = "io.javalin:javalin-bundle", version.ref = "javalin" } +junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } +junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } +lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" } +postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" } +slf4j = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" } +sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" } + +[plugins] +spotbugs = { id = "com.github.spotbugs", version.ref = "spotbugs" } +sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" } +lombok = { id = "io.freefair.lombok", version.ref = "lombok" } diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/JavalinApp.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/JavalinApp.java new file mode 100644 index 0000000..54a249b --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/JavalinApp.java @@ -0,0 +1,26 @@ +package de.thpeetz.kontor; + +import io.javalin.Javalin; + +import static io.javalin.apibuilder.ApiBuilder.get; +import static io.javalin.apibuilder.ApiBuilder.path; +import java.util.HashMap; + +import de.thpeetz.kontor.web.PersonHandler; + +public class JavalinApp { + + public static Javalin create() { + return Javalin.create((var config) -> config.router.apiBuilder(() -> { + + path("/health", () -> get(ctx -> { + HashMap status = new HashMap<>(); + status.put("status", "ok"); + ctx.json(status); + })); + path("/persons", () -> { + get(PersonHandler.listAll); + }); + })); + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/Main.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/Main.java new file mode 100644 index 0000000..e02f80d --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/Main.java @@ -0,0 +1,15 @@ +package de.thpeetz.kontor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Main { + + private static Logger logger = LoggerFactory.getLogger(Main.class); + private static short port = 8400; + + public static void main(String[] args) { + JavalinApp.create().start(port); + logger.info("API's alive for real :-)))"); + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/api/Main.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/api/Main.java deleted file mode 100644 index 41b2baa..0000000 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/api/Main.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.thpeetz.kontor.api; - -import de.thpeetz.kontor.services.inmemory.InMemoryPersonReader; -import io.javalin.Javalin; - -import java.util.HashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class Main { - private static Logger logger = LoggerFactory.getLogger(Main.class); - private static short port = 8400; - - public static void main(String[] args) { - var personReader = new InMemoryPersonReader(); - var objMapper = new ObjectMapper(); - var result = objMapper.valueToTree(personReader.getAll()); - - logger.info("API: found {} people.", personReader.getAll().size()); - - var app = Javalin.create().start(port); - app.get("/ping", ctx -> ctx.result("pong")); - app.get("/health", ctx -> { - HashMap status = new HashMap<>(); - status.put("status", "ok"); - ctx.json(status); - }); - app.get("/persons", ctx -> { - logger.info("persons called"); - ctx.json(result); - }); - - logger.info("API's alive for real :-)))"); - } -} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/web/PersonHandler.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/PersonHandler.java new file mode 100644 index 0000000..96dacf9 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/PersonHandler.java @@ -0,0 +1,16 @@ +package de.thpeetz.kontor.web; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.thpeetz.kontor.services.inmemory.InMemoryPersonReader; +import io.javalin.http.Handler; + +public class PersonHandler { + + public static Handler listAll = (context) -> { + var personReader = new InMemoryPersonReader(); + var objMapper = new ObjectMapper(); + var result = objMapper.valueToTree(personReader.getAll()); + context.json(result); + }; +} diff --git a/kontor-javalin/src/main/resources/logback.xml b/kontor-javalin/src/main/resources/logback.xml new file mode 100644 index 0000000..6441ae7 --- /dev/null +++ b/kontor-javalin/src/main/resources/logback.xml @@ -0,0 +1,24 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + + +