From 11110771a8fc29c55a4b743fdf2d0f4382dfa6a4 Mon Sep 17 00:00:00 2001 From: Thilo Schwarz Date: Sun, 12 Jul 2026 11:48:21 +0200 Subject: [PATCH] Split `UpdateScheduler` functionality into a new `ApplicationStartupListener` component; relocate configuration classes to `model.config` package; refine `README.md` phrasing and structure. --- README.md | 13 ++--- .../{service => config}/RepoConfigLoader.java | 4 +- .../jdvs/{ => model}/config/AppConfig.java | 2 +- .../jdvs/{ => model}/config/GitConfig.java | 2 +- .../jdvs/{ => model}/config/JdvsConfig.java | 2 +- .../service/ApplicationStartupListener.java | 58 +++++++++++++++++++ .../jdvs/service/MavenJavadocService.java | 4 +- .../jdvs/service/UpdateScheduler.java | 43 +------------- .../codes/thischwa/jdvs/web/WebConfig.java | 2 +- 9 files changed, 73 insertions(+), 57 deletions(-) rename src/main/java/codes/thischwa/jdvs/{service => config}/RepoConfigLoader.java (90%) rename src/main/java/codes/thischwa/jdvs/{ => model}/config/AppConfig.java (87%) rename src/main/java/codes/thischwa/jdvs/{ => model}/config/GitConfig.java (88%) rename src/main/java/codes/thischwa/jdvs/{ => model}/config/JdvsConfig.java (95%) create mode 100644 src/main/java/codes/thischwa/jdvs/service/ApplicationStartupListener.java diff --git a/README.md b/README.md index fe53a78..a31c581 100644 --- a/README.md +++ b/README.md @@ -5,19 +5,18 @@ This project Spring Boot web service that automatically fetches, manages, and serves Javadoc documentation for Maven artifacts. If you encounter any bugs or find missing features, feel free to report them on -the [Github Issues page](https://github.com/th-schwarz/JavadocViewerService/issues). +the [GitHub Issues page](https://github.com/th-schwarz/JavadocViewerService/issues). ## Features -- Fetches Javadoc JARs from Maven Central or custom Maven repositories -- Tracks multiple Maven artifacts with version detection -- Serves generated Javadoc via a simple Bootstrap web UI -- Scheduled updates via configurable cron expression -- Persists metadata in an embedded H2 database (Liquibase-managed) +- Retrieves Javadoc JARs from Maven Central or custom Maven repositories +- Tracks multiple Maven artefacts with version detection (only the latest version is taken into account). +- Delivers generated Javadoc content via a simple bootstrap web interface +- Scheduled updates via a configurable cron expression ## Requirements -JRE-21 or docker +At least JRE-21 or docker ## Start ### ... with Java diff --git a/src/main/java/codes/thischwa/jdvs/service/RepoConfigLoader.java b/src/main/java/codes/thischwa/jdvs/config/RepoConfigLoader.java similarity index 90% rename from src/main/java/codes/thischwa/jdvs/service/RepoConfigLoader.java rename to src/main/java/codes/thischwa/jdvs/config/RepoConfigLoader.java index 190578c..e01304e 100644 --- a/src/main/java/codes/thischwa/jdvs/service/RepoConfigLoader.java +++ b/src/main/java/codes/thischwa/jdvs/config/RepoConfigLoader.java @@ -1,6 +1,6 @@ -package codes.thischwa.jdvs.service; +package codes.thischwa.jdvs.config; -import codes.thischwa.jdvs.config.JdvsConfig; +import codes.thischwa.jdvs.model.config.JdvsConfig; import codes.thischwa.jdvs.jpa.GitRepositoryRepository; import codes.thischwa.jdvs.model.GitRepository; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/codes/thischwa/jdvs/config/AppConfig.java b/src/main/java/codes/thischwa/jdvs/model/config/AppConfig.java similarity index 87% rename from src/main/java/codes/thischwa/jdvs/config/AppConfig.java rename to src/main/java/codes/thischwa/jdvs/model/config/AppConfig.java index e68e4fc..2d561e7 100644 --- a/src/main/java/codes/thischwa/jdvs/config/AppConfig.java +++ b/src/main/java/codes/thischwa/jdvs/model/config/AppConfig.java @@ -1,4 +1,4 @@ -package codes.thischwa.jdvs.config; +package codes.thischwa.jdvs.model.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/codes/thischwa/jdvs/config/GitConfig.java b/src/main/java/codes/thischwa/jdvs/model/config/GitConfig.java similarity index 88% rename from src/main/java/codes/thischwa/jdvs/config/GitConfig.java rename to src/main/java/codes/thischwa/jdvs/model/config/GitConfig.java index 3fa457b..37025c6 100644 --- a/src/main/java/codes/thischwa/jdvs/config/GitConfig.java +++ b/src/main/java/codes/thischwa/jdvs/model/config/GitConfig.java @@ -1,4 +1,4 @@ -package codes.thischwa.jdvs.config; +package codes.thischwa.jdvs.model.config; import java.util.List; import lombok.Data; diff --git a/src/main/java/codes/thischwa/jdvs/config/JdvsConfig.java b/src/main/java/codes/thischwa/jdvs/model/config/JdvsConfig.java similarity index 95% rename from src/main/java/codes/thischwa/jdvs/config/JdvsConfig.java rename to src/main/java/codes/thischwa/jdvs/model/config/JdvsConfig.java index 63bf380..cbbf023 100644 --- a/src/main/java/codes/thischwa/jdvs/config/JdvsConfig.java +++ b/src/main/java/codes/thischwa/jdvs/model/config/JdvsConfig.java @@ -1,4 +1,4 @@ -package codes.thischwa.jdvs.config; +package codes.thischwa.jdvs.model.config; import java.util.List; import java.util.Objects; diff --git a/src/main/java/codes/thischwa/jdvs/service/ApplicationStartupListener.java b/src/main/java/codes/thischwa/jdvs/service/ApplicationStartupListener.java new file mode 100644 index 0000000..66d4708 --- /dev/null +++ b/src/main/java/codes/thischwa/jdvs/service/ApplicationStartupListener.java @@ -0,0 +1,58 @@ +package codes.thischwa.jdvs.service; + +import codes.thischwa.jdvs.config.RepoConfigLoader; +import codes.thischwa.jdvs.jpa.GitRepositoryRepository; +import codes.thischwa.jdvs.model.config.JdvsConfig; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class ApplicationStartupListener { + + private final GitRepositoryRepository repository; + private final JdvsConfig jdvsConfig; + private final RepoConfigLoader repoConfigLoader; + private final UpdateScheduler updateScheduler; + + @EventListener(ApplicationReadyEvent.class) + public void onApplicationReady() { + if (jdvsConfig.isCleanOnStart()) { + log.info("'jdvs.clean-on-start' is enabled – cleaning base directory and database."); + cleanBaseDir(); + repository.deleteAll(); + } + repoConfigLoader.loadConfig(); + if (jdvsConfig.isRunOnStart()) { + log.info("'jdvs.run-on-start' is enabled – running initial update."); + updateScheduler.updateAll(); + } + } + + private void cleanBaseDir() { + Path baseDir = Path.of(jdvsConfig.getBaseDir()); + if (!Files.exists(baseDir)) { + return; + } + try (var stream = Files.walk(baseDir)) { + stream.sorted(Comparator.reverseOrder()).forEach(path -> { + try { + Files.delete(path); + } catch (IOException e) { + log.warn("Failed to delete path: {}", path, e); + } + }); + log.info("Deleted base directory: {}", baseDir); + } catch (IOException e) { + log.error("Failed to walk base directory: {}", baseDir, e); + } + } +} diff --git a/src/main/java/codes/thischwa/jdvs/service/MavenJavadocService.java b/src/main/java/codes/thischwa/jdvs/service/MavenJavadocService.java index 1ac0d58..fdce797 100644 --- a/src/main/java/codes/thischwa/jdvs/service/MavenJavadocService.java +++ b/src/main/java/codes/thischwa/jdvs/service/MavenJavadocService.java @@ -1,7 +1,7 @@ package codes.thischwa.jdvs.service; -import codes.thischwa.jdvs.config.JdvsConfig; -import codes.thischwa.jdvs.config.JdvsConfig.RepoConfig; +import codes.thischwa.jdvs.model.config.JdvsConfig; +import codes.thischwa.jdvs.model.config.JdvsConfig.RepoConfig; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringReader; diff --git a/src/main/java/codes/thischwa/jdvs/service/UpdateScheduler.java b/src/main/java/codes/thischwa/jdvs/service/UpdateScheduler.java index c396d9b..4057f02 100644 --- a/src/main/java/codes/thischwa/jdvs/service/UpdateScheduler.java +++ b/src/main/java/codes/thischwa/jdvs/service/UpdateScheduler.java @@ -1,19 +1,12 @@ package codes.thischwa.jdvs.service; -import codes.thischwa.jdvs.config.JdvsConfig; import codes.thischwa.jdvs.jpa.GitRepositoryRepository; import codes.thischwa.jdvs.model.GitRepository; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; import java.time.LocalDateTime; -import java.util.Comparator; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -21,43 +14,9 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor @Slf4j public class UpdateScheduler { + private final GitRepositoryRepository repository; private final MavenJavadocService mavenJavadocService; - private final JdvsConfig jdvsConfig; - private final RepoConfigLoader repoConfigLoader; - - @EventListener(ApplicationReadyEvent.class) - public void onApplicationReady() { - if (jdvsConfig.isCleanOnStart()) { - log.info("'jdvs.clean-on-start' is enabled – cleaning base directory and database."); - cleanBaseDir(); - repository.deleteAll(); - } - repoConfigLoader.loadConfig(); - if (jdvsConfig.isRunOnStart()) { - log.info("'jdvs.run-on-start' is enabled – running initial update."); - updateAll(); - } - } - - private void cleanBaseDir() { - Path baseDir = Path.of(jdvsConfig.getBaseDir()); - if (!Files.exists(baseDir)) { - return; - } - try (var stream = Files.walk(baseDir)) { - stream.sorted(Comparator.reverseOrder()).forEach(path -> { - try { - Files.delete(path); - } catch (IOException e) { - log.warn("Failed to delete path: {}", path, e); - } - }); - log.info("Deleted base directory: {}", baseDir); - } catch (IOException e) { - log.error("Failed to walk base directory: {}", baseDir, e); - } - } @Scheduled(cron = "${jdvs.cron}") public void updateAll() { diff --git a/src/main/java/codes/thischwa/jdvs/web/WebConfig.java b/src/main/java/codes/thischwa/jdvs/web/WebConfig.java index e5d686c..80ee97c 100644 --- a/src/main/java/codes/thischwa/jdvs/web/WebConfig.java +++ b/src/main/java/codes/thischwa/jdvs/web/WebConfig.java @@ -1,6 +1,6 @@ package codes.thischwa.jdvs.web; -import codes.thischwa.jdvs.config.JdvsConfig; +import codes.thischwa.jdvs.model.config.JdvsConfig; import java.nio.file.Path; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration;