Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion heylogs-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<dependency>
<groupId>com.github.nbbrd.java-io-util</groupId>
<artifactId>java-io-bom</artifactId>
<version>0.0.38</version>
<version>0.0.39</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand Down
19 changes: 18 additions & 1 deletion heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package nbbrd.heylogs.spi;

import lombok.NonNull;
import org.jspecify.annotations.Nullable;

import java.io.UnsupportedEncodingException;
import java.net.*;
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand All @@ -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
Expand Down
Loading
Loading