diff --git a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/IssueUpdater.java b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/IssueUpdater.java index 00f5cf9e0..febd4be07 100644 --- a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/IssueUpdater.java +++ b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/IssueUpdater.java @@ -288,7 +288,9 @@ public void handleCommits(HostedRepository repository, Repository localRepositor var username = findIssueUsername(commit); if (username.isPresent()) { var assignee = issueProject.issueTracker().user(username.get()); - issue.setAssignees(List.of(assignee)); + if (assignee.isPresent()) { + issue.setAssignees(List.of(assignee.get())); + } } } } diff --git a/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryContinuousIntegration.java b/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryContinuousIntegration.java index c285e46de..f6eedb948 100644 --- a/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryContinuousIntegration.java +++ b/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryContinuousIntegration.java @@ -59,8 +59,8 @@ public boolean isValid() { } @Override - public HostUser user(String username) { - return users.get(username); + public Optional user(String username) { + return Optional.ofNullable(users.get(username)); } @Override diff --git a/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java b/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java index acda49f91..ab2136dde 100644 --- a/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java +++ b/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java @@ -42,8 +42,8 @@ public Optional repository(String name) { } @Override - public HostUser user(String username) { - return null; + public Optional user(String username) { + return Optional.empty(); } @Override diff --git a/cli/src/main/java/org/openjdk/skara/cli/GitPr.java b/cli/src/main/java/org/openjdk/skara/cli/GitPr.java index 9b126a4a8..b531ce11d 100644 --- a/cli/src/main/java/org/openjdk/skara/cli/GitPr.java +++ b/cli/src/main/java/org/openjdk/skara/cli/GitPr.java @@ -801,6 +801,8 @@ public static void main(String[] args) throws IOException, InterruptedException var usernames = Arrays.asList(arguments.get("assignees").asString().split(",")); var assignees = usernames.stream() .map(u -> host.user(u)) + .filter(Optional::isPresent) + .map(Optional::get) .collect(Collectors.toList()); pr.setAssignees(assignees); } @@ -1058,6 +1060,8 @@ public static void main(String[] args) throws IOException, InterruptedException var usernames = Arrays.asList(assigneesOption.split(",")); var assignees = usernames.stream() .map(u -> host.user(u)) + .filter(Optional::isPresent) + .map(Optional::get) .collect(Collectors.toList()); pr.setAssignees(assignees); } @@ -1371,6 +1375,8 @@ public static void main(String[] args) throws IOException, InterruptedException var usernames = Arrays.asList(assigneesOption.split(",")); var assignees = usernames.stream() .map(u -> host.user(u)) + .filter(Optional::isPresent) + .map(Optional::get) .collect(Collectors.toList()); pr.setAssignees(assignees); } diff --git a/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java b/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java index d5ba49572..fa9575c48 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java +++ b/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java @@ -128,7 +128,7 @@ Optional getInstallationToken() { private String getFullName(String userName) { var details = user(userName); - return details.fullName(); + return details.get().fullName(); } // Most GitHub API's return user information in this format @@ -182,9 +182,15 @@ public Optional repository(String name) { } @Override - public HostUser user(String username) { - var details = request.get("users/" + URLEncoder.encode(username, StandardCharsets.UTF_8)).execute().asObject(); - return asHostUser(details); + public Optional user(String username) { + var details = request.get("users/" + URLEncoder.encode(username, StandardCharsets.UTF_8)) + .onError(r -> JSON.of()) + .execute(); + if (details.isNull()) { + return Optional.empty(); + } + + return Optional.of(asHostUser(details.asObject())); } private static HostUser asHostUser(JSONObject details) { @@ -205,7 +211,7 @@ public HostUser currentUser() { if (application != null) { var appDetails = application.getAppDetails(); var appName = appDetails.get("name").asString() + "[bot]"; - currentUser = user(appName); + currentUser = user(appName).get(); } else if (pat != null) { // Cannot always trust username in PAT, e.g. Git Credential Manager // on Windows always return "PersonalAccessToken" as username. diff --git a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java index 6cb5029a3..eba560da6 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java +++ b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java @@ -118,13 +118,22 @@ private HostUser parseUserDetails(JSONObject details) { } @Override - public HostUser user(String username) { - var details = request.get("users").param("username", username).execute().asArray(); - if (details.size() != 1) { - throw new RuntimeException("Couldn't find user: " + username); + public Optional user(String username) { + var details = request.get("users") + .param("username", username) + .onError(r -> JSON.of()) + .execute(); + + if (details.isNull()) { + return Optional.empty(); + } + + var users = details.asArray(); + if (users.size() != 1) { + return Optional.empty(); } - return parseUserDetails(details.get(0).asObject()); + return Optional.of(parseUserDetails(users.get(0).asObject())); } @Override diff --git a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabMergeRequest.java b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabMergeRequest.java index 3d1dfff4a..eea7c822e 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabMergeRequest.java +++ b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabMergeRequest.java @@ -66,7 +66,7 @@ public String id() { @Override public HostUser author() { - return repository.forge().user(json.get("author").get("username").asString()); + return repository.forge().user(json.get("author").get("username").asString()).get(); } @Override @@ -122,7 +122,7 @@ class CommitDate { } } var id = obj.get("id").asInt(); - return new Review(createdAt, reviewer, verdict, hash, id, null); + return new Review(createdAt, reviewer.get(), verdict, hash, id, null); }) .collect(Collectors.toList()); } @@ -624,7 +624,7 @@ public List assignees() { var assignee = json.get("assignee").asObject(); if (assignee != null) { var user = repository.forge().user(assignee.get("username").asString()); - return List.of(user); + return List.of(user.get()); } return Collections.emptyList(); } diff --git a/host/src/main/java/org/openjdk/skara/host/Host.java b/host/src/main/java/org/openjdk/skara/host/Host.java index 2af6644cd..920d92098 100644 --- a/host/src/main/java/org/openjdk/skara/host/Host.java +++ b/host/src/main/java/org/openjdk/skara/host/Host.java @@ -22,9 +22,11 @@ */ package org.openjdk.skara.host; +import java.util.Optional; + public interface Host { boolean isValid(); - HostUser user(String username); + Optional user(String username); HostUser currentUser(); boolean isMemberOf(String groupId, HostUser user); } diff --git a/issuetracker/src/main/java/org/openjdk/skara/issuetracker/jira/JiraHost.java b/issuetracker/src/main/java/org/openjdk/skara/issuetracker/jira/JiraHost.java index cbc06fd92..016c8e8f7 100644 --- a/issuetracker/src/main/java/org/openjdk/skara/issuetracker/jira/JiraHost.java +++ b/issuetracker/src/main/java/org/openjdk/skara/issuetracker/jira/JiraHost.java @@ -93,14 +93,19 @@ public IssueProject project(String name) { } @Override - public HostUser user(String username) { + public Optional user(String username) { var data = request.get("user") .param("username", username) + .onError(r -> JSON.of()) .execute(); + if (data.isNull()) { + return Optional.empty(); + } + var user = new HostUser(data.get("name").asString(), data.get("name").asString(), data.get("displayName").asString()); - return user; + return Optional.of(user); } @Override diff --git a/issuetracker/src/test/java/org/openjdk/skara/issuetracker/IssueTrackerTests.java b/issuetracker/src/test/java/org/openjdk/skara/issuetracker/IssueTrackerTests.java index 92ce04fc7..a06c6edfe 100644 --- a/issuetracker/src/test/java/org/openjdk/skara/issuetracker/IssueTrackerTests.java +++ b/issuetracker/src/test/java/org/openjdk/skara/issuetracker/IssueTrackerTests.java @@ -50,7 +50,7 @@ void simple(TestInfo info) throws IOException { var userName = project.issueTracker().currentUser().userName(); var user = project.issueTracker().user(userName); - assertEquals(userName, user.userName()); + assertEquals(userName, user.get().userName()); var issue = credentials.createIssue(project, "Test issue"); issue.setTitle("Updated title"); @@ -84,7 +84,7 @@ void addLink(TestInfo info) throws IOException { var userName = project.issueTracker().currentUser().userName(); var user = project.issueTracker().user(userName); - assertEquals(userName, user.userName()); + assertEquals(userName, user.get().userName()); var issue = credentials.createIssue(project, "Test issue"); issue.setBody("This is now the body"); diff --git a/test/src/main/java/org/openjdk/skara/test/TestHost.java b/test/src/main/java/org/openjdk/skara/test/TestHost.java index e53b76e3b..b4cd6eaac 100644 --- a/test/src/main/java/org/openjdk/skara/test/TestHost.java +++ b/test/src/main/java/org/openjdk/skara/test/TestHost.java @@ -115,11 +115,13 @@ public IssueProject project(String name) { } @Override - public HostUser user(String username) { - return data.users.stream() - .filter(user -> user.userName().equals(username)) - .findAny() - .orElseThrow(); + public Optional user(String username) { + return data.users + .stream() + .filter(user -> user.userName().equals(username)) + .map(user -> Optional.of(user)) + .findAny() + .orElseThrow(); } @Override