From 60bb713082ebb122b54fa52b1808184729910589 Mon Sep 17 00:00:00 2001 From: mbilda Date: Fri, 7 Mar 2025 14:56:25 +0100 Subject: [PATCH 1/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - deleted the new line patterns out of the regex in DockerDesktopUrlUpdater because Pattern.DOTALL already handles this --- .../tools/ide/tool/docker/DockerDesktopUrlUpdater.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/DockerDesktopUrlUpdater.java b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/DockerDesktopUrlUpdater.java index f4dd68754..48f0e4692 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/DockerDesktopUrlUpdater.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/DockerDesktopUrlUpdater.java @@ -31,13 +31,13 @@ protected void addVersion(UrlVersion urlVersion) { // get Code for version String body = doGetResponseBodyAsString("https://docs.docker.com/desktop/release-notes/"); String regex = "href=#" + version - // .......1.........................................................2................. - + ".{8,12}(\r\n|\r|\n).{0,350}href=https://desktop\\.docker\\.com.*?(\\d{5,6}).*\\.exe"; + // .....................................................(Group.1.).......... + + ".{8,12}.{0,350}href=https://desktop\\.docker\\.com.*?(\\d{5,6}).*\\.exe"; Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); Matcher matcher = pattern.matcher(body); String code; if (matcher.find()) { - code = matcher.group(2); + code = matcher.group(1); boolean success = doAddVersion(urlVersion, "https://desktop.docker.com/win/main/amd64/" + code + "/Docker%20Desktop%20Installer.exe", WINDOWS); if (!success) { From 331047132a8eb2f048b66b21bb4773bea06d158d Mon Sep 17 00:00:00 2001 From: mbilda Date: Tue, 11 Mar 2025 13:55:47 +0100 Subject: [PATCH 2/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - Added a fallback for "*" (Latest) - Version to be found in the filesystem - Added a fallback to name the downloadcache file to latest if version is "*" (latest) --- .../tools/ide/tool/repository/AbstractToolRepository.java | 8 ++++++-- .../tools/ide/url/model/folder/AbstractUrlFolder.java | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java b/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java index 086ed9681..8b32ede36 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java @@ -27,7 +27,7 @@ public abstract class AbstractToolRepository implements ToolRepository { private static final int MAX_TEMP_DOWNLOADS = 9; - + /** The owning {@link IdeContext}. */ protected final IdeContext context; @@ -135,7 +135,11 @@ protected String createDownloadFilename(String tool, String edition, VersionIden StringBuilder sb = new StringBuilder(32); sb.append(tool); sb.append("-"); - sb.append(version); + if (version.equals(VersionIdentifier.LATEST)) { + sb.append("latest"); + } else { + sb.append(version); + } if (!edition.equals(tool)) { sb.append("-"); sb.append(edition); diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java index 2daa4f1c8..e607c11c6 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java +++ b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java @@ -58,7 +58,7 @@ public int getChildCount() { public C getChild(String name) { load(false); - return this.childMap.get(name); + return name.equals("*") ? this.childMap.get("latest") : this.childMap.get(name); } @Override From 2037ae20c3d885c76eccf8e7370f870f5822335d Mon Sep 17 00:00:00 2001 From: mbilda Date: Tue, 11 Mar 2025 16:34:08 +0100 Subject: [PATCH 3/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - Changed order to prevent nullpointer - changed structure to if-else --- .../tools/ide/tool/repository/AbstractToolRepository.java | 2 +- .../tools/ide/url/model/folder/AbstractUrlFolder.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java b/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java index 8b32ede36..bb9b679dd 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/repository/AbstractToolRepository.java @@ -135,7 +135,7 @@ protected String createDownloadFilename(String tool, String edition, VersionIden StringBuilder sb = new StringBuilder(32); sb.append(tool); sb.append("-"); - if (version.equals(VersionIdentifier.LATEST)) { + if (VersionIdentifier.LATEST.equals(version)) { sb.append("latest"); } else { sb.append(version); diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java index e607c11c6..de0b81f1d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java +++ b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java @@ -58,7 +58,10 @@ public int getChildCount() { public C getChild(String name) { load(false); - return name.equals("*") ? this.childMap.get("latest") : this.childMap.get(name); + if (name.equals("*")) { + return this.childMap.get("latest"); + } + return this.childMap.get(name); } @Override From be49cea9993c55d95d8970bb6fd75a14c17948d8 Mon Sep 17 00:00:00 2001 From: mbilda Date: Wed, 12 Mar 2025 10:12:01 +0100 Subject: [PATCH 4/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - Changed order to prevent nullpointer --- .../devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java index de0b81f1d..fed985b67 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java +++ b/cli/src/main/java/com/devonfw/tools/ide/url/model/folder/AbstractUrlFolder.java @@ -58,7 +58,7 @@ public int getChildCount() { public C getChild(String name) { load(false); - if (name.equals("*")) { + if ("*".equals(name)) { return this.childMap.get("latest"); } return this.childMap.get(name); From 56f1c73805680b50f1e25e0958c68828854c9f51 Mon Sep 17 00:00:00 2001 From: mbilda Date: Thu, 13 Mar 2025 11:55:07 +0100 Subject: [PATCH 5/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - Added test for only latest version --- .../tools/ide/tool/UrlUpdaterMockLatest.java | 38 +++++++++++++++++++ .../tools/ide/tool/UrlUpdaterTest.java | 28 ++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java new file mode 100644 index 000000000..533383f34 --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java @@ -0,0 +1,38 @@ +package com.devonfw.tools.ide.tool; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.devonfw.tools.ide.url.model.folder.UrlVersion; +import com.devonfw.tools.ide.url.updater.UrlUpdater; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; + +/** + * Test mock for {@link UrlUpdater} using a single tool, the latest version and distribution. + */ +public class UrlUpdaterMockLatest extends UrlUpdaterMock { + + private static final Set versions = new HashSet<>(List.of("latest")); + + /** + * The constructor + * + * @param wmRuntimeInfo the {@link WireMockRuntimeInfo} holding the http url and port of the wiremock server. + */ + public UrlUpdaterMockLatest(WireMockRuntimeInfo wmRuntimeInfo) { + + super(wmRuntimeInfo); + } + + @Override + protected Set getVersions() { + return versions; + } + + @Override + protected void addVersion(UrlVersion urlVersion) { + doAddVersion(urlVersion, wmRuntimeInfo.getHttpBaseUrl() + "/os/windows_x64_url.tgz", WINDOWS, X64, "123"); + } + +} diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java index b312a98a5..94f5a45cc 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -17,6 +18,7 @@ import com.devonfw.tools.ide.os.OperatingSystem; import com.devonfw.tools.ide.os.SystemArchitecture; +import com.devonfw.tools.ide.tool.docker.DockerDesktopUrlUpdater; 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; @@ -36,6 +38,17 @@ @WireMockTest public class UrlUpdaterTest extends AbstractUrlUpdaterTest { + @Test + public void testUpdateDockerUrl() { + String testdataRoot = "src/test/resources/UpdateManager/versions"; + Path repoPath = Paths.get(testdataRoot); + UrlRepository urlRepository = UrlRepository.load(repoPath); + DockerDesktopUrlUpdater updater = new DockerDesktopUrlUpdater(); + + updater.update(urlRepository); + + } + /** * Test resource location */ @@ -280,4 +293,19 @@ public void testUrlUpdaterWithTextContentTypeWillNotCreateStatusJson(@TempDir Pa } + @Test + public void testUrlUpdaterWithOnlyLatestVersion(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeInfo) { + //given + stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(200).withBody("aBody"))); + UrlRepository urlRepository = UrlRepository.load(tempDir); + UrlUpdaterMockLatest updater = new UrlUpdaterMockLatest(wmRuntimeInfo); + + // when + updater.update(urlRepository); + + // then + Path versionsPath = tempDir.resolve("mocked").resolve("mocked").resolve("latest"); + assertThat(versionsPath.resolve("status.json")).exists(); + } + } From a1046cc5c32bfa2b6d1139404ce25c476067d883 Mon Sep 17 00:00:00 2001 From: mbilda Date: Thu, 13 Mar 2025 14:04:25 +0100 Subject: [PATCH 6/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - Refactored UrlUpdaterMockSingle to modify the verion which should be tested - deleted temporary test case --- .../tools/ide/tool/UrlUpdaterMockLatest.java | 38 ------------------- .../tools/ide/tool/UrlUpdaterMockSingle.java | 11 +++++- .../tools/ide/tool/UrlUpdaterTest.java | 22 ++++------- 3 files changed, 18 insertions(+), 53 deletions(-) delete mode 100644 cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java deleted file mode 100644 index 533383f34..000000000 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockLatest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.devonfw.tools.ide.tool; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import com.devonfw.tools.ide.url.model.folder.UrlVersion; -import com.devonfw.tools.ide.url.updater.UrlUpdater; -import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; - -/** - * Test mock for {@link UrlUpdater} using a single tool, the latest version and distribution. - */ -public class UrlUpdaterMockLatest extends UrlUpdaterMock { - - private static final Set versions = new HashSet<>(List.of("latest")); - - /** - * The constructor - * - * @param wmRuntimeInfo the {@link WireMockRuntimeInfo} holding the http url and port of the wiremock server. - */ - public UrlUpdaterMockLatest(WireMockRuntimeInfo wmRuntimeInfo) { - - super(wmRuntimeInfo); - } - - @Override - protected Set getVersions() { - return versions; - } - - @Override - protected void addVersion(UrlVersion urlVersion) { - doAddVersion(urlVersion, wmRuntimeInfo.getHttpBaseUrl() + "/os/windows_x64_url.tgz", WINDOWS, X64, "123"); - } - -} diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockSingle.java b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockSingle.java index b31272829..8c79899d8 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockSingle.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterMockSingle.java @@ -13,7 +13,7 @@ */ public class UrlUpdaterMockSingle extends UrlUpdaterMock { - private static final Set versions = new HashSet<>(List.of("1.0")); + private static Set versions = new HashSet<>(List.of("1.0")); /** * The constructor @@ -30,6 +30,15 @@ protected Set getVersions() { return versions; } + /** + * Enables the possibility to change the version which should be tested. + * + * @param newVersion the new Version to be set. + */ + protected void setVersion(final String newVersion) { + versions = Set.of(newVersion); + } + @Override protected void addVersion(UrlVersion urlVersion) { doAddVersion(urlVersion, wmRuntimeInfo.getHttpBaseUrl() + "/os/windows_x64_url.tgz", WINDOWS, X64, "123"); diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java index 94f5a45cc..2ee8d8dec 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/UrlUpdaterTest.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -18,7 +17,6 @@ import com.devonfw.tools.ide.os.OperatingSystem; import com.devonfw.tools.ide.os.SystemArchitecture; -import com.devonfw.tools.ide.tool.docker.DockerDesktopUrlUpdater; 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; @@ -38,17 +36,6 @@ @WireMockTest public class UrlUpdaterTest extends AbstractUrlUpdaterTest { - @Test - public void testUpdateDockerUrl() { - String testdataRoot = "src/test/resources/UpdateManager/versions"; - Path repoPath = Paths.get(testdataRoot); - UrlRepository urlRepository = UrlRepository.load(repoPath); - DockerDesktopUrlUpdater updater = new DockerDesktopUrlUpdater(); - - updater.update(urlRepository); - - } - /** * Test resource location */ @@ -293,12 +280,19 @@ public void testUrlUpdaterWithTextContentTypeWillNotCreateStatusJson(@TempDir Pa } + /** + * Tests if the {@link com.devonfw.tools.ide.url.updater.UrlUpdater} will handle the literally latest version of a tool correctly + * + * @param tempDir Temporary directory + * @param wmRuntimeInfo wireMock server on a random port + */ @Test public void testUrlUpdaterWithOnlyLatestVersion(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeInfo) { //given stubFor(any(urlMatching("/os/.*")).willReturn(aResponse().withStatus(200).withBody("aBody"))); UrlRepository urlRepository = UrlRepository.load(tempDir); - UrlUpdaterMockLatest updater = new UrlUpdaterMockLatest(wmRuntimeInfo); + UrlUpdaterMockSingle updater = new UrlUpdaterMockSingle(wmRuntimeInfo); + updater.setVersion("latest"); // when updater.update(urlRepository); From ff8fe15738d4d246b107b734a830c196a6158149 Mon Sep 17 00:00:00 2001 From: mbilda Date: Thu, 13 Mar 2025 14:14:00 +0100 Subject: [PATCH 7/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - Updated CHANGELOG.adoc --- CHANGELOG.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index c2acecfcb..d44c54afd 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -6,6 +6,9 @@ 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/692[#692]: "Latest" version of Docker causes installation problems + + The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/24?closed=1[milestone 2025.03.002]. == 2025.03.001 From c2d0e2bd8f5ece04a78c8623f609470d7b606e0b Mon Sep 17 00:00:00 2001 From: mbilda Date: Mon, 17 Mar 2025 16:36:27 +0100 Subject: [PATCH 8/8] https://github.com/devonfw/IDEasy/issues/692 : "Latest" version of Docker causes installation problems - Refactored DockerDesktopUrlUpdater to verify each version before downloading --- .../tool/docker/DockerDesktopUrlUpdater.java | 97 ++++++++++++++++--- 1 file changed, 81 insertions(+), 16 deletions(-) diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java index bcd61e7c3..6000fcbcc 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java @@ -1,5 +1,7 @@ package com.devonfw.tools.ide.url.tool.docker; +import static java.lang.String.format; + import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -17,6 +19,21 @@ public class DockerDesktopUrlUpdater extends WebsiteUrlUpdater { VersionIdentifier.of("4.4.3"), VersionIdentifier.of("4.4.4"), VersionIdentifier.of("4.17.1"), VersionIdentifier.of("4.5.1")); + private final static String DOCKER_RELEASE_NOTES_URL = "https://docs.docker.com/desktop/release-notes/"; + + private final static String REGEX_FOR_DOCKER_VERSION = + "href=#%s" // Find the href with the readable version - %s provided by urlVersion + + ".{0,300}" // We have to look in close range for the next part (docker lists a summary at top. If this range is to big + // we'll find the latest listed version with download links that doesn't match the version we are looking for + + "href=https://desktop\\.docker\\.com" // Start of download link + + ".*?" // We don't care if its windows or mac - match as least as possible characters + + "(\\d{5,6})"; // Associated docker-version to readable version we are looking for + private final static String REGEX_FOR_DOWNLOAD_URLS = "https://desktop.docker.com/%s/main/%s/%s/"; + private final static String WIN_VERSION = "win"; + private final static String MAC_VERSION = "mac"; + private final static String AMD_ARCH_TYPE = "amd64"; + private final static String ARM_ARCH_TYPE = "arm64"; + @Override protected String getTool() { @@ -29,31 +46,79 @@ protected void addVersion(UrlVersion urlVersion) { VersionIdentifier vid = VersionIdentifier.of(urlVersion.getName()); String version = urlVersion.getName().replaceAll("\\.", ""); // get Code for version - String body = doGetResponseBodyAsString("https://docs.docker.com/desktop/release-notes/"); - String regex = "href=#" + version - // .....................................................(Group.1.).......... - + ".{8,12}.{0,350}href=https://desktop\\.docker\\.com.*?(\\d{5,6}).*\\.exe"; - Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); - Matcher matcher = pattern.matcher(body); + String body = doGetResponseBodyAsString(DOCKER_RELEASE_NOTES_URL); + String regexForDockerVersion = format(REGEX_FOR_DOCKER_VERSION, version); + Pattern patternForDockerVersion = Pattern.compile(regexForDockerVersion, Pattern.DOTALL); + Matcher matcherForDockerVersion = patternForDockerVersion.matcher(body); String code; - if (matcher.find()) { - code = matcher.group(1); - boolean success = doAddVersion(urlVersion, - "https://desktop.docker.com/win/main/amd64/" + code + "/Docker%20Desktop%20Installer.exe", WINDOWS); - if (!success) { - return; - } + if (matcherForDockerVersion.find()) { + code = matcherForDockerVersion.group(1); + addVersionsForWindows(urlVersion, code, body); if (!WINDOWS_ONLY_VERSIONS.stream().anyMatch(i -> vid.compareVersion(i).isEqual())) { - doAddVersion(urlVersion, "https://desktop.docker.com/mac/main/amd64/" + code + "/Docker.dmg", MAC, X64); - doAddVersion(urlVersion, "https://desktop.docker.com/mac/main/arm64/" + code + "/Docker.dmg", MAC, ARM64); + addVersionsForMac(urlVersion, code, body); } } } + /** + * Adds the windows versions for docker if they exist + * + * @param urlVersion the readable version e.g. 4332 (4.33.2) + * @param dockerVersion the associated docker version to readable version e.g. 179689 + * @param body the html body to search in + */ + private void addVersionsForWindows(UrlVersion urlVersion, String dockerVersion, String body) { + boolean versionExists = checkIfVersionExists(dockerVersion, body, WIN_VERSION, AMD_ARCH_TYPE); + if (versionExists) { + doAddVersion(urlVersion, "https://desktop.docker.com/win/main/amd64/" + dockerVersion + "/Docker%20Desktop%20Installer.exe", WINDOWS, X64); + } + versionExists = checkIfVersionExists(dockerVersion, body, WIN_VERSION, ARM_ARCH_TYPE); + if (versionExists) { + doAddVersion(urlVersion, "https://desktop.docker.com/win/main/arm64/" + dockerVersion + "/Docker%20Desktop%20Installer.exe", WINDOWS, ARM64); + } + } + + /** + * Adds the mac versions for docker if they exist + * + * @param urlVersion the readable version e.g. 4332 (4.33.2) + * @param dockerVersion the associated docker version to readable version e.g. 179689 + * @param body the html body to search in + */ + private void addVersionsForMac(UrlVersion urlVersion, String dockerVersion, String body) { + boolean versionExists = checkIfVersionExists(dockerVersion, body, MAC_VERSION, AMD_ARCH_TYPE); + if (versionExists) { + doAddVersion(urlVersion, "https://desktop.docker.com/mac/main/amd64/" + dockerVersion + "/Docker.dmg", MAC, X64); + } + versionExists = checkIfVersionExists(dockerVersion, body, MAC_VERSION, ARM_ARCH_TYPE); + if (versionExists) { + doAddVersion(urlVersion, "https://desktop.docker.com/mac/main/arm64/" + dockerVersion + "/Docker.dmg", MAC, ARM64); + } + } + + /** + * As docker is very inconsistent by releasing versions we have to check every single one if the download link exists to prevent failing downloads + * (403-errors) E.g. for only amd64 windows download link provided- 4.24.1 E.g. for no + * download links provided - 4.24.2 E.g. for only mac download links provided - 4.36.1 + * + * @param dockerVersion the associated docker version to readable version e.g. 179689 (4.33.2) + * @param body the html body to search in + * @param osVersion the os versions - win or mac + * @param archType the archType - amd64 or arm64 + * @return true if the version exists - false if not + */ + private boolean checkIfVersionExists(String dockerVersion, String body, String osVersion, String archType) { + String regexForDownloadUrlS = format(REGEX_FOR_DOWNLOAD_URLS, osVersion, archType, dockerVersion); + Pattern patternForDownloadUrls = Pattern.compile(regexForDownloadUrlS, Pattern.DOTALL); + Matcher matcherForDownloadUrls = patternForDownloadUrls.matcher(body); + return matcherForDownloadUrls.find(); + } + @Override protected String getVersionUrl() { - return "https://docs.docker.com/desktop/release-notes/"; + return DOCKER_RELEASE_NOTES_URL; } @Override