From bc8410c56e49571e07b691958ff3b1e82e39ff0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:26:56 +0000 Subject: [PATCH 1/2] Bump com.github.nbbrd.java-io-util:java-io-bom from 0.0.38 to 0.0.39 Bumps [com.github.nbbrd.java-io-util:java-io-bom](https://github.com/nbbrd/java-io-util) from 0.0.38 to 0.0.39. - [Release notes](https://github.com/nbbrd/java-io-util/releases) - [Changelog](https://github.com/nbbrd/java-io-util/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/java-io-util/compare/v0.0.38...v0.0.39) --- updated-dependencies: - dependency-name: com.github.nbbrd.java-io-util:java-io-bom dependency-version: 0.0.39 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- heylogs-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/heylogs-api/pom.xml b/heylogs-api/pom.xml index 79955b7..d115bd2 100644 --- a/heylogs-api/pom.xml +++ b/heylogs-api/pom.xml @@ -20,7 +20,7 @@ com.github.nbbrd.java-io-util java-io-bom - 0.0.38 + 0.0.39 pom import From 78c83e1e40aca398efbbf31d972601b81744a659 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Fri, 21 Aug 2026 10:12:55 +0200 Subject: [PATCH 2/2] Fix changes in dependency --- .../java/nbbrd/heylogs/spi/URLExtractor.java | 19 ++++++++- .../tests/heylogs/spi/PersistentResponse.java | 42 +++++++++++++++++++ .../heylogs/ext/forgejo/ForgejoBlobLink.java | 4 +- .../ext/forgejo/ForgejoCommitLink.java | 4 +- .../ext/forgejo/ForgejoCompareLink.java | 4 +- .../heylogs/ext/forgejo/ForgejoIssueLink.java | 9 ++-- .../ext/forgejo/ForgejoMentionLink.java | 6 +-- .../ext/forgejo/ForgejoMessageFetcher.java | 4 +- .../ext/forgejo/ForgejoProjectLink.java | 5 ++- .../ext/forgejo/ForgejoRequestLink.java | 9 ++-- .../heylogs/ext/forgejo/ForgejoTagLink.java | 4 +- .../forgejo/ForgejoMessageFetcherTest.java | 2 +- .../heylogs/ext/github/GitHubBlobLink.java | 4 +- .../heylogs/ext/github/GitHubCommitLink.java | 4 +- .../heylogs/ext/github/GitHubCompareLink.java | 4 +- .../heylogs/ext/github/GitHubIssueLink.java | 11 ++--- .../heylogs/ext/github/GitHubMentionLink.java | 6 +-- .../ext/github/GitHubMessageFetcher.java | 9 ++-- .../heylogs/ext/github/GitHubProjectLink.java | 5 ++- .../ext/github/GitHubRepositoryLink.java | 4 +- .../heylogs/ext/github/GitHubRequestLink.java | 11 ++--- .../heylogs/ext/github/GitHubTagLink.java | 4 +- .../ext/github/GitHubMessageFetcherTest.java | 2 +- .../heylogs/ext/gitlab/GitLabBlobLink.java | 4 +- .../heylogs/ext/gitlab/GitLabIssueLink.java | 10 +++-- .../heylogs/ext/gitlab/GitLabMentionLink.java | 4 +- .../ext/gitlab/GitLabMessageFetcher.java | 4 +- .../heylogs/ext/gitlab/GitLabProjectLink.java | 5 ++- .../ext/gitlab/GitLabRepositoryLink.java | 7 ++-- .../heylogs/ext/gitlab/GitLabRequestLink.java | 8 ++-- .../heylogs/ext/gitlab/GitLabSupport.java | 4 +- .../ext/gitlab/GitLabMessageFetcherTest.java | 2 +- .../heylogs/ext/http/DefaultHttpFactory.java | 41 +++++++++++------- .../nbbrd/heylogs/ext/rules/LinkRules.java | 8 ++-- .../heylogs/ext/rules/LinkRulesTest.java | 4 +- 35 files changed, 181 insertions(+), 96 deletions(-) create mode 100644 heylogs-api/src/test/java/tests/heylogs/spi/PersistentResponse.java diff --git a/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java b/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java index a9c0b42..ac4ddfc 100644 --- a/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java +++ b/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java @@ -1,6 +1,7 @@ package nbbrd.heylogs.spi; import lombok.NonNull; +import org.jspecify.annotations.Nullable; import java.io.UnsupportedEncodingException; import java.net.*; @@ -40,7 +41,7 @@ private static String decode(String o) { } } - public static @NonNull URL baseOf(@NonNull URL url) { + public static @NonNull URL baseOf(@NonNull URL url) throws IllegalArgumentException { try { return new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), null, null, null).toURL(); } catch (URISyntaxException | MalformedURLException ex) { @@ -56,6 +57,22 @@ private static String decode(String o) { } } + public static @Nullable URL urlOrNullOf(@NonNull CharSequence text) { + try { + return URI.create(text.toString()).toURL(); + } catch (Exception ignore) { + return null; + } + } + + public static @NonNull URI uriOf(@NonNull URL url) throws IllegalArgumentException { + try { + return url.toURI(); + } catch (URISyntaxException ex) { + throw new IllegalArgumentException(ex); + } + } + public static void checkPathLength(String[] pathArray, int... lengths) { if (IntStream.of(lengths).noneMatch(length -> length == pathArray.length)) { throw new IllegalArgumentException("Invalid path length: expecting " + Arrays.toString(lengths) + ", found " + pathArray.length); diff --git a/heylogs-api/src/test/java/tests/heylogs/spi/PersistentResponse.java b/heylogs-api/src/test/java/tests/heylogs/spi/PersistentResponse.java new file mode 100644 index 0000000..7a78e43 --- /dev/null +++ b/heylogs-api/src/test/java/tests/heylogs/spi/PersistentResponse.java @@ -0,0 +1,42 @@ +package tests.heylogs.spi; + +import lombok.NonNull; +import nbbrd.io.http.HttpHeaders; +import nbbrd.io.http.HttpResponse; +import nbbrd.io.net.MediaType; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +@lombok.Value(staticConstructor = "of") +public class PersistentResponse implements HttpResponse { + + @NonNull + MediaType contentType; + + @NonNull + HttpHeaders headers; + + @NonNull + String body; + + @Override + public long getContentLength() { + return body.getBytes(StandardCharsets.UTF_8).length; + } + + @Override + public int getStatusCode() { + return 200; + } + + @Override + public @NonNull InputStream getBody() { + return new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)); + } + + @Override + public void close() { + } +} diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java index 48c5bcd..7c4f420 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.BlobLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -64,7 +64,7 @@ class ForgejoBlobLink implements ForgejoProjectLink, BlobLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(SRC_KEYWORD).path(refType).path(branchName).path(filePath).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(SRC_KEYWORD).path(refType).path(branchName).path(filePath).toString(); } @Override diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java index 216ef6d..5d9c0aa 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java @@ -6,7 +6,7 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -47,7 +47,7 @@ class ForgejoCommitLink implements ForgejoProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString(); } @Override diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java index 5b5bb89..e6517a5 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java @@ -8,7 +8,7 @@ import nbbrd.heylogs.spi.CompareLink; import nbbrd.heylogs.spi.ForgeRef; import nbbrd.heylogs.spi.ProjectLink; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -58,7 +58,7 @@ class ForgejoCompareLink implements CompareLink, ForgejoProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString(); } @Override diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java index c371f69..aef8b95 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java @@ -6,7 +6,7 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.MalformedURLException; @@ -39,10 +39,11 @@ class ForgejoIssueLink implements ForgejoProjectLink { public static @NonNull ForgejoIssueLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) { try { return parse( - URLQueryBuilder.of(projectUrl) + UriQueryBuilder.of(uriOf(projectUrl)) .path(ISSUES_KEYWORD) .path(String.valueOf(ForgejoIssueRef.parse(ref).getIssueNumber())) - .build()); + .build() + .toURL()); } catch ( MalformedURLException ex) { throw new RuntimeException(ex); @@ -63,7 +64,7 @@ class ForgejoIssueLink implements ForgejoProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString(); } @Override diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java index fca9a76..c996593 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -54,8 +54,8 @@ class ForgejoMentionLink implements ForgeLink { @Override public String toString() { return isUser() - ? URLQueryBuilder.of(base).path(user).toString() - : URLQueryBuilder.of(base).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString(); + ? UriQueryBuilder.of(uriOf(base)).path(user).toString() + : UriQueryBuilder.of(uriOf(base)).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString(); } @Override diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java index a7f958b..0d9f3ec 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java @@ -8,6 +8,8 @@ import nbbrd.heylogs.spi.ForgeLink; import nbbrd.heylogs.spi.MessageFetcher; import nbbrd.io.http.*; +import nbbrd.io.http.ext.ThrowingStatusException; +import nbbrd.io.http.urlconnection.UrlConnectionHttpClient; import nbbrd.io.net.MediaType; import java.io.IOException; @@ -62,7 +64,7 @@ URL buildApiUrl(@NonNull ForgeLink link) { .build(); try (HttpResponse response = client.send(request)) { return extractTitle(response.getBodyAsString()); - } catch (HttpResponseException ex) { + } catch (ThrowingStatusException ex) { throw new IOException("Forgejo API returned HTTP " + ex.getResponseCode() + " for " + request.getQuery()); } } diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java index a59dd5a..50ef9eb 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java @@ -2,11 +2,12 @@ import lombok.NonNull; import nbbrd.heylogs.spi.ProjectLink; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import java.net.URL; import java.util.regex.Pattern; +import static nbbrd.heylogs.spi.URLExtractor.uriOf; import static nbbrd.heylogs.spi.URLExtractor.urlOf; interface ForgejoProjectLink extends ProjectLink { @@ -22,7 +23,7 @@ interface ForgejoProjectLink extends ProjectLink { @Override default @NonNull URL getProjectURL() { - return urlOf(URLQueryBuilder.of(getBase()).path(getOwner()).path(getRepo()).toString()); + return urlOf(UriQueryBuilder.of(uriOf(getBase())).path(getOwner()).path(getRepo()).toString()); } Pattern OWNER_PATTERN = Pattern.compile("[a-z\\d](?:[a-z\\d]|-(?=[a-z\\d])){0,38}", Pattern.CASE_INSENSITIVE); diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java index 8bb09e6..c96234b 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java @@ -6,7 +6,7 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.MalformedURLException; @@ -39,10 +39,11 @@ class ForgejoRequestLink implements ForgejoProjectLink { public static @NonNull ForgejoRequestLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) { try { return parse( - URLQueryBuilder.of(projectUrl) + UriQueryBuilder.of(uriOf(projectUrl)) .path(PULL_REQUEST_KEYWORD) .path(String.valueOf(ForgejoRequestRef.parse(ref).getRequestNumber())) - .build()); + .build() + .toURL()); } catch (MalformedURLException ex) { throw new RuntimeException(ex); } @@ -62,7 +63,7 @@ class ForgejoRequestLink implements ForgejoProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(issueNumber)).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(issueNumber)).toString(); } @Override diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java index 4556562..1516118 100644 --- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java +++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.BranchLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -48,7 +48,7 @@ class ForgejoTagLink implements ForgejoProjectLink, BranchLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString(); } @Override diff --git a/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java b/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java index cfba853..5293ba6 100644 --- a/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java +++ b/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java @@ -6,9 +6,9 @@ import nbbrd.io.http.HttpHeaders; import nbbrd.io.http.HttpRequest; import nbbrd.io.http.HttpResponse; -import nbbrd.io.http.ext.PersistentResponse; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; +import tests.heylogs.spi.PersistentResponse; import java.io.IOException; diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java index d52f7b0..e6cd249 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.BlobLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -59,7 +59,7 @@ class GitHubBlobLink implements GitHubProjectLink, BlobLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(BLOB_KEYWORD).path(branchName).path(filePath).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(BLOB_KEYWORD).path(branchName).path(filePath).toString(); } @Override diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java index 7a7c514..2e949b9 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java @@ -6,7 +6,7 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -47,7 +47,7 @@ class GitHubCommitLink implements GitHubProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString(); } @Override diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java index 03ac63d..00d0d2e 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java @@ -8,7 +8,7 @@ import nbbrd.heylogs.spi.CompareLink; import nbbrd.heylogs.spi.ForgeRef; import nbbrd.heylogs.spi.ProjectLink; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -59,7 +59,7 @@ class GitHubCompareLink implements CompareLink, GitHubProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString(); } @Override diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java index 617b2fb..9ce6581 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java @@ -5,7 +5,7 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.MalformedURLException; @@ -40,11 +40,12 @@ class GitHubIssueLink implements GitHubProjectLink { public static @NonNull GitHubIssueLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) { try { return parse( - URLQueryBuilder - .of(projectUrl) + UriQueryBuilder + .of(uriOf(projectUrl)) .path(ISSUES_KEYWORD) .path(String.valueOf(GitHubIssueRef.parse(ref).getIssueNumber())) - .build()); + .build() + .toURL()); } catch (MalformedURLException ex) { throw new RuntimeException(ex); } @@ -63,7 +64,7 @@ class GitHubIssueLink implements GitHubProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString(); } @Override diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java index b298759..4de01c1 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -54,8 +54,8 @@ class GitHubMentionLink implements ForgeLink { @Override public String toString() { return isUser() - ? URLQueryBuilder.of(base).path(user).toString() - : URLQueryBuilder.of(base).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString(); + ? UriQueryBuilder.of(uriOf(base)).path(user).toString() + : UriQueryBuilder.of(uriOf(base)).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString(); } @Override diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java index 8395737..5b212cf 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java @@ -8,11 +8,14 @@ import nbbrd.heylogs.spi.ForgeLink; import nbbrd.heylogs.spi.MessageFetcher; import nbbrd.io.http.*; +import nbbrd.io.http.ext.ThrowingStatusException; +import nbbrd.io.http.urlconnection.UrlConnectionHttpClient; import nbbrd.io.net.MediaType; import java.io.IOException; import java.net.URL; +import static nbbrd.heylogs.spi.URLExtractor.uriOf; import static nbbrd.heylogs.spi.URLExtractor.urlOf; // https://docs.github.com/en/rest/issues/issues#get-an-issue @@ -25,7 +28,7 @@ enum GitHubMessageFetcher implements MessageFetcher { URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) { if (link instanceof GitHubIssueLink) { GitHubIssueLink issueLink = (GitHubIssueLink) link; - return urlOf(URLQueryBuilder.of(apiBase) + return urlOf(UriQueryBuilder.of(uriOf(apiBase)) .path("repos") .path(issueLink.getOwner()) .path(issueLink.getRepo()) @@ -42,7 +45,7 @@ URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) { URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) { if (link instanceof GitHubRequestLink) { GitHubRequestLink requestLink = (GitHubRequestLink) link; - return urlOf(URLQueryBuilder.of(apiBase) + return urlOf(UriQueryBuilder.of(uriOf(apiBase)) .path("repos") .path(requestLink.getOwner()) .path(requestLink.getRepo()) @@ -67,7 +70,7 @@ URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) { .build(); try (HttpResponse response = client.send(request)) { return extractTitle(response.getBodyAsString()); - } catch (HttpResponseException ex) { + } catch (ThrowingStatusException ex) { throw new IOException("GitHub API returned HTTP " + ex.getResponseCode() + " for " + request.getQuery()); } } diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java index 33ea1e6..c0ccc11 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java @@ -2,11 +2,12 @@ import lombok.NonNull; import nbbrd.heylogs.spi.ProjectLink; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import java.net.URL; import java.util.regex.Pattern; +import static nbbrd.heylogs.spi.URLExtractor.uriOf; import static nbbrd.heylogs.spi.URLExtractor.urlOf; interface GitHubProjectLink extends ProjectLink { @@ -22,7 +23,7 @@ interface GitHubProjectLink extends ProjectLink { @Override default @NonNull URL getProjectURL() { - return urlOf(URLQueryBuilder.of(getBase()).path(getOwner()).path(getRepo()).toString()); + return urlOf(UriQueryBuilder.of(uriOf(getBase())).path(getOwner()).path(getRepo()).toString()); } Pattern OWNER_PATTERN = Pattern.compile("[a-z\\d](?:[a-z\\d]|-(?=[a-z\\d])){0,38}", Pattern.CASE_INSENSITIVE); diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java index 8f11fd5..13f9740 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java @@ -5,7 +5,7 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import java.net.URL; @@ -36,7 +36,7 @@ class GitHubRepositoryLink implements GitHubProjectLink { @Override public @NonNull URL toURL() { - return urlOf(URLQueryBuilder.of(base).path(owner).path(repo).toString()); + return urlOf(UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).toString()); } @Override diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java index 8a21bef..3b614a5 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java @@ -5,7 +5,7 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.MalformedURLException; @@ -38,11 +38,12 @@ class GitHubRequestLink implements GitHubProjectLink { public static @NonNull GitHubRequestLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) { try { return parse( - URLQueryBuilder - .of(projectUrl) + UriQueryBuilder + .of(uriOf(projectUrl)) .path(PULL_REQUEST_KEYWORD) .path(String.valueOf(GitHubRequestRef.parse(ref).getRequestNumber())) - .build()); + .build() + .toURL()); } catch (MalformedURLException ex) { throw new RuntimeException(ex); } @@ -61,7 +62,7 @@ class GitHubRequestLink implements GitHubProjectLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(requestNumber)).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(requestNumber)).toString(); } @Override diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java index 4db0efc..595edbf 100644 --- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java +++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.BranchLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -48,7 +48,7 @@ class GitHubTagLink implements GitHubProjectLink, BranchLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString(); + return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString(); } @Override diff --git a/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java b/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java index e114588..772a419 100644 --- a/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java +++ b/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java @@ -6,9 +6,9 @@ import nbbrd.io.http.HttpHeaders; import nbbrd.io.http.HttpRequest; import nbbrd.io.http.HttpResponse; -import nbbrd.io.http.ext.PersistentResponse; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; +import tests.heylogs.spi.PersistentResponse; import java.io.IOException; import java.net.URL; diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java index 4b868d8..4591848 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.BlobLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -83,7 +83,7 @@ public String toString() { @Override public @NonNull URL toURL() { - return urlOf(URLQueryBuilder.of(base) + return urlOf(UriQueryBuilder.of(uriOf(base)) .path(namespace).path(project) .path(GitLabSupport.DASH_KEYWORD) .path(BLOB_KEYWORD).path(branchName) diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java index fa1a244..c76da98 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java @@ -5,13 +5,14 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.MalformedURLException; import java.net.URL; import java.util.List; +import static nbbrd.heylogs.spi.URLExtractor.uriOf; import static nbbrd.heylogs.spi.URLExtractor.urlOf; import static nbbrd.heylogs.ext.gitlab.GitLabSupport.*; @@ -29,11 +30,12 @@ class GitLabIssueLink implements GitLabProjectLink { public static @NonNull GitLabIssueLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) { try { return parse( - URLQueryBuilder - .of(projectUrl) + UriQueryBuilder + .of(uriOf(projectUrl)) .path(ISSUES_KEYWORD) .path(String.valueOf(GitLabIssueRef.parse(ref).getNumber())) - .build()); + .build() + .toURL()); } catch (MalformedURLException ex) { throw new RuntimeException(ex); } diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java index 83deaaa..eb6e0a3 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java @@ -6,7 +6,7 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -47,7 +47,7 @@ class GitLabMentionLink implements ForgeLink { @Override public String toString() { - return URLQueryBuilder.of(base).path(namespace).toString(); + return UriQueryBuilder.of(uriOf(base)).path(namespace).toString(); } @Override diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java index dd5c5f5..82ea454 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java @@ -8,6 +8,8 @@ import nbbrd.heylogs.spi.ForgeLink; import nbbrd.heylogs.spi.MessageFetcher; import nbbrd.io.http.*; +import nbbrd.io.http.ext.ThrowingStatusException; +import nbbrd.io.http.urlconnection.UrlConnectionHttpClient; import nbbrd.io.net.MediaType; import java.io.IOException; @@ -58,7 +60,7 @@ URL buildApiUrl(@NonNull ForgeLink link) { .build(); try (HttpResponse response = client.send(request)) { return extractTitle(response.getBodyAsString()); - } catch (HttpResponseException ex) { + } catch (ThrowingStatusException ex) { throw new IOException("GitLab API returned HTTP " + ex.getResponseCode() + " for " + request.getQuery()); } } diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java index c74c9b6..468a3fb 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java @@ -2,11 +2,12 @@ import lombok.NonNull; import nbbrd.heylogs.spi.ProjectLink; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import java.net.URL; import java.util.List; +import static nbbrd.heylogs.spi.URLExtractor.uriOf; import static nbbrd.heylogs.spi.URLExtractor.urlOf; public interface GitLabProjectLink extends ProjectLink { @@ -22,6 +23,6 @@ public interface GitLabProjectLink extends ProjectLink { @Override default @NonNull URL getProjectURL() { - return urlOf(URLQueryBuilder.of(getBase()).path(getNamespace()).path(getProject()).toString()); + return urlOf(UriQueryBuilder.of(uriOf(getBase())).path(getNamespace()).path(getProject()).toString()); } } diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java index d3e6464..628145e 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java @@ -5,16 +5,15 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import java.net.URL; import java.util.List; -import static nbbrd.heylogs.spi.URLExtractor.baseOf; -import static nbbrd.heylogs.spi.URLExtractor.getPathArray; import static java.util.Collections.unmodifiableList; import static nbbrd.heylogs.ext.gitlab.GitLabSupport.NAMESPACE_PATTERN; import static nbbrd.heylogs.ext.gitlab.GitLabSupport.PROJECT_PATTERN; +import static nbbrd.heylogs.spi.URLExtractor.*; @RepresentableAs(URL.class) @lombok.Value @@ -54,7 +53,7 @@ public ForgeRef toRef(ForgeRef baseRef) { @Override public @NonNull URL toURL() { try { - return URLQueryBuilder.of(base).path(namespace).path(project).build(); + return UriQueryBuilder.of(uriOf(base)).path(namespace).path(project).build().toURL(); } catch (java.net.MalformedURLException e) { throw new RuntimeException(e); } diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java index e9b1249..4f20a5e 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java @@ -5,13 +5,14 @@ import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.MalformedURLException; import java.net.URL; import java.util.List; +import static nbbrd.heylogs.spi.URLExtractor.uriOf; import static nbbrd.heylogs.spi.URLExtractor.urlOf; import static nbbrd.heylogs.ext.gitlab.GitLabSupport.*; @@ -29,10 +30,11 @@ class GitLabRequestLink implements GitLabProjectLink { public static @NonNull GitLabRequestLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) { try { return parse( - URLQueryBuilder.of(projectUrl) + UriQueryBuilder.of(uriOf(projectUrl)) .path(MERGE_REQUEST_KEYWORD) .path(String.valueOf(GitLabRequestRef.parse(ref).getNumber())) - .build()); + .build() + .toURL()); } catch (MalformedURLException ex) { throw new RuntimeException(ex); } diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java index ff4cacf..9af24aa 100644 --- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java +++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java @@ -4,7 +4,7 @@ import nbbrd.design.MightBePromoted; import nbbrd.heylogs.spi.ForgeLink; import nbbrd.heylogs.spi.ForgeRef; -import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.UriQueryBuilder; import org.jspecify.annotations.Nullable; import java.net.URL; @@ -83,7 +83,7 @@ interface ValueParser { } public static @NonNull String linkToString(@NonNull URL base, @NonNull List namespace, @NonNull String project, @NonNull String type, @NonNull String value) { - return URLQueryBuilder.of(base).path(namespace).path(project).path(DASH_KEYWORD).path(type).path(value).toString(); + return UriQueryBuilder.of(uriOf(base)).path(namespace).path(project).path(DASH_KEYWORD).path(type).path(value).toString(); } @FunctionalInterface diff --git a/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java b/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java index 9e93aab..aa7dcdf 100644 --- a/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java +++ b/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java @@ -6,8 +6,8 @@ import nbbrd.io.http.HttpHeaders; import nbbrd.io.http.HttpRequest; import nbbrd.io.http.HttpResponse; -import nbbrd.io.http.ext.PersistentResponse; import org.junit.jupiter.api.Test; +import tests.heylogs.spi.PersistentResponse; import java.io.IOException; import java.net.URL; diff --git a/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java b/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java index c15c70b..222c394 100644 --- a/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java +++ b/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java @@ -3,28 +3,39 @@ import lombok.NonNull; import nbbrd.heylogs.spi.HttpFactory; import nbbrd.io.http.HttpClient; -import nbbrd.io.http.UrlConnectionHttpClient; -import nbbrd.io.http.ext.LazyHttpClient; +import nbbrd.io.http.ext.*; +import nbbrd.io.http.urlconnection.UrlConnectionHttpClient; import nbbrd.service.ServiceProvider; import nl.altindag.ssl.SSLFactory; @ServiceProvider public final class DefaultHttpFactory implements HttpFactory { + @lombok.Getter(lazy = true) + private final SSLFactory sslFactory = initSSLFactory(); + + private static SSLFactory initSSLFactory() { + return SSLFactory + .builder() + .withDefaultTrustMaterial() + .withSystemTrustMaterial() + .build(); + } + @Override public @NonNull HttpClient getClient() { - return new LazyHttpClient(() -> { - SSLFactory sslFactory = SSLFactory - .builder() - .withDefaultTrustMaterial() - .withSystemTrustMaterial() - .build(); - return UrlConnectionHttpClient - .builder() - .userAgent("heylogs") - .sslSocketFactory(sslFactory.getSslSocketFactory()) - .hostnameVerifier(sslFactory.getHostnameVerifier()) - .build(); - }); + SSLFactory sslFactory = getSslFactory(); + return new ThrowingStatusDecorator( + new RetryDecorator( + new RedirectDecorator( + UrlConnectionHttpClient + .builder() + .userAgent("heylogs") + .sslSocketFactory(sslFactory.getSslSocketFactory()) + .hostnameVerifier(sslFactory.getHostnameVerifier()) + .build() + , 5, RedirectListener.noOp()), + 3, RetryListener.noOp()), + ThrowingStatusDecorator.DEFAULT_SHOULD_THROW); } } diff --git a/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java b/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java index 43dcee4..2dda919 100644 --- a/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java +++ b/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java @@ -8,7 +8,6 @@ import nbbrd.design.MightBeGenerated; import nbbrd.design.VisibleForTesting; import nbbrd.heylogs.spi.*; -import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; import org.jspecify.annotations.Nullable; @@ -23,6 +22,7 @@ import static nbbrd.heylogs.Util.illegalArgumentToNull; import static nbbrd.heylogs.spi.RuleSupport.nameToId; import static nbbrd.heylogs.spi.Tagging.CONVERSION_NOT_SUPPORTED; +import static nbbrd.heylogs.spi.URLExtractor.urlOrNullOf; import static nbbrd.heylogs.spi.Versioning.NO_VERSIONING_FILTER; public enum LinkRules implements Rule { @@ -152,7 +152,7 @@ static RuleIssue validateHttps(LinkNodeBase link) { @VisibleForTesting public static @Nullable RuleIssue validateTagVersioning(@NonNull LinkNodeBase link, @NonNull RuleContext context) { - URL url = Parser.onURL().parse(link.getUrl()); + URL url = urlOrNullOf(link.getUrl()); Converter tagParser = context.findTagParserOrNull(); java.util.function.Predicate versioningPredicate = context.findVersioningPredicateOrNull(); @@ -187,7 +187,7 @@ static RuleIssue validateHttps(LinkNodeBase link) { @VisibleForTesting public static @Nullable RuleIssue validateForgeRef(@NonNull Link link, @NonNull RuleContext context) { - URL url = Parser.onURL().parse(link.getUrl()); + URL url = urlOrNullOf(link.getUrl()); if (url != null) { for (Forge forge : context.findAllForges(url)) { for (ForgeLinkType type : ForgeLinkType.values()) { @@ -298,7 +298,7 @@ static RuleIssue validateHttps(LinkNodeBase link) { Link lastLink = getLastLink(item); if (lastLink == null) return NO_RULE_ISSUE; - URL url = Parser.onURL().parse(lastLink.getUrl()); + URL url = urlOrNullOf(lastLink.getUrl()); if (url == null) return NO_RULE_ISSUE; List forges = context.findAllForges(url); diff --git a/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java b/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java index 61a5864..80b1690 100644 --- a/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java +++ b/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java @@ -13,13 +13,11 @@ import static internal.heylogs.base.BaseVersionings.REGEX_VERSIONING; import static nbbrd.heylogs.ext.rules.LinkRules.*; -import static nbbrd.heylogs.ext.rules.RulesTestHelper.asLink; import static nbbrd.heylogs.ext.rules.RulesTestHelper.asBulletListItem; +import static nbbrd.heylogs.ext.rules.RulesTestHelper.asLink; import static nbbrd.heylogs.spi.ForgeLinkType.ISSUE; import static org.assertj.core.api.Assertions.assertThat; import static tests.heylogs.api.Sample.using; -import static tests.heylogs.spi.MockedCompareLink.parse; -import static tests.heylogs.spi.MockedForgeLink.parse; import static tests.heylogs.spi.RuleAssert.assertRuleCompliance; public class LinkRulesTest {