From a600efb92fa63518376aace327821d5bf1b0f8e0 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Thu, 20 Aug 2026 08:48:08 +0200 Subject: [PATCH 1/6] #1651: Resolve rebase conflicts --- .github/workflows/update-urls.yml | 21 +++- CHANGELOG.adoc | 1 + .../ide/url/model/folder/UrlVersion.java | 23 +--- .../ide/url/model/file/UrlStatusFileTest.java | 48 --------- .../tools/ide/url/UpdateInitiator.java | 39 ++++--- .../ide/url/updater/AbstractUrlUpdater.java | 57 ++++++++-- .../tools/ide/url/updater/UpdateManager.java | 18 +++- .../ide/url/updater/status}/StatusJson.java | 4 +- .../ide/url/updater/status}/UrlStatus.java | 2 +- .../url/updater/status}/UrlStatusFile.java | 101 +++++++++++------- .../url/updater/status}/UrlStatusState.java | 2 +- .../ide/url/tool/pip/PipUrlUpdaterTest.java | 4 +- .../url/updater/AbstractUrlUpdaterTest.java | 9 +- .../tools/ide/url/updater/UrlUpdaterTest.java | 23 ++-- .../url/updater/status}/StatusJsonTest.java | 2 +- 15 files changed, 200 insertions(+), 154 deletions(-) delete mode 100644 cli/src/test/java/com/devonfw/tools/ide/url/model/file/UrlStatusFileTest.java rename {cli/src/main/java/com/devonfw/tools/ide/url/model/file/json => url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status}/StatusJson.java (96%) rename {cli/src/main/java/com/devonfw/tools/ide/url/model/file/json => url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status}/UrlStatus.java (96%) rename {cli/src/main/java/com/devonfw/tools/ide/url/model/file => url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status}/UrlStatusFile.java (53%) rename {cli/src/main/java/com/devonfw/tools/ide/url/model/file/json => url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status}/UrlStatusState.java (97%) rename {cli/src/test/java/com/devonfw/tools/ide/url/model/file/json => url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status}/StatusJsonTest.java (95%) diff --git a/.github/workflows/update-urls.yml b/.github/workflows/update-urls.yml index c72805e84c..53f0002eeb 100644 --- a/.github/workflows/update-urls.yml +++ b/.github/workflows/update-urls.yml @@ -17,6 +17,12 @@ jobs: repository: devonfw/ide-urls path: ide-urls token: ${{ secrets.ACTION_PUSH_TOKEN }} + - name: Checkout ide-urls-status + uses: actions/checkout@v3 + with: + repository: devonfw/ide-urls-status + path: ide-urls-status + token: ${{ secrets.ACTION_PUSH_TOKEN }} - name: Set up Java uses: actions/setup-java@v5 with: @@ -30,7 +36,7 @@ jobs: GHA_TOKEN: ${{ secrets.GHA_TOKEN }} - name: Run url updater run: | - mvn -B -ntp -Dstyle.color=always -pl url-updater exec:java -Dexec.mainClass="com.devonfw.tools.ide.url.UpdateInitiator" -Dexec.args="ide-urls PT5H30M" + mvn -B -ntp -Dstyle.color=always -pl url-updater exec:java -Dexec.mainClass="com.devonfw.tools.ide.url.UpdateInitiator" -Dexec.args="ide-urls ide-urls-status PT5H30M" env: GHA_TOKEN: ${{ secrets.GHA_TOKEN }} - name: Commit and push to ide-urls @@ -46,6 +52,19 @@ jobs: else echo "No changes, nothing to commit." fi + - name: Commit and push status.json files to ide-urls-status + run: | + cd ide-urls-status + git config --global user.name ${{ secrets.BUILD_USER }} + git config --global user.email ${{ secrets.BUILD_USER_EMAIL }} + if git status -z | grep -q . + then + git add . + git commit -m "Update status.json" + git push + else + echo "No status.json changes" + fi trigger_update_cve: runs-on: ubuntu-latest needs: updateURLS diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 2a82f6b630..7be31bd86d 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -6,6 +6,7 @@ This file documents all notable changes to https://github.com/devonfw/IDEasy[IDE Release with new features and bugfixes: +* https://github.com/devonfw/IDEasy/issues/1651[#1651]: Move status.json files out of ide-urls to ide-urls-status * https://github.com/devonfw/IDEasy/issues/821[#821]: Made the `ide` prefix in `ide shell` part of the editable input so it can be removed for non-IDEasy commands * https://github.com/devonfw/IDEasy/issues/2286[#2286]: Fix SystemPath.findBinary to search extraPathEntries * https://github.com/devonfw/IDEasy/issues/1165[#1165]: Fix automatic project import for Eclipse diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java index 44fc822f92..8d44f3234d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java +++ b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java @@ -12,7 +12,6 @@ import com.devonfw.tools.ide.url.model.file.UrlChecksum; import com.devonfw.tools.ide.url.model.file.UrlDownloadFile; import com.devonfw.tools.ide.url.model.file.UrlFile; -import com.devonfw.tools.ide.url.model.file.UrlStatusFile; import com.devonfw.tools.ide.version.VersionIdentifier; /** @@ -131,22 +130,6 @@ public static String getUrlsFileName(OperatingSystem os, SystemArchitecture arch return os + "_" + SystemArchitecture.orDefault(arch) + UrlDownloadFile.EXTENSION_URLS; } - /** - * @return the {@link UrlStatusFile}. - */ - public UrlStatusFile getStatus() { - - return (UrlStatusFile) getChild(UrlStatusFile.STATUS_JSON); - } - - /** - * @return the {@link UrlStatusFile}. - */ - public UrlStatusFile getOrCreateStatus() { - - return (UrlStatusFile) getOrCreateChild(UrlStatusFile.STATUS_JSON); - } - /** * @return the {@link VersionIdentifier} */ @@ -193,9 +176,7 @@ public UrlChecksum getChecksum(String urlsFilename) { @Override protected UrlFile newChild(String name) { - if (Objects.equals(name, UrlStatusFile.STATUS_JSON)) { - return new UrlStatusFile(this); - } else if (name.endsWith(UrlChecksum.EXTENSION)) { + if (name.endsWith(UrlChecksum.EXTENSION)) { return new UrlChecksum(this, name); } return new UrlDownloadFile(this, name); @@ -204,7 +185,7 @@ protected UrlFile newChild(String name) { @Override protected boolean isAllowedChild(String name, boolean folder) { - return true; + return !"status.json".equals(name); } @Override diff --git a/cli/src/test/java/com/devonfw/tools/ide/url/model/file/UrlStatusFileTest.java b/cli/src/test/java/com/devonfw/tools/ide/url/model/file/UrlStatusFileTest.java deleted file mode 100644 index a2c2bdb5e4..0000000000 --- a/cli/src/test/java/com/devonfw/tools/ide/url/model/file/UrlStatusFileTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.devonfw.tools.ide.url.model.file; - -import java.time.Instant; - -import org.junit.jupiter.api.Test; - -import com.devonfw.tools.ide.url.model.AbstractUrlModelTest; -import com.devonfw.tools.ide.url.model.file.json.StatusJson; -import com.devonfw.tools.ide.url.model.file.json.UrlStatus; -import com.devonfw.tools.ide.url.model.file.json.UrlStatusState; -import com.devonfw.tools.ide.url.model.folder.UrlEdition; -import com.devonfw.tools.ide.url.model.folder.UrlRepository; -import com.devonfw.tools.ide.url.model.folder.UrlTool; -import com.devonfw.tools.ide.url.model.folder.UrlVersion; - -/** - * Test of {@link UrlStatusFile}. - */ -class UrlStatusFileTest extends AbstractUrlModelTest { - - /** - * Test of {@link UrlStatusFile#getStatusJson()}. - */ - @Test - void testReadJson() { - - // given - UrlRepository repo = newRepo(); - UrlTool tool = repo.getChild("docker"); - UrlEdition edition = tool.getChild("rancher"); - UrlVersion version = edition.getChild("1.6.2"); - // when - UrlStatusFile status = version.getOrCreateStatus(); - StatusJson statusJson = status.getStatusJson(); - // then - assertThat(statusJson.getUrls()).hasSize(1); - UrlStatus urlStatus = statusJson.getUrls().values().iterator().next(); - UrlStatusState success = urlStatus.getSuccess(); - assertThat(success.getTimestamp()).isEqualTo(Instant.parse("2023-02-21T15:03:09.387386Z")); - assertThat(success.getCode()).isNull(); - assertThat(success.getMessage()).isNull(); - UrlStatusState error = urlStatus.getError(); - assertThat(error.getTimestamp()).isEqualTo(Instant.parse("2023-01-01T23:59:59.999999Z")); - assertThat(error.getCode()).isEqualTo(500); - assertThat(error.getMessage()).isEqualTo("core dumped"); - } - -} diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/UpdateInitiator.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/UpdateInitiator.java index 0588b497f9..f414151f4f 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/UpdateInitiator.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/UpdateInitiator.java @@ -19,49 +19,56 @@ public class UpdateInitiator { private static final Logger logger = LoggerFactory.getLogger(UpdateInitiator.class.getName()); /** - * @param args the command-line arguments. arg[0] points to the {@code ide-urls} repository. arg[1] defines a timeout for GitHub actions in Duration - * string format and arg[2] (optional) can be used to specify a single tool to update instead of all tools, either by toolname (e.g. java) or using the Classname of - * the Updater (e.g. JavaAzulUrlUpdater). The timeout is used to prevent the GitHub action from running into a timeout error due to too long execution - * time. + * @param args the command-line arguments. arg[0] points to the {@code ide-urls} repository. arg[1] points to the {@code ide-urls-status} repository. + * arg[2] defines a timeout for GitHub actions in Duration string format and arg[3] (optional) can be used to specify a single tool to update instead of + * all tools, either by toolname (e.g. java) or using the Classname of the Updater (e.g. JavaAzulUrlUpdater). The timeout is used to prevent the GitHub + * action from running into a timeout error due to too long execution time. */ public static void main(String[] args) { - if (args.length == 0) { - logger.error("Error: Missing path to repository as well as missing timeout as command line arguments."); - logger.error("Usage: java UpdateInitiator "); + if (args.length < 2) { + logger.error("Error: Missing path to URL repository and/or status repository."); + logger.error( + "Usage: java UpdateInitiator "); System.exit(1); } - String pathToRepo = args[0]; + String pathToUrlRepo = args[0]; + String pathToStatusRepo = args[1]; Instant expirationTime = null; String selectedTool = null; - if (args.length < 2) { + if (args.length < 3) { logger.warn("Timeout was not set, setting timeout to infinite instead."); } else { try { - Duration duration = Duration.parse(args[1]); + Duration duration = Duration.parse(args[2]); expirationTime = Instant.now().plus(duration); logger.info("Timeout was set to: {}.", expirationTime); } catch (DateTimeParseException e) { logger.error("Error: Provided timeout format is not valid.", e); System.exit(1); } - if (args.length > 2) { - selectedTool = args[2]; + if (args.length > 3) { + selectedTool = args[3]; } } - Path repoPath = Path.of(pathToRepo); + Path urlRepoPath = Path.of(pathToUrlRepo); + Path statusRepoPath = Path.of(pathToStatusRepo); - if (!repoPath.toFile().isDirectory()) { - logger.error("Error: Provided path is not a valid directory."); + if (!urlRepoPath.toFile().isDirectory()) { + logger.error("Error: Provided URL repository path is not a valid directory."); + System.exit(1); + } + if (!statusRepoPath.toFile().isDirectory()) { + logger.error("Error: Provided status repository path is not a valid directory."); System.exit(1); } UrlFinalReport urlFinalReport = new UrlFinalReport(); - UpdateManager updateManager = new UpdateManager(repoPath, urlFinalReport, expirationTime); + UpdateManager updateManager = new UpdateManager(urlRepoPath, statusRepoPath, urlFinalReport, expirationTime); if (selectedTool == null) { updateManager.updateAll(); } else { diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java index f59146e99c..96a5fa307a 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java @@ -6,6 +6,7 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.nio.file.Files; import java.nio.file.Path; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -13,9 +14,11 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.Set; @@ -29,15 +32,15 @@ import com.devonfw.tools.ide.url.model.file.UrlChecksum; import com.devonfw.tools.ide.url.model.file.UrlDownloadFile; import com.devonfw.tools.ide.url.model.file.UrlFile; -import com.devonfw.tools.ide.url.model.file.UrlStatusFile; -import com.devonfw.tools.ide.url.model.file.json.StatusJson; -import com.devonfw.tools.ide.url.model.file.json.UrlStatus; -import com.devonfw.tools.ide.url.model.file.json.UrlStatusState; import com.devonfw.tools.ide.url.model.folder.UrlEdition; import com.devonfw.tools.ide.url.model.folder.UrlRepository; import com.devonfw.tools.ide.url.model.folder.UrlTool; import com.devonfw.tools.ide.url.model.folder.UrlVersion; import com.devonfw.tools.ide.url.model.report.UrlUpdaterReport; +import com.devonfw.tools.ide.url.updater.status.StatusJson; +import com.devonfw.tools.ide.url.updater.status.UrlStatus; +import com.devonfw.tools.ide.url.updater.status.UrlStatusFile; +import com.devonfw.tools.ide.url.updater.status.UrlStatusState; import com.devonfw.tools.ide.util.DateTimeUtil; import com.devonfw.tools.ide.util.HexUtil; @@ -88,6 +91,10 @@ public abstract class AbstractUrlUpdater extends AbstractProcessorWithTimeout im private final String versionBaseUrl; + private Path statusRepositoryPath; + + private final Map statusFiles = new HashMap<>(); + private static final Logger logger = LoggerFactory.getLogger(AbstractUrlUpdater.class); /** @@ -542,7 +549,7 @@ protected boolean doAddVersion(UrlVersion urlVersion, String url, OperatingSyste */ protected boolean doAddVersion(String edition, UrlVersion urlVersion, String url, OperatingSystem os, SystemArchitecture architecture, String checksum) { - UrlStatusFile status = urlVersion.getStatus(); + UrlStatusFile status = getStatusFile(urlVersion, false); if ((status != null) && status.getStatusJson().isManual()) { return true; } @@ -695,6 +702,10 @@ private boolean doAddVersionUrlIfNewAndValid(String edition, String url, UrlVers doUpdateStatusJson(success, statusCode, edition, urlVersion, url, urlDownloadFile, update); urlVersion.save(); + UrlStatusFile urlStatusFile = getStatusFile(urlVersion, false); + if (urlStatusFile != null) { + urlStatusFile.save(); + } return success; } @@ -771,10 +782,10 @@ protected HttpResponse doCheckDownloadViaHeadRequest(String url) { private void doUpdateStatusJson(boolean success, int statusCode, String edition, UrlVersion urlVersion, String url, UrlDownloadFile downloadFile, boolean update) { - UrlStatusFile urlStatusFile = urlVersion.getStatus(); + UrlStatusFile urlStatusFile = getStatusFile(urlVersion, false); boolean forceCreation = (success || update); if ((urlStatusFile == null) && forceCreation) { - urlStatusFile = urlVersion.getOrCreateStatus(); + urlStatusFile = getStatusFile(urlVersion, true); } StatusJson statusJson = null; UrlStatus status = null; @@ -941,6 +952,36 @@ public boolean isMissingOs(UrlVersion urlVersion) { return !childNames.containsAll(osTypes); } + /** + * @param statusRepositoryPath the {@link Path} to the repository where {@code status.json} files are stored. + */ + public void setStatusRepositoryPath(Path statusRepositoryPath) { + + this.statusRepositoryPath = statusRepositoryPath; + } + + private Path getStatusJsonPath(UrlVersion urlVersion) { + + Path urlRepositoryPath = urlVersion.getParent().getParent().getParent().getPath(); + Path statusRoot = (this.statusRepositoryPath != null) ? this.statusRepositoryPath : urlRepositoryPath; + Path relativeVersionPath = urlRepositoryPath.relativize(urlVersion.getPath()); + return statusRoot.resolve(relativeVersionPath).resolve(UrlStatusFile.STATUS_JSON); + } + + private UrlStatusFile getStatusFile(UrlVersion urlVersion, boolean create) { + + Path statusPath = getStatusJsonPath(urlVersion); + UrlStatusFile statusFile = this.statusFiles.get(statusPath); + if (statusFile == null) { + if (!create && !Files.exists(statusPath)) { + return null; + } + statusFile = new UrlStatusFile(statusPath); + this.statusFiles.put(statusPath, statusFile); + } + return statusFile; + } + /** * Updates the tool's versions in the URL repository. * @@ -994,7 +1035,7 @@ protected void updateExistingVersions(UrlEdition edition) { for (String version : existingVersions) { UrlVersion urlVersion = edition.getChild(version); if (urlVersion != null) { - UrlStatusFile urlStatusFile = urlVersion.getOrCreateStatus(); + UrlStatusFile urlStatusFile = getStatusFile(urlVersion, true); StatusJson statusJson = urlStatusFile.getStatusJson(); if (statusJson.isManual()) { logger.info("For tool {} the version {} is set to manual, hence skipping update", getToolWithEdition(edition.getName()), version); diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java index b83d043f99..9d6d48780d 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java @@ -72,6 +72,8 @@ public class UpdateManager extends AbstractProcessorWithTimeout { private final UrlRepository urlRepository; + private final Path statusRepositoryPath; + private final UrlFinalReport urlFinalReport; private final List updaters = List.of( @@ -89,15 +91,28 @@ public class UpdateManager extends AbstractProcessorWithTimeout { * The constructor. * * @param pathToRepository the {@link Path} to the {@code ide-urls} repository to update. + * @param pathToStatusRepository the {@link Path} to the {@code ide-urls-status} repository to update. * @param expirationTime for GitHub actions url-update job */ - public UpdateManager(Path pathToRepository, UrlFinalReport urlFinalReport, Instant expirationTime) { + public UpdateManager(Path pathToRepository, Path pathToStatusRepository, UrlFinalReport urlFinalReport, Instant expirationTime) { this.urlRepository = UrlRepository.load(pathToRepository); + this.statusRepositoryPath = pathToStatusRepository; this.urlFinalReport = urlFinalReport; setExpirationTime(expirationTime); } + /** + * The constructor. + * + * @param pathToRepository the {@link Path} to the {@code ide-urls} repository to update. + * @param expirationTime for GitHub actions url-update job. + */ + public UpdateManager(Path pathToRepository, UrlFinalReport urlFinalReport, Instant expirationTime) { + + this(pathToRepository, pathToRepository, urlFinalReport, expirationTime); + } + /** * @return the {@link List} with all registered {@link AbstractUrlUpdater updaters}. */ @@ -137,6 +152,7 @@ private void update(AbstractUrlUpdater updater) { try { updater.setExpirationTime(getExpirationTime()); updater.setUrlFinalReport(this.urlFinalReport); + updater.setStatusRepositoryPath(this.statusRepositoryPath); String updaterName = updater.getClass().getSimpleName(); String toolName = updater.getTool(); logger.debug("Starting {} for tool {}", updaterName, toolName); diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/StatusJson.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/StatusJson.java similarity index 96% rename from cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/StatusJson.java rename to url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/StatusJson.java index 49ba1bca00..7b51b616b5 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/StatusJson.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/StatusJson.java @@ -1,12 +1,10 @@ -package com.devonfw.tools.ide.url.model.file.json; +package com.devonfw.tools.ide.url.updater.status; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; -import com.devonfw.tools.ide.url.model.file.UrlStatusFile; - /** * Java model class representing a "status.json" file. * diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/UrlStatus.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatus.java similarity index 96% rename from cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/UrlStatus.java rename to url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatus.java index 1f9c8fecd7..0a135effa8 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/UrlStatus.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatus.java @@ -1,4 +1,4 @@ -package com.devonfw.tools.ide.url.model.file.json; +package com.devonfw.tools.ide.url.updater.status; /** * Status information for a specific (download) URL. diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/UrlStatusFile.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java similarity index 53% rename from cli/src/main/java/com/devonfw/tools/ide/url/model/file/UrlStatusFile.java rename to url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java index c7b465eb14..3851b47e59 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/UrlStatusFile.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java @@ -1,38 +1,54 @@ -package com.devonfw.tools.ide.url.model.file; +package com.devonfw.tools.ide.url.updater.status; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import com.devonfw.tools.ide.json.JsonMapping; -import com.devonfw.tools.ide.url.model.file.json.StatusJson; -import com.devonfw.tools.ide.url.model.folder.UrlVersion; import com.fasterxml.jackson.databind.ObjectMapper; -/** - * {@link UrlFile} for the "status.json" file. - */ -public class UrlStatusFile extends AbstractUrlFile { +public class UrlStatusFile { - /** - * Constant {@link UrlStatusFile#getName() filename}. - */ + /** The filename of a status file. */ public static final String STATUS_JSON = "status.json"; private static final ObjectMapper MAPPER = JsonMapping.createWithReflectionSupportForUrlUpdaters(); + private final Path path; + private StatusJson statusJson; + private boolean modified; + /** * The constructor. * - * @param parent the {@link #getParent() parent folder}. + * @param path the {@link #getPath() path} to the status.json file. + */ + public UrlStatusFile(Path path) { + + super(); + this.path = path; + if (Files.exists(path)) { + try (BufferedReader reader = Files.newBufferedReader(path)) { + this.statusJson = MAPPER.readValue(reader, StatusJson.class); + } catch (Exception e) { + throw new IllegalStateException("Failed to load " + path, e); + } + } else { + this.statusJson = new StatusJson(); + } + this.modified = false; + } + + /** + * @return the {@link Path} to the status.json file. */ - public UrlStatusFile(UrlVersion parent) { + public Path getPath() { - super(parent, STATUS_JSON); - this.statusJson = new StatusJson(); + return this.path; } /** @@ -52,31 +68,6 @@ public void setStatusJson(StatusJson statusJson) { this.statusJson = statusJson; } - @Override - protected void doLoad() { - - Path path = getPath(); - if (Files.exists(path)) { - try (BufferedReader reader = Files.newBufferedReader(path)) { - this.statusJson = MAPPER.readValue(reader, StatusJson.class); - } catch (Exception e) { - throw new IllegalStateException("Failed to load " + path, e); - } - } else { - this.statusJson = new StatusJson(); - } - } - - @Override - protected void doSave() { - - try (BufferedWriter writer = Files.newBufferedWriter(getPath())) { - MAPPER.writeValue(writer, this.statusJson); - } catch (Exception e) { - throw new IllegalStateException("Failed to save file " + getPath(), e); - } - } - /** * Performs a cleanup and removes all unused entries. * @@ -89,4 +80,36 @@ public void cleanup() { this.modified = true; } } + + /** + * Saves this status file to disk if it has been modified. + */ + public void save() { + + if (this.modified) { + try { + Files.createDirectories(this.path.getParent()); + try (BufferedWriter writer = Files.newBufferedWriter(this.path)) { + MAPPER.writeValue(writer, this.statusJson); + } + } catch (IOException e) { + throw new IllegalStateException("Failed to save file " + this.path, e); + } + this.modified = false; + } + } + + /** + * Deletes this status file from disk. + */ + public void delete() { + + try { + Files.deleteIfExists(this.path); + } catch (IOException e) { + throw new IllegalStateException("Failed to delete file " + this.path, e); + } + this.modified = false; + } + } diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/UrlStatusState.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusState.java similarity index 97% rename from cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/UrlStatusState.java rename to url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusState.java index 161f0c2df7..aff4c7f999 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/json/UrlStatusState.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusState.java @@ -1,4 +1,4 @@ -package com.devonfw.tools.ide.url.model.file.json; +package com.devonfw.tools.ide.url.updater.status; import java.time.Instant; diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java index 86d436cf57..8bbdf7dca0 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java @@ -11,10 +11,10 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import com.devonfw.tools.ide.url.model.file.json.StatusJson; -import com.devonfw.tools.ide.url.model.file.json.UrlStatus; import com.devonfw.tools.ide.url.model.folder.UrlRepository; import com.devonfw.tools.ide.url.updater.AbstractUrlUpdaterTest; +import com.devonfw.tools.ide.url.updater.status.StatusJson; +import com.devonfw.tools.ide.url.updater.status.UrlStatus; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; import com.github.tomakehurst.wiremock.junit5.WireMockTest; diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java index b6e5b0d518..9a8fa61581 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java @@ -7,12 +7,12 @@ import org.assertj.core.api.Assertions; -import com.devonfw.tools.ide.url.model.file.UrlStatusFile; -import com.devonfw.tools.ide.url.model.file.json.StatusJson; import com.devonfw.tools.ide.url.model.folder.UrlEdition; import com.devonfw.tools.ide.url.model.folder.UrlRepository; import com.devonfw.tools.ide.url.model.folder.UrlTool; import com.devonfw.tools.ide.url.model.folder.UrlVersion; +import com.devonfw.tools.ide.url.updater.status.StatusJson; +import com.devonfw.tools.ide.url.updater.status.UrlStatusFile; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; /** @@ -59,9 +59,8 @@ protected StatusJson retrieveStatusJson(UrlRepository urlRepository, String tool UrlTool urlTool = new UrlTool(urlRepository, tool); UrlEdition urlEdition = new UrlEdition(urlTool, edition); UrlVersion urlVersion = new UrlVersion(urlEdition, version); - UrlStatusFile urlStatusFile = new UrlStatusFile(urlVersion); - urlStatusFile.load(false); - return urlStatusFile.getStatusJson(); + Path statusPath = urlVersion.getPath().resolve(UrlStatusFile.STATUS_JSON); + return new UrlStatusFile(statusPath).getStatusJson(); } protected void assertUrlVersionAgnostic(Path urlVersionFolder) { diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java index 602367858e..e7763d5a99 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java @@ -19,14 +19,14 @@ import com.devonfw.tools.ide.os.SystemArchitecture; import com.devonfw.tools.ide.url.model.file.UrlChecksum; import com.devonfw.tools.ide.url.model.file.UrlDownloadFile; -import com.devonfw.tools.ide.url.model.file.UrlStatusFile; -import com.devonfw.tools.ide.url.model.file.json.StatusJson; -import com.devonfw.tools.ide.url.model.file.json.UrlStatus; -import com.devonfw.tools.ide.url.model.file.json.UrlStatusState; import com.devonfw.tools.ide.url.model.folder.UrlEdition; import com.devonfw.tools.ide.url.model.folder.UrlRepository; import com.devonfw.tools.ide.url.model.folder.UrlTool; import com.devonfw.tools.ide.url.model.folder.UrlVersion; +import com.devonfw.tools.ide.url.updater.status.StatusJson; +import com.devonfw.tools.ide.url.updater.status.UrlStatus; +import com.devonfw.tools.ide.url.updater.status.UrlStatusFile; +import com.devonfw.tools.ide.url.updater.status.UrlStatusState; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; import com.github.tomakehurst.wiremock.junit5.WireMockTest; @@ -123,15 +123,18 @@ void testStatusJsonUpdateOnFirstError(@TempDir Path tempDir, WireMockRuntimeInfo UrlEdition urlEdition = urlTool.getOrCreateChild(editionName); UrlVersion urlVersion = urlEdition.getOrCreateChild(versionName); // we create the structure of our tool version and URL to simulate it was valid last moth - UrlStatusFile statusFile = urlVersion.getOrCreateStatus(); + Path statusPath = urlVersion.getPath().resolve(UrlStatusFile.STATUS_JSON); + UrlStatusFile statusFile = new UrlStatusFile(statusPath); UrlStatus status = statusFile.getStatusJson().getOrCreateUrlStatus(url); UrlStatusState successState = new UrlStatusState(lastMonth); // ensure that we trigger a recheck of the URL status.setSuccess(successState); + statusFile.setStatusJson(statusFile.getStatusJson()); // mark as modified so save() persists it UrlDownloadFile urlDownloadFile = urlVersion.getOrCreateUrls(OperatingSystem.WINDOWS, SystemArchitecture.X64); urlDownloadFile.addUrl(url); UrlChecksum urlChecksum = urlVersion.getOrCreateChecksum(urlDownloadFile.getName()); urlChecksum.setChecksum("1234567890"); urlVersion.save(); + statusFile.save(); UrlUpdaterMockSingle updater = new UrlUpdaterMockSingle(wmRuntimeInfo); // now we want to simulate that the url got broken (404) and the updater is properly handling this stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(404))); @@ -175,18 +178,21 @@ void testSuccessStateUpdatedAfterError(@TempDir Path tempDir, WireMockRuntimeInf UrlEdition urlEdition = urlTool.getOrCreateChild(editionName); UrlVersion urlVersion = urlEdition.getOrCreateChild(versionName); // we create the structure of our tool version and URL to simulate it was valid last moth - UrlStatusFile statusFile = urlVersion.getOrCreateStatus(); + Path statusPath = urlVersion.getPath().resolve(UrlStatusFile.STATUS_JSON); + UrlStatusFile statusFile = new UrlStatusFile(statusPath); UrlStatus status = statusFile.getStatusJson().getOrCreateUrlStatus(url); UrlStatusState successState = new UrlStatusState(lastSuccess); status.setSuccess(successState); UrlStatusState errorState = new UrlStatusState(lastMonth); errorState.setCode(404); status.setError(errorState); + statusFile.setStatusJson(statusFile.getStatusJson()); // mark as modified so save() persists it UrlDownloadFile urlDownloadFile = urlVersion.getOrCreateUrls(OperatingSystem.WINDOWS, SystemArchitecture.X64); urlDownloadFile.addUrl(url); UrlChecksum urlChecksum = urlVersion.getOrCreateChecksum(urlDownloadFile.getName()); urlChecksum.setChecksum("1234567890"); urlVersion.save(); + statusFile.save(); UrlUpdaterMockSingle updater = new UrlUpdaterMockSingle(wmRuntimeInfo); // now we want to simulate that the broken url is working again stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(200).withHeader("Content-Type", "text/plain"))); @@ -227,18 +233,21 @@ void testVersionRemovedIfErrorPersists(@TempDir Path tempDir, WireMockRuntimeInf UrlEdition urlEdition = urlTool.getOrCreateChild(editionName); UrlVersion urlVersion = urlEdition.getOrCreateChild(versionName); // we create the structure of our tool version and URL to simulate it was valid last moth - UrlStatusFile statusFile = urlVersion.getOrCreateStatus(); + Path statusPath = urlVersion.getPath().resolve(UrlStatusFile.STATUS_JSON); + UrlStatusFile statusFile = new UrlStatusFile(statusPath); UrlStatus status = statusFile.getStatusJson().getOrCreateUrlStatus(url); UrlStatusState successState = new UrlStatusState(lastSuccess); status.setSuccess(successState); UrlStatusState errorState = new UrlStatusState(lastMonth); errorState.setCode(404); status.setError(errorState); + statusFile.setStatusJson(statusFile.getStatusJson()); // mark as modified so save() persists it UrlDownloadFile urlDownloadFile = urlVersion.getOrCreateUrls(OperatingSystem.WINDOWS, SystemArchitecture.X64); urlDownloadFile.addUrl(url); UrlChecksum urlChecksum = urlVersion.getOrCreateChecksum(urlDownloadFile.getName()); urlChecksum.setChecksum("1234567890"); urlVersion.save(); + statusFile.save(); UrlUpdaterMockSingle updater = new UrlUpdaterMockSingle(wmRuntimeInfo); // now we want to simulate that the url got broken (404) and the updater is properly handling this stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(404))); diff --git a/cli/src/test/java/com/devonfw/tools/ide/url/model/file/json/StatusJsonTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status/StatusJsonTest.java similarity index 95% rename from cli/src/test/java/com/devonfw/tools/ide/url/model/file/json/StatusJsonTest.java rename to url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status/StatusJsonTest.java index 4bbd0b4fab..e343ccc811 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/url/model/file/json/StatusJsonTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status/StatusJsonTest.java @@ -1,4 +1,4 @@ -package com.devonfw.tools.ide.url.model.file.json; +package com.devonfw.tools.ide.url.updater.status; import java.util.HashSet; import java.util.Set; From a0c25cf19dab16565fab23259f2dad5823d30249 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 17 Aug 2026 08:37:29 +0200 Subject: [PATCH 2/6] #1651: Add UrlStatusFile javadoc --- .../devonfw/tools/ide/url/updater/status/UrlStatusFile.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java index 3851b47e59..1617a1555f 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java @@ -9,6 +9,10 @@ import com.devonfw.tools.ide.json.JsonMapping; import com.fasterxml.jackson.databind.ObjectMapper; +/** + * Wrapper for the "status.json" file of a tool version. It loads the {@link StatusJson} from disk when created + * (or starts empty if the file is missing) and only writes it back on {@link #save()} if it was changed. + */ public class UrlStatusFile { /** The filename of a status file. */ From aa884bd6db2217b3841fedac891b4caf6cfbb53f Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 17 Aug 2026 08:41:45 +0200 Subject: [PATCH 3/6] #1651: Add STATUS_JSON constant --- .../com/devonfw/tools/ide/url/model/folder/UrlVersion.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java index 8d44f3234d..72f1722a4d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java +++ b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/UrlVersion.java @@ -20,6 +20,9 @@ */ public class UrlVersion extends AbstractUrlFolderWithParent> { + /** The {@link #getName() filename} of the status file. Must stay in sync with {@code UrlStatusFile.STATUS_JSON} in the url-updater module. */ + private static final String STATUS_JSON = "status.json"; + private VersionIdentifier versionIdentifier; /** @@ -185,7 +188,7 @@ protected UrlFile newChild(String name) { @Override protected boolean isAllowedChild(String name, boolean folder) { - return !"status.json".equals(name); + return !STATUS_JSON.equals(name); } @Override From 5c3342bb45a53fca51e6fdbc1dbbb94cd4bb52d8 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 17 Aug 2026 08:46:33 +0200 Subject: [PATCH 4/6] #1651: Add unit test for UrlStatusFile --- .../ide/url/updater/status/UrlStatusFile.java | 2 +- .../url/updater/status/UrlStatusFileTest.java | 113 ++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFileTest.java diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java index 1617a1555f..895ced8f67 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; /** - * Wrapper for the "status.json" file of a tool version. It loads the {@link StatusJson} from disk when created + * Wrapper for the "status.json" file of a tool version. It loads the {@link StatusJson} from disk when created * (or starts empty if the file is missing) and only writes it back on {@link #save()} if it was changed. */ public class UrlStatusFile { diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFileTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFileTest.java new file mode 100644 index 0000000000..a1e4596cb3 --- /dev/null +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFileTest.java @@ -0,0 +1,113 @@ +package com.devonfw.tools.ide.url.updater.status; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Instant; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Test of {@link UrlStatusFile}. + */ +class UrlStatusFileTest extends Assertions { + + private static final String STATUS_JSON = """ + { + "manual": false, + "urls": { + "111553425": { + "success": { + "timestamp": "2023-02-21T15:03:09.387386Z" + }, + "error": { + "timestamp": "2023-01-01T23:59:59.999999Z", + "code": 500, + "message": "core dumped" + } + } + } + } + """; + + /** + * Test that an existing status.json is loaded and its content is deserialized correctly. + */ + @Test + void testLoadExistingFile(@TempDir Path tempDir) throws IOException { + + // arrange + Path path = tempDir.resolve(UrlStatusFile.STATUS_JSON); + Files.writeString(path, STATUS_JSON); + + // act + StatusJson statusJson = new UrlStatusFile(path).getStatusJson(); + + // assert + assertThat(statusJson.getUrls()).hasSize(1); + UrlStatus urlStatus = statusJson.getUrls().values().iterator().next(); + UrlStatusState success = urlStatus.getSuccess(); + assertThat(success.getTimestamp()).isEqualTo(Instant.parse("2023-02-21T15:03:09.387386Z")); + assertThat(success.getCode()).isNull(); + assertThat(success.getMessage()).isNull(); + UrlStatusState error = urlStatus.getError(); + assertThat(error.getTimestamp()).isEqualTo(Instant.parse("2023-01-01T23:59:59.999999Z")); + assertThat(error.getCode()).isEqualTo(500); + assertThat(error.getMessage()).isEqualTo("core dumped"); + } + + /** + * Test that a missing status.json defaults to an empty {@link StatusJson}. + */ + @Test + void testLoadMissingFileDefaultsToEmpty(@TempDir Path tempDir) { + + // arrange + Path path = tempDir.resolve(UrlStatusFile.STATUS_JSON); + + // act + StatusJson statusJson = new UrlStatusFile(path).getStatusJson(); + + // assert + assertThat(statusJson.getUrls()).isEmpty(); + assertThat(statusJson.isManual()).isFalse(); + } + + /** + * Test that {@link UrlStatusFile#save()} does not write a file when nothing was modified. + */ + @Test + void testSaveIsNoOpWhenUnmodified(@TempDir Path tempDir) { + + // arrange + Path path = tempDir.resolve(UrlStatusFile.STATUS_JSON); + UrlStatusFile statusFile = new UrlStatusFile(path); + + // act + statusFile.save(); + + // assert + assertThat(path).doesNotExist(); + } + + /** + * Test that {@link UrlStatusFile#delete()} removes the file from disk. + */ + @Test + void testDeleteRemovesFile(@TempDir Path tempDir) throws IOException { + + // arrange + Path path = tempDir.resolve(UrlStatusFile.STATUS_JSON); + Files.writeString(path, STATUS_JSON); + UrlStatusFile statusFile = new UrlStatusFile(path); + + // act + statusFile.delete(); + + // assert + assertThat(path).doesNotExist(); + } + +} From 6e98aedf391edf882e1c7aac60ee011da0b5fff0 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 17 Aug 2026 08:54:16 +0200 Subject: [PATCH 5/6] #1651: Add markModified() method --- .../tools/ide/url/updater/status/UrlStatusFile.java | 8 ++++++++ .../com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java index 895ced8f67..0f8432cd15 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/status/UrlStatusFile.java @@ -72,6 +72,14 @@ public void setStatusJson(StatusJson statusJson) { this.statusJson = statusJson; } + /** + * Marks this status file as modified so that the next {@link #save()} writes it to disk. + */ + public void markModified() { + + this.modified = true; + } + /** * Performs a cleanup and removes all unused entries. * diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java index e7763d5a99..ca069d15c3 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java @@ -128,7 +128,7 @@ void testStatusJsonUpdateOnFirstError(@TempDir Path tempDir, WireMockRuntimeInfo UrlStatus status = statusFile.getStatusJson().getOrCreateUrlStatus(url); UrlStatusState successState = new UrlStatusState(lastMonth); // ensure that we trigger a recheck of the URL status.setSuccess(successState); - statusFile.setStatusJson(statusFile.getStatusJson()); // mark as modified so save() persists it + statusFile.markModified(); UrlDownloadFile urlDownloadFile = urlVersion.getOrCreateUrls(OperatingSystem.WINDOWS, SystemArchitecture.X64); urlDownloadFile.addUrl(url); UrlChecksum urlChecksum = urlVersion.getOrCreateChecksum(urlDownloadFile.getName()); @@ -186,7 +186,7 @@ void testSuccessStateUpdatedAfterError(@TempDir Path tempDir, WireMockRuntimeInf UrlStatusState errorState = new UrlStatusState(lastMonth); errorState.setCode(404); status.setError(errorState); - statusFile.setStatusJson(statusFile.getStatusJson()); // mark as modified so save() persists it + statusFile.markModified(); UrlDownloadFile urlDownloadFile = urlVersion.getOrCreateUrls(OperatingSystem.WINDOWS, SystemArchitecture.X64); urlDownloadFile.addUrl(url); UrlChecksum urlChecksum = urlVersion.getOrCreateChecksum(urlDownloadFile.getName()); @@ -241,7 +241,7 @@ void testVersionRemovedIfErrorPersists(@TempDir Path tempDir, WireMockRuntimeInf UrlStatusState errorState = new UrlStatusState(lastMonth); errorState.setCode(404); status.setError(errorState); - statusFile.setStatusJson(statusFile.getStatusJson()); // mark as modified so save() persists it + statusFile.markModified(); UrlDownloadFile urlDownloadFile = urlVersion.getOrCreateUrls(OperatingSystem.WINDOWS, SystemArchitecture.X64); urlDownloadFile.addUrl(url); UrlChecksum urlChecksum = urlVersion.getOrCreateChecksum(urlDownloadFile.getName()); From 004626af2a09ea0394be84070232c28248ec3ec1 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Thu, 20 Aug 2026 08:47:21 +0200 Subject: [PATCH 6/6] #1651: move status.json cache into UpdateManager and save once at the end --- .../ide/url/updater/AbstractUrlUpdater.java | 38 ++------------- .../tools/ide/url/updater/UpdateManager.java | 47 ++++++++++++++++++- .../ide/url/report/UrlUpdaterReportTest.java | 16 +++---- .../AndroidStudioUrlUpdaterTest.java | 6 +-- .../tool/aws/AwsGithubUrlTagUpdaterTest.java | 2 +- .../ide/url/tool/az/AzureUrlUpdaterTest.java | 2 +- .../url/tool/claude/ClaudeUrlUpdaterTest.java | 2 +- .../tool/copilot/CopilotUrlUpdaterTest.java | 2 +- .../tool/corepack/CorepackUrlUpdaterTest.java | 2 +- .../GcLogAnalyzerUrlUpdaterTest.java | 3 +- .../ide/url/tool/go/GoUrlUpdaterTest.java | 2 +- .../url/tool/gradle/GradleUrlUpdaterTest.java | 2 +- .../ide/url/tool/inso/InsoUrlUpdaterTest.java | 2 +- .../tool/intellij/IntellijUrlUpdaterTest.java | 6 +-- .../ide/url/tool/java/JavaUrlUpdaterTest.java | 5 +- .../ide/url/tool/mvnd/MvndUrlUpdaterTest.java | 6 +-- .../ide/url/tool/ng/NgUrlUpdaterTest.java | 2 +- .../ide/url/tool/npm/NpmUrlUpdaterTest.java | 8 ++-- .../tool/pgadmin/PgAdminUrlUpdaterTest.java | 3 +- .../ide/url/tool/pip/PipUrlUpdaterTest.java | 2 +- .../tool/pycharm/PycharmUrlUpdaterTest.java | 6 +-- .../tool/quarkus/QuarkusUrlUpdaterTest.java | 3 +- .../url/tool/ruby/RubyJdxUrlUpdaterTest.java | 2 +- .../ide/url/tool/ruby/RubyUrlUpdaterTest.java | 2 +- .../ide/url/tool/rust/RustUrlUpdaterTest.java | 2 +- .../url/tool/soapui/SoapUiUpdaterTest.java | 2 +- .../url/tool/sonar/SonarUrlUpdaterTest.java | 3 +- .../squirrelsql/SquirrelSqlUpdaterTest.java | 2 +- .../terraform/TerraformUrlUpdaterTest.java | 3 +- .../url/tool/tomcat/TomcatUrlUpdaterTest.java | 3 +- .../ide/url/tool/uv/UvUrlUpdaterTest.java | 2 +- .../url/tool/vscode/VsCodeUrlUpdaterTest.java | 3 +- .../tool/vscode/VsCodiumUrlUpdaterTest.java | 2 +- .../url/updater/AbstractUrlUpdaterTest.java | 15 ++++++ .../tools/ide/url/updater/UrlUpdaterTest.java | 16 +++---- 35 files changed, 125 insertions(+), 99 deletions(-) diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java index 96a5fa307a..de149fa0cd 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdater.java @@ -6,7 +6,6 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.nio.file.Files; import java.nio.file.Path; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -14,11 +13,9 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.Objects; import java.util.Set; @@ -91,9 +88,7 @@ public abstract class AbstractUrlUpdater extends AbstractProcessorWithTimeout im private final String versionBaseUrl; - private Path statusRepositoryPath; - - private final Map statusFiles = new HashMap<>(); + private UpdateManager updateManager; private static final Logger logger = LoggerFactory.getLogger(AbstractUrlUpdater.class); @@ -702,10 +697,6 @@ private boolean doAddVersionUrlIfNewAndValid(String edition, String url, UrlVers doUpdateStatusJson(success, statusCode, edition, urlVersion, url, urlDownloadFile, update); urlVersion.save(); - UrlStatusFile urlStatusFile = getStatusFile(urlVersion, false); - if (urlStatusFile != null) { - urlStatusFile.save(); - } return success; } @@ -953,33 +944,16 @@ public boolean isMissingOs(UrlVersion urlVersion) { } /** - * @param statusRepositoryPath the {@link Path} to the repository where {@code status.json} files are stored. + * @param updateManager the {@link UpdateManager} that owns the shared status file cache. */ - public void setStatusRepositoryPath(Path statusRepositoryPath) { - - this.statusRepositoryPath = statusRepositoryPath; - } - - private Path getStatusJsonPath(UrlVersion urlVersion) { + public void setUpdateManager(UpdateManager updateManager) { - Path urlRepositoryPath = urlVersion.getParent().getParent().getParent().getPath(); - Path statusRoot = (this.statusRepositoryPath != null) ? this.statusRepositoryPath : urlRepositoryPath; - Path relativeVersionPath = urlRepositoryPath.relativize(urlVersion.getPath()); - return statusRoot.resolve(relativeVersionPath).resolve(UrlStatusFile.STATUS_JSON); + this.updateManager = updateManager; } private UrlStatusFile getStatusFile(UrlVersion urlVersion, boolean create) { - Path statusPath = getStatusJsonPath(urlVersion); - UrlStatusFile statusFile = this.statusFiles.get(statusPath); - if (statusFile == null) { - if (!create && !Files.exists(statusPath)) { - return null; - } - statusFile = new UrlStatusFile(statusPath); - this.statusFiles.put(statusPath, statusFile); - } - return statusFile; + return this.updateManager.getStatusFile(urlVersion, create); } /** @@ -1073,8 +1047,6 @@ private void updateExistingVersion(String edition, String version, UrlVersion ur urlStatusFile.cleanup(); if (statusJson.getUrls().isEmpty()) { urlStatusFile.delete(); - } else { - urlStatusFile.save(); } } diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java index 9d6d48780d..3aa9c91cad 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java @@ -1,13 +1,17 @@ package com.devonfw.tools.ide.url.updater; +import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.devonfw.tools.ide.url.model.folder.UrlRepository; +import com.devonfw.tools.ide.url.model.folder.UrlVersion; import com.devonfw.tools.ide.url.model.report.UrlFinalReport; import com.devonfw.tools.ide.url.tool.androidstudio.AndroidStudioUrlUpdater; import com.devonfw.tools.ide.url.tool.aws.AwsUrlUpdater; @@ -61,6 +65,7 @@ import com.devonfw.tools.ide.url.tool.uv.UvUrlUpdater; import com.devonfw.tools.ide.url.tool.vscode.VsCodeUrlUpdater; import com.devonfw.tools.ide.url.tool.vscode.VsCodiumUrlUpdater; +import com.devonfw.tools.ide.url.updater.status.UrlStatusFile; /** * The {@code UpdateManager} class manages the update process for various tools by using a list of {@link AbstractUrlUpdater}s to update the @@ -76,6 +81,8 @@ public class UpdateManager extends AbstractProcessorWithTimeout { private final UrlFinalReport urlFinalReport; + private final Map statusFiles = new HashMap<>(); + private final List updaters = List.of( new AndroidStudioUrlUpdater(), new AwsUrlUpdater(), new AzureUrlUpdater(), new ClaudeUrlUpdater(), new CopilotUrlUpdater(), new CorepackUrlUpdater(), new DockerDesktopUrlUpdater(), new DotNetUrlUpdater(), new EclipseCppUrlUpdater(), new EclipseJeeUrlUpdater(), new EclipseJavaUrlUpdater(), @@ -132,6 +139,7 @@ public void updateAll() { } update(updater); } + saveStatusFiles(); } /** @@ -146,13 +154,14 @@ public void update(String tool) { update(updater); } } + saveStatusFiles(); } private void update(AbstractUrlUpdater updater) { try { updater.setExpirationTime(getExpirationTime()); updater.setUrlFinalReport(this.urlFinalReport); - updater.setStatusRepositoryPath(this.statusRepositoryPath); + updater.setUpdateManager(this); String updaterName = updater.getClass().getSimpleName(); String toolName = updater.getTool(); logger.debug("Starting {} for tool {}", updaterName, toolName); @@ -190,5 +199,41 @@ public UrlRepository getUrlRepository() { return this.urlRepository; } + /** + * @param urlVersion the {@link UrlVersion} to get the {@link UrlStatusFile} for. + * @param create {@code true} to create the {@link UrlStatusFile} if the {@code status.json} does not exist yet, {@code false} to return {@code null} instead. + * @return the cached {@link UrlStatusFile} for the given {@link UrlVersion} or {@code null}. + */ + public UrlStatusFile getStatusFile(UrlVersion urlVersion, boolean create) { + + UrlStatusFile statusFile = this.statusFiles.get(urlVersion); + if (statusFile == null) { + Path statusPath = getStatusJsonPath(urlVersion); + if (!create && !Files.exists(statusPath)) { + return null; + } + statusFile = new UrlStatusFile(statusPath); + this.statusFiles.put(urlVersion, statusFile); + } + return statusFile; + } + + private Path getStatusJsonPath(UrlVersion urlVersion) { + + Path urlRepositoryPath = urlVersion.getParent().getParent().getParent().getPath(); + Path statusRoot = (this.statusRepositoryPath != null) ? this.statusRepositoryPath : urlRepositoryPath; + Path relativeVersionPath = urlRepositoryPath.relativize(urlVersion.getPath()); + return statusRoot.resolve(relativeVersionPath).resolve(UrlStatusFile.STATUS_JSON); + } + + /** + * Saves all {@link UrlStatusFile status files} that were touched during this run (only those that were modified are actually written). + */ + public void saveStatusFiles() { + + for (UrlStatusFile statusFile : this.statusFiles.values()) { + statusFile.save(); + } + } } diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/report/UrlUpdaterReportTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/report/UrlUpdaterReportTest.java index a29dce5b2f..1e5e9097e5 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/report/UrlUpdaterReportTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/report/UrlUpdaterReportTest.java @@ -57,7 +57,7 @@ void testReportOnInitialRunWithAllUrlsSuccessful() { updater.setUrlFinalReport(urlFinalReport); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertThat(urlFinalReport.getUrlUpdaterReports()).contains(expectedReport); @@ -76,7 +76,7 @@ void testReportOnInitialRunWithAllUrlsFailing() { updater.setUrlFinalReport(urlFinalReport); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertThat(urlFinalReport.getUrlUpdaterReports()).contains(expectedReport); @@ -91,13 +91,13 @@ void testReportOnInitialRunWithFailedUrlsForMac() { // assign stubSuccessfulUrlRequest(); stubFailedUrlRequest("/os/mac.*"); - updater.update(urlRepository); // init successful update + update(updater, urlRepository); // init successful update UrlUpdaterReport expectedReport = createReport(3, 0, 0, 6); UrlFinalReport urlFinalReport = new UrlFinalReport(); updater.setUrlFinalReport(urlFinalReport); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertThat(urlFinalReport.getUrlUpdaterReports()).contains(expectedReport); @@ -111,13 +111,13 @@ void testReportOnSecondRunWithExistVersionsAlreadyVerifiedInTime() { // assign stubSuccessfulUrlRequest(); - updater.update(urlRepository); // init successful update + update(updater, urlRepository); // init successful update UrlUpdaterReport expectedReport = createReport(0, 0, 0, 0); UrlFinalReport urlFinalReport = new UrlFinalReport(); updater.setUrlFinalReport(urlFinalReport); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertThat(urlFinalReport.getUrlUpdaterReports()).contains(expectedReport); @@ -131,7 +131,7 @@ void testReportOnSecondRunAfterOneVersionIsRemoved() throws IOException { // assign stubSuccessfulUrlRequest(); - updater.update(urlRepository); // init successful update + update(updater, urlRepository); // init successful update UrlUpdaterReport expectedReport = createReport(1, 0, 1, 0); Path urlPath = urlRepository.getPath().resolve("mocked").resolve("mocked").resolve("1.0"); Files.deleteIfExists(urlPath.resolve("windows_x64.urls")); @@ -141,7 +141,7 @@ void testReportOnSecondRunAfterOneVersionIsRemoved() throws IOException { updater.setUrlFinalReport(urlFinalReport); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertThat(urlFinalReport.getUrlUpdaterReports()).contains(expectedReport); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/androidstudio/AndroidStudioUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/androidstudio/AndroidStudioUrlUpdaterTest.java index 1cff031774..1e77413862 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/androidstudio/AndroidStudioUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/androidstudio/AndroidStudioUrlUpdaterTest.java @@ -60,7 +60,7 @@ void testJsonUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, Wi UrlRepository urlRepository = UrlRepository.load(tempDir); AndroidStudioUrlUpdater updater = new AndroidStudioUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path androidStudioVersionsPath = tempDir.resolve("android-studio").resolve("android-studio").resolve("2023.1.1.2"); @@ -84,7 +84,7 @@ void testJsonUrlUpdaterWithMissingDownloadsDoesNotCreateVersionFolder(@TempDir P AndroidStudioUrlUpdater updater = new AndroidStudioUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // when - updater.update(urlRepository); + update(updater, urlRepository); Path androidStudioVersionsPath = tempDir.resolve("android-studio").resolve("android-studio").resolve("2023.1.1.2"); @@ -111,7 +111,7 @@ void testJsonUrlUpdaterWithMissingChecksumGeneratesChecksum(@TempDir Path tempDi AndroidStudioUrlUpdater updater = new AndroidStudioUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path androidStudioVersionsPath = tempDir.resolve("android-studio").resolve("android-studio").resolve("2023.1.1.2"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/aws/AwsGithubUrlTagUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/aws/AwsGithubUrlTagUpdaterTest.java index 4ccd078f87..40526c187e 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/aws/AwsGithubUrlTagUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/aws/AwsGithubUrlTagUpdaterTest.java @@ -44,7 +44,7 @@ void testAwsGithubUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntim AwsUrlUpdater updater = new AwsUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/download/", wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path awsEditionDir = tempDir.resolve("aws").resolve("aws"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/az/AzureUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/az/AzureUrlUpdaterTest.java index 083ff04769..10fbe69187 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/az/AzureUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/az/AzureUrlUpdaterTest.java @@ -40,7 +40,7 @@ void testAzureUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, W AzureUrlUpdater updater = new AzureUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path azEditionDir = tempDir.resolve("az").resolve("az"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/claude/ClaudeUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/claude/ClaudeUrlUpdaterTest.java index f57b1ff600..a6b9cd1855 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/claude/ClaudeUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/claude/ClaudeUrlUpdaterTest.java @@ -42,7 +42,7 @@ void testClaudeUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeIn ClaudeUrlUpdater updater = new ClaudeUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path claudeDir = tempDir.resolve("claude").resolve("claude"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/copilot/CopilotUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/copilot/CopilotUrlUpdaterTest.java index 7af7d98d8f..9c0285c156 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/copilot/CopilotUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/copilot/CopilotUrlUpdaterTest.java @@ -42,7 +42,7 @@ void testCopilotUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeI CopilotUrlUpdater updater = new CopilotUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path copilotDir = tempDir.resolve("copilot").resolve("copilot"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/corepack/CorepackUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/corepack/CorepackUrlUpdaterTest.java index debd99bf5c..53b3f7f3c3 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/corepack/CorepackUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/corepack/CorepackUrlUpdaterTest.java @@ -44,7 +44,7 @@ void testCorepackJsonUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tem CorepackUrlUpdater updater = new CorepackUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/"); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertUrlVersionAgnostic(tempDir.resolve("corepack").resolve("corepack").resolve("0.34.0")); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gcloganalyzer/GcLogAnalyzerUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gcloganalyzer/GcLogAnalyzerUrlUpdaterTest.java index cb0b416f8c..51299fc9cb 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gcloganalyzer/GcLogAnalyzerUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gcloganalyzer/GcLogAnalyzerUrlUpdaterTest.java @@ -46,7 +46,7 @@ void testGcLogAnalyzerUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRu GcLogAnalyzerUrlUpdater updater = new GcLogAnalyzerUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path gclaEditionDir = tempDir.resolve("gcloganalyzer").resolve("gcloganalyzer"); @@ -60,4 +60,3 @@ void testGcLogAnalyzerUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRu .contains(wmRuntimeInfo.getHttpBaseUrl() + "/gcla/24.10.0/GCLogAnalyzer-24.10.0-ca.zip"); } } - diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/go/GoUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/go/GoUrlUpdaterTest.java index 7efbd4b1d0..09bd5d43f9 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/go/GoUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/go/GoUrlUpdaterTest.java @@ -32,7 +32,7 @@ void testGoUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, Wire UrlRepository urlRepository = UrlRepository.load(tempDir); GoUrlUpdater updater = new GoUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // when - updater.update(urlRepository); + update(updater, urlRepository); // then Path goEditionPath = tempDir.resolve("go").resolve("go"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gradle/GradleUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gradle/GradleUrlUpdaterTest.java index fe1fcc7b85..97bd9dfcbf 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gradle/GradleUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/gradle/GradleUrlUpdaterTest.java @@ -41,7 +41,7 @@ void testGradleUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeIn GradleUrlUpdater updater = new GradleUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path gradleDir = tempDir.resolve("gradle").resolve("gradle"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/inso/InsoUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/inso/InsoUrlUpdaterTest.java index d222ea45cd..ff978340dd 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/inso/InsoUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/inso/InsoUrlUpdaterTest.java @@ -39,7 +39,7 @@ void testInsoUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeInfo InsoUrlUpdater updater = new InsoUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path insoDir = tempDir.resolve("inso").resolve("inso"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/intellij/IntellijUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/intellij/IntellijUrlUpdaterTest.java index 9a318bb270..e90ddb7713 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/intellij/IntellijUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/intellij/IntellijUrlUpdaterTest.java @@ -63,7 +63,7 @@ void testIntellijJsonUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tem IntellijUrlUpdater updater = new IntellijUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path intellijToolPath = tempDir.resolve("intellij"); @@ -97,7 +97,7 @@ void testIntellijJsonUrlUpdaterWithMissingDownloadsDoesNotCreateVersionFolder(@T IntellijUrlUpdater updater = new IntellijUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); Path intellijVersionsPath = tempDir.resolve("intellij").resolve("intellij").resolve("2023.1.3"); @@ -124,7 +124,7 @@ void testIntellijJsonUrlUpdaterWithMissingChecksumGeneratesChecksum(@TempDir Pat IntellijUrlUpdater updater = new IntellijUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path intellijVersionsPath = tempDir.resolve("intellij").resolve("intellij").resolve("2023.1.2"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/java/JavaUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/java/JavaUrlUpdaterTest.java index 48dae11fc1..02cfe85960 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/java/JavaUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/java/JavaUrlUpdaterTest.java @@ -39,13 +39,14 @@ void testJavaUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, Wi .withBody(readAndResolve(PATH_INTEGRATION_TEST.resolve("JavaUrlUpdater").resolve("java-version.json"), wmRuntimeInfo)))); stubFor(any(urlMatching( - "/temurin[0-9]*-binaries/releases/download/jdk-[0-9A-Z.%]+/OpenJDK[0-9U]*-jdk_(x64|aarch64)_(windows|linux|mac)_hotspot_[0-9._]+\\.(zip|tar\\.gz)")).willReturn( + "/temurin[0-9]*-binaries/releases/download/jdk-[0-9A-Z.%]+/OpenJDK[0-9U]*-jdk_(x64|aarch64)_(windows|linux|mac)" + + "_hotspot_[0-9._]+\\.(zip|tar\\.gz)")).willReturn( aResponse().withStatus(200).withBody(DOWNLOAD_CONTENT))); UrlRepository urlRepository = UrlRepository.load(tempDir); JavaUrlUpdaterMock updater = new JavaUrlUpdaterMock(wmRuntimeInfo.getHttpBaseUrl()); // when - updater.update(urlRepository); + update(updater, urlRepository); Path javaEditionPath = tempDir.resolve("java").resolve("java"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/mvnd/MvndUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/mvnd/MvndUrlUpdaterTest.java index f25702801e..afb86e4447 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/mvnd/MvndUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/mvnd/MvndUrlUpdaterTest.java @@ -45,7 +45,7 @@ void testMvndJsonUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir MvndUrlUpdater updater = new MvndUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/maven/mvnd/", wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertUrlVersionOsX64MacArm(tempDir.resolve("mvnd").resolve("mvnd").resolve("1.0.5")); @@ -71,7 +71,7 @@ void testMvndJsonUrlUpdaterFilterOldVersions(@TempDir Path tempDir, WireMockRunt MvndUrlUpdater updater = new MvndUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/maven/mvnd/", wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path mvndOldVersionPath = tempDir.resolve("mvnd").resolve("mvnd").resolve("1.0.0"); @@ -98,7 +98,7 @@ void testMvndJsonUrlUpdaterAcceptsReleaseCandidate(@TempDir Path tempDir, WireMo MvndUrlUpdater updater = new MvndUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/maven/mvnd/", wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path mvndRcVersionPath = tempDir.resolve("mvnd").resolve("mvnd").resolve("2.0.0-rc-3"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ng/NgUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ng/NgUrlUpdaterTest.java index 44f4d47aa8..82e0992e16 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ng/NgUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ng/NgUrlUpdaterTest.java @@ -44,7 +44,7 @@ void testNgJsonUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, NgUrlUpdater updater = new NgUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/"); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertUrlVersionAgnostic(tempDir.resolve("ng").resolve("ng").resolve("20.1.6")); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/npm/NpmUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/npm/NpmUrlUpdaterTest.java index 82923935d2..c1e508aaac 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/npm/NpmUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/npm/NpmUrlUpdaterTest.java @@ -44,7 +44,7 @@ void testNpmJsonUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, NpmUrlUpdater updater = new NpmUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/"); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertUrlVersionAgnostic(tempDir.resolve("npm").resolve("npm").resolve("1.2.32")); @@ -75,7 +75,7 @@ void testNpmJsonUrlUpdaterWithMissingDownloadsDoesNotCreateVersionFolder(@TempDi NpmUrlUpdater updater = new NpmUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/"); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertThat(tempDir.resolve("npm").resolve("npm").resolve("99.99.99")).doesNotExist(); @@ -101,7 +101,7 @@ void testNpmJsonUrlUpdaterFilteredVersionCreateVersionFolder(@TempDir Path tempD NpmUrlUpdater updater = new NpmUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/"); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path npmVersionsPath = tempDir.resolve("npm").resolve("npm").resolve("2.0.0-beta.0"); @@ -129,7 +129,7 @@ void testNpmJsonUrlUpdaterGeneratesChecksum(@TempDir Path tempDir, WireMockRunti NpmUrlUpdater updater = new NpmUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/"); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertUrlVersionAgnostic(tempDir.resolve("npm").resolve("npm").resolve("1.1.25")); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pgadmin/PgAdminUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pgadmin/PgAdminUrlUpdaterTest.java index 84f75d929f..276d167757 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pgadmin/PgAdminUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pgadmin/PgAdminUrlUpdaterTest.java @@ -39,7 +39,7 @@ void testPgAdminUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, UrlRepository urlRepository = UrlRepository.load(tempDir); PgAdminUrlUpdater updater = new PgAdminUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path pgadminEditionPath = tempDir.resolve("pgadmin").resolve("pgadmin"); @@ -50,4 +50,3 @@ void testPgAdminUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, } } } - diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java index 8bbdf7dca0..5f68a353e7 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pip/PipUrlUpdaterTest.java @@ -48,7 +48,7 @@ void testPipUrlUpdaterWithTextContentTypeWillSucceed(@TempDir Path tempDir, Wire String versionName = "1.0"; // act - updater.update(urlRepository); + update(updater, urlRepository); Path versionsPath = tempDir.resolve(toolName).resolve(editionName).resolve(versionName); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pycharm/PycharmUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pycharm/PycharmUrlUpdaterTest.java index 19f7c0204b..03e0af4eac 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pycharm/PycharmUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/pycharm/PycharmUrlUpdaterTest.java @@ -65,7 +65,7 @@ void testPycharmJsonUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path temp PycharmUrlUpdater updater = new PycharmUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path pycharmToolDir = tempDir.resolve("pycharm"); @@ -99,7 +99,7 @@ void testPycharmJsonUrlUpdaterWithMissingDownloadsDoesNotCreateVersionFolder(@Te PycharmUrlUpdater updater = new PycharmUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // when - updater.update(urlRepository); + update(updater, urlRepository); Path pycharmVersionsPath = tempDir.resolve("pycharm").resolve("pycharm").resolve(VERSION_2024_3_5); @@ -127,7 +127,7 @@ void testPycharmJsonUrlUpdaterWithMissingChecksumGeneratesChecksum(@TempDir Path PycharmUrlUpdater updater = new PycharmUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); Path pycharmVersionsPath = tempDir.resolve("pycharm").resolve("pycharm").resolve(VERSION_2024_3_5); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/quarkus/QuarkusUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/quarkus/QuarkusUrlUpdaterTest.java index 2b076f87a4..6bd1adfb5d 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/quarkus/QuarkusUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/quarkus/QuarkusUrlUpdaterTest.java @@ -38,7 +38,7 @@ void testQuarkusUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, UrlRepository urlRepository = UrlRepository.load(tempDir); QuarkusUrlUpdater updater = new QuarkusUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path quarkusEditionPath = tempDir.resolve("quarkus").resolve("quarkus"); @@ -48,4 +48,3 @@ void testQuarkusUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, } } } - diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyJdxUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyJdxUrlUpdaterTest.java index a117f3d804..52f89d6ffd 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyJdxUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyJdxUrlUpdaterTest.java @@ -54,7 +54,7 @@ void testRubyJdxUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeI new RubyJdxUrlUpdater(wmRuntimeInfo.getHttpBaseUrl(), wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path rubyVersionDir = tempDir.resolve("ruby").resolve("ruby").resolve("4.0.6-1"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyUrlUpdaterTest.java index 57e9708621..fc3652f3ec 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/ruby/RubyUrlUpdaterTest.java @@ -51,7 +51,7 @@ void testRubyUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeInfo RubyUrlUpdater updater = new RubyUrlUpdater(wmRuntimeInfo.getHttpBaseUrl(), wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path rubyVersionDir = tempDir.resolve("ruby").resolve("ruby").resolve("2.5.3-1"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/rust/RustUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/rust/RustUrlUpdaterTest.java index a3a54c85e3..dd8afe1304 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/rust/RustUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/rust/RustUrlUpdaterTest.java @@ -34,7 +34,7 @@ void testRustGithubUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRunti RustUrlUpdater updater = new RustUrlUpdater(wmRuntimeInfo.getHttpBaseUrl() + "/rustup.sh", wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path rustEditionDir = tempDir.resolve("rust").resolve("rust"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/soapui/SoapUiUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/soapui/SoapUiUpdaterTest.java index 4e60e8da50..83a7ebcf1b 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/soapui/SoapUiUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/soapui/SoapUiUpdaterTest.java @@ -43,7 +43,7 @@ void testSoapUiUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeIn SoapUiUrlUpdater updater = new SoapUiUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); //act - updater.update(urlRepository); + update(updater, urlRepository); //assert Path soapUiVersionDir = tempDir.resolve("soapui").resolve("soapui"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/sonar/SonarUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/sonar/SonarUrlUpdaterTest.java index 94e185ba22..56195b46a0 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/sonar/SonarUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/sonar/SonarUrlUpdaterTest.java @@ -37,7 +37,7 @@ void testSonarUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, W UrlRepository urlRepository = UrlRepository.load(tempDir); SonarUrlUpdater updater = new SonarUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path sonarEditionPath = tempDir.resolve("sonar").resolve("sonar"); @@ -47,4 +47,3 @@ void testSonarUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, W } } } - diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/squirrelsql/SquirrelSqlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/squirrelsql/SquirrelSqlUpdaterTest.java index 5931419c26..f0cb3924b6 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/squirrelsql/SquirrelSqlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/squirrelsql/SquirrelSqlUpdaterTest.java @@ -48,7 +48,7 @@ void testSquirrelSqlUrlUpdater(@TempDir Path tempDir, WireMockRuntimeInfo wmRunt SquirrelSqlUrlUpdater updater = new SquirrelSqlUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path squirrelSqlDir = tempDir.resolve("squirrel-sql").resolve("squirrel-sql"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/terraform/TerraformUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/terraform/TerraformUrlUpdaterTest.java index ef15734c47..1be526168a 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/terraform/TerraformUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/terraform/TerraformUrlUpdaterTest.java @@ -38,7 +38,7 @@ void testTerraformUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDi UrlRepository urlRepository = UrlRepository.load(tempDir); TerraformUrlUpdater updater = new TerraformUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path terraformEditionPath = tempDir.resolve("terraform").resolve("terraform"); @@ -48,4 +48,3 @@ void testTerraformUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDi } } } - diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/tomcat/TomcatUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/tomcat/TomcatUrlUpdaterTest.java index 4aee853fb9..d47ca6d2e9 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/tomcat/TomcatUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/tomcat/TomcatUrlUpdaterTest.java @@ -38,7 +38,7 @@ void testTomcatUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, UrlRepository urlRepository = UrlRepository.load(tempDir); TomcatUrlUpdater updater = new TomcatUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // when - updater.update(urlRepository); + update(updater, urlRepository); Path tomcat100 = tempDir.resolve("tomcat").resolve("tomcat").resolve("10.0.0"); Path tomcat101 = tempDir.resolve("tomcat").resolve("tomcat").resolve("10.0.1"); @@ -48,4 +48,3 @@ void testTomcatUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, assertUrlVersionAgnostic(tomcat101); } } - diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/uv/UvUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/uv/UvUrlUpdaterTest.java index 0937cd5332..12a48883fa 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/uv/UvUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/uv/UvUrlUpdaterTest.java @@ -38,7 +38,7 @@ void testUvUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, Wire UrlRepository urlRepository = UrlRepository.load(tempDir); UvUrlUpdater updater = new UvUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert Path uvEditionPath = tempDir.resolve("uv").resolve("uv"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodeUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodeUrlUpdaterTest.java index 9c7ffc71f2..ffb7b2dfa0 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodeUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodeUrlUpdaterTest.java @@ -38,7 +38,7 @@ void testVsCodeUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, UrlRepository urlRepository = UrlRepository.load(tempDir); VsCodeUrlUpdater updater = new VsCodeUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // when - updater.update(urlRepository); + update(updater, urlRepository); Path vscode120 = tempDir.resolve("vscode").resolve("vscode").resolve("1.20.0"); Path vscode121 = tempDir.resolve("vscode").resolve("vscode").resolve("1.21.0"); @@ -48,4 +48,3 @@ void testVsCodeUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, assertUrlVersionOsX64(vscode121); } } - diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java index 26afc1a95e..b61d951290 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java @@ -39,7 +39,7 @@ void testVsCodiumUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir UrlRepository urlRepository = UrlRepository.load(tempDir); VsCodiumUrlUpdater updater = new VsCodiumUrlUpdater(wmRuntimeInfo.getHttpBaseUrl()); // when - updater.update(urlRepository); + update(updater, urlRepository); Path vscodium1 = tempDir.resolve("vscode").resolve("vscodium").resolve("1.92.1.24228"); Path vscodium2 = tempDir.resolve("vscode").resolve("vscodium").resolve("1.116.02821"); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java index 9a8fa61581..e1542cc594 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/AbstractUrlUpdaterTest.java @@ -11,6 +11,7 @@ import com.devonfw.tools.ide.url.model.folder.UrlRepository; import com.devonfw.tools.ide.url.model.folder.UrlTool; import com.devonfw.tools.ide.url.model.folder.UrlVersion; +import com.devonfw.tools.ide.url.model.report.UrlFinalReport; import com.devonfw.tools.ide.url.updater.status.StatusJson; import com.devonfw.tools.ide.url.updater.status.UrlStatusFile; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; @@ -63,6 +64,20 @@ protected StatusJson retrieveStatusJson(UrlRepository urlRepository, String tool return new UrlStatusFile(statusPath).getStatusJson(); } + /** + * Runs the given updater on the given repository and saves the resulting status files (wiring an {@link UpdateManager} like the production code does). + * + * @param updater the {@link AbstractUrlUpdater} to run. + * @param urlRepository the {@link UrlRepository} to update. + */ + protected void update(AbstractUrlUpdater updater, UrlRepository urlRepository) { + + UpdateManager updateManager = new UpdateManager(urlRepository.getPath(), urlRepository.getPath(), new UrlFinalReport(), null); + updater.setUpdateManager(updateManager); + updater.update(urlRepository); + updateManager.saveStatusFiles(); + } + protected void assertUrlVersionAgnostic(Path urlVersionFolder) { assertUrlVersion(urlVersionFolder, OsAndArchitecture.AGNOSTIC.getFilenames()); diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java index ca069d15c3..32b4bc1ab3 100644 --- a/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/updater/UrlUpdaterTest.java @@ -54,7 +54,7 @@ void testUrlUpdaterMissingOsGetsAddedAutomatically(@TempDir Path tempDir, WireMo UrlUpdaterMock updater = new UrlUpdaterMock(wmRuntimeInfo); // when - updater.update(urlRepository); + update(updater, urlRepository); Path versionsPath = tempDir.resolve("mocked").resolve("mocked").resolve("1.0"); @@ -74,7 +74,7 @@ void testUrlUpdaterMissingOsGetsAddedAutomatically(@TempDir Path tempDir, WireMo // re-initialize UrlRepository UrlRepository urlRepositoryNew = UrlRepository.load(tempDir); - updater.update(urlRepositoryNew); + update(updater, urlRepositoryNew); assertThat(versionsPath.resolve("linux_x64.urls")).exists(); assertThat(versionsPath.resolve("linux_x64.urls.sha256")).exists(); @@ -91,7 +91,7 @@ void testUrlUpdaterIsNotUpdatingWhenStatusManualIsTrue(@TempDir Path tempDir, Wi UrlUpdaterMockSingle updater = new UrlUpdaterMockSingle(wmRuntimeInfo); // act - updater.update(urlRepository); + update(updater, urlRepository); Path versionsPath = Path.of(TEST_DATA_ROOT).resolve("mocked").resolve("mocked").resolve("1.0"); // assert @@ -140,7 +140,7 @@ void testStatusJsonUpdateOnFirstError(@TempDir Path tempDir, WireMockRuntimeInfo stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(404))); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert StatusJson statusJson = retrieveStatusJson(urlRepository, toolName, editionName, versionName); @@ -198,7 +198,7 @@ void testSuccessStateUpdatedAfterError(@TempDir Path tempDir, WireMockRuntimeInf stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(200).withHeader("Content-Type", "text/plain"))); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert status = retrieveStatusJson(urlRepository, toolName, editionName, versionName).getStatus(url); @@ -253,7 +253,7 @@ void testVersionRemovedIfErrorPersists(@TempDir Path tempDir, WireMockRuntimeInf stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(404))); // act - updater.update(urlRepository); + update(updater, urlRepository); // assert assertThat(urlVersion.getPath()).doesNotExist(); @@ -277,7 +277,7 @@ void testUrlUpdaterWithTextContentTypeWillNotCreateStatusJson(@TempDir Path temp UrlUpdaterMockSingle updater = new UrlUpdaterMockSingle(wmRuntimeInfo); // when - updater.update(urlRepository); + update(updater, urlRepository); Path versionsPath = tempDir.resolve("mocked").resolve("mocked").resolve("1.0"); @@ -301,7 +301,7 @@ void testUrlUpdaterWithOnlyLatestVersion(@TempDir Path tempDir, WireMockRuntimeI updater.setVersion("latest"); // when - updater.update(urlRepository); + update(updater, urlRepository); // then Path versionsPath = tempDir.resolve("mocked").resolve("mocked").resolve("latest");