From e892efb82f2ca0ea215a98c542bf727a3b846bb8 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Thu, 28 Sep 2023 15:10:37 +0800 Subject: [PATCH] Upgrade to Spring Boot 3.1.4 --- pom.xml | 12 +- .../spring/issuebot/IssueBotApplication.java | 6 +- .../io/spring/issuebot/RepositoryMonitor.java | 13 +- .../feedback/FeedbackConfiguration.java | 30 ++- .../feedback/FeedbackIssueListener.java | 6 +- .../feedback/StandardFeedbackListener.java | 5 +- .../io/spring/issuebot/github/Comment.java | 3 +- .../java/io/spring/issuebot/github/Event.java | 3 +- .../issuebot/github/GitHubTemplate.java | 80 +++----- .../java/io/spring/issuebot/github/Issue.java | 11 +- .../question/QuestionConfiguration.java | 16 +- .../question/QuestionIssueListener.java | 3 +- .../triage/MilestoneAppliedTriageFilter.java | 3 +- .../OpenedByCollaboratorTriageFilter.java | 6 +- .../issuebot/triage/TriageConfiguration.java | 18 +- .../issuebot/IssueBotApplicationTests.java | 8 +- .../issuebot/RepositoryMonitorTests.java | 15 +- .../feedback/FeedbackIssueListenerTests.java | 77 +++----- .../StandardFeedbackListenerTests.java | 12 +- .../issuebot/github/GitHubTemplateTests.java | 175 +++++++++--------- .../issuebot/github/RegexLinkParserTests.java | 5 +- .../question/QuestionIssueListenerTests.java | 23 +-- .../LabelApplyingTriageListenerTests.java | 5 +- .../triage/LabelledTriageFilterTests.java | 14 +- .../MilestoneAppliedTriageFilterTests.java | 10 +- ...OpenedByCollaboratorTriageFilterTests.java | 14 +- .../triage/TriageIssueListenerTests.java | 2 +- 27 files changed, 245 insertions(+), 330 deletions(-) diff --git a/pom.xml b/pom.xml index 1940351..bb8fa1a 100644 --- a/pom.xml +++ b/pom.xml @@ -14,13 +14,13 @@ org.springframework.boot spring-boot-starter-parent - 2.1.1.RELEASE + 3.1.4 UTF-8 - 1.8 + 17 @@ -29,8 +29,8 @@ jackson-datatype-jsr310 - org.apache.httpcomponents - httpclient + org.apache.httpcomponents.client5 + httpclient5 org.springframework.boot @@ -58,7 +58,7 @@ io.spring.javaformat spring-javaformat-maven-plugin - 0.0.6 + 0.0.39 validate @@ -103,7 +103,7 @@ org.jacoco jacoco-maven-plugin - 0.7.5.201505241946 + 0.8.10 jacoco-initialize diff --git a/src/main/java/io/spring/issuebot/IssueBotApplication.java b/src/main/java/io/spring/issuebot/IssueBotApplication.java index fb279d9..6c1ddf6 100644 --- a/src/main/java/io/spring/issuebot/IssueBotApplication.java +++ b/src/main/java/io/spring/issuebot/IssueBotApplication.java @@ -49,11 +49,9 @@ public class IssueBotApplication { } @Bean - RepositoryMonitor repositoryMonitor(GitHubOperations gitHub, - MonitoringProperties monitoringProperties, + RepositoryMonitor repositoryMonitor(GitHubOperations gitHub, MonitoringProperties monitoringProperties, List issueListeners) { - return new RepositoryMonitor(gitHub, monitoringProperties.getRepositories(), - issueListeners); + return new RepositoryMonitor(gitHub, monitoringProperties.getRepositories(), issueListeners); } } diff --git a/src/main/java/io/spring/issuebot/RepositoryMonitor.java b/src/main/java/io/spring/issuebot/RepositoryMonitor.java index 0ddf8e7..47293b8 100644 --- a/src/main/java/io/spring/issuebot/RepositoryMonitor.java +++ b/src/main/java/io/spring/issuebot/RepositoryMonitor.java @@ -59,8 +59,7 @@ class RepositoryMonitor { private void monitor(Repository repository) { log.info("Monitoring {}/{}", repository.getOrganization(), repository.getName()); try { - Page page = this.gitHub.getIssues(repository.getOrganization(), - repository.getName()); + Page page = this.gitHub.getIssues(repository.getOrganization(), repository.getName()); while (page != null) { for (Issue issue : page.getContent()) { for (MultiRepositoryIssueListener issueListener : this.issueListeners) { @@ -68,8 +67,7 @@ class RepositoryMonitor { issueListener.onOpenIssue(repository, issue); } catch (Exception ex) { - log.warn("Listener '{}' failed when handling issue '{}'", - issueListener, issue, ex); + log.warn("Listener '{}' failed when handling issue '{}'", issueListener, issue, ex); } } } @@ -77,11 +75,10 @@ class RepositoryMonitor { } } catch (Exception ex) { - log.warn("A failure occurred during monitoring of {}/{}", - repository.getOrganization(), repository.getName(), ex); + log.warn("A failure occurred during monitoring of {}/{}", repository.getOrganization(), + repository.getName(), ex); } - log.info("Monitoring of {}/{} completed", repository.getOrganization(), - repository.getName()); + log.info("Monitoring of {}/{} completed", repository.getOrganization(), repository.getName()); } } diff --git a/src/main/java/io/spring/issuebot/feedback/FeedbackConfiguration.java b/src/main/java/io/spring/issuebot/feedback/FeedbackConfiguration.java index 46e81f1..19eafb8 100644 --- a/src/main/java/io/spring/issuebot/feedback/FeedbackConfiguration.java +++ b/src/main/java/io/spring/issuebot/feedback/FeedbackConfiguration.java @@ -44,29 +44,23 @@ import org.springframework.context.annotation.Configuration; class FeedbackConfiguration { @Bean - MultiRepositoryIssueListener feedbackIssueListener( - MonitoringProperties monitoringProperties, GitHubOperations gitHub, - GitHubProperties githubProperties, FeedbackProperties feedbackProperties) { + MultiRepositoryIssueListener feedbackIssueListener(MonitoringProperties monitoringProperties, + GitHubOperations gitHub, GitHubProperties githubProperties, FeedbackProperties feedbackProperties) { Map delegates = monitoringProperties.getRepositories() - .stream() - .collect(Collectors.toMap(Function.identity(), - (repository) -> createListener(repository, gitHub, - githubProperties, feedbackProperties))); + .stream() + .collect(Collectors.toMap(Function.identity(), + (repository) -> createListener(repository, gitHub, githubProperties, feedbackProperties))); return new RoutingMultiRepositoryIssueListener(delegates); } - private FeedbackIssueListener createListener(Repository repository, - GitHubOperations gitHub, GitHubProperties githubProperties, - FeedbackProperties feedbackProperties) { - return new FeedbackIssueListener(gitHub, feedbackProperties.getRequiredLabel(), - repository.getCollaborators(), + private FeedbackIssueListener createListener(Repository repository, GitHubOperations gitHub, + GitHubProperties githubProperties, FeedbackProperties feedbackProperties) { + return new FeedbackIssueListener(gitHub, feedbackProperties.getRequiredLabel(), repository.getCollaborators(), githubProperties.getCredentials().getUsername(), - new StandardFeedbackListener(gitHub, - feedbackProperties.getProvidedLabel(), - feedbackProperties.getRequiredLabel(), - feedbackProperties.getReminderLabel(), - feedbackProperties.getReminderComment(), - feedbackProperties.getCloseComment(), Collections.emptyList())); + new StandardFeedbackListener(gitHub, feedbackProperties.getProvidedLabel(), + feedbackProperties.getRequiredLabel(), feedbackProperties.getReminderLabel(), + feedbackProperties.getReminderComment(), feedbackProperties.getCloseComment(), + Collections.emptyList())); } } diff --git a/src/main/java/io/spring/issuebot/feedback/FeedbackIssueListener.java b/src/main/java/io/spring/issuebot/feedback/FeedbackIssueListener.java index a8be59c..ed23214 100644 --- a/src/main/java/io/spring/issuebot/feedback/FeedbackIssueListener.java +++ b/src/main/java/io/spring/issuebot/feedback/FeedbackIssueListener.java @@ -43,8 +43,7 @@ final class FeedbackIssueListener implements IssueListener { private final FeedbackListener feedbackListener; - FeedbackIssueListener(GitHubOperations gitHub, String labelName, - List collaborators, String username, + FeedbackIssueListener(GitHubOperations gitHub, String labelName, List collaborators, String username, FeedbackListener feedbackListener) { this.gitHub = gitHub; this.labelName = labelName; @@ -90,8 +89,7 @@ final class FeedbackIssueListener implements IssueListener { Page page = this.gitHub.getEvents(issue); while (page != null) { for (Event event : page.getContent()) { - if (Event.Type.LABELED.equals(event.getType()) - && this.labelName.equals(event.getLabel().getName())) { + if (Event.Type.LABELED.equals(event.getType()) && this.labelName.equals(event.getLabel().getName())) { createdAt = event.getCreationTime(); } } diff --git a/src/main/java/io/spring/issuebot/feedback/StandardFeedbackListener.java b/src/main/java/io/spring/issuebot/feedback/StandardFeedbackListener.java index dd047f1..3dc78db 100644 --- a/src/main/java/io/spring/issuebot/feedback/StandardFeedbackListener.java +++ b/src/main/java/io/spring/issuebot/feedback/StandardFeedbackListener.java @@ -45,9 +45,8 @@ final class StandardFeedbackListener implements FeedbackListener { private final List issueListeners; - StandardFeedbackListener(GitHubOperations gitHub, String providedLabel, - String requiredLabel, String reminderLabel, String reminderComment, - String closeComment, List issueListeners) { + StandardFeedbackListener(GitHubOperations gitHub, String providedLabel, String requiredLabel, String reminderLabel, + String reminderComment, String closeComment, List issueListeners) { this.gitHub = gitHub; this.providedLabel = providedLabel; this.requiredLabel = requiredLabel; diff --git a/src/main/java/io/spring/issuebot/github/Comment.java b/src/main/java/io/spring/issuebot/github/Comment.java index d7a697d..ad0b300 100644 --- a/src/main/java/io/spring/issuebot/github/Comment.java +++ b/src/main/java/io/spring/issuebot/github/Comment.java @@ -39,8 +39,7 @@ public final class Comment { * @param creationTime the creation time */ @JsonCreator - public Comment(@JsonProperty("user") User user, - @JsonProperty("created_at") OffsetDateTime creationTime) { + public Comment(@JsonProperty("user") User user, @JsonProperty("created_at") OffsetDateTime creationTime) { this.user = user; this.creationTime = creationTime; } diff --git a/src/main/java/io/spring/issuebot/github/Event.java b/src/main/java/io/spring/issuebot/github/Event.java index f175bcd..c7570db 100644 --- a/src/main/java/io/spring/issuebot/github/Event.java +++ b/src/main/java/io/spring/issuebot/github/Event.java @@ -45,8 +45,7 @@ public class Event { * @param label the label associated with the event */ @JsonCreator - public Event(@JsonProperty("event") String type, - @JsonProperty("created_at") OffsetDateTime creationTime, + public Event(@JsonProperty("event") String type, @JsonProperty("created_at") OffsetDateTime creationTime, @JsonProperty("label") Label label) { this.type = Type.valueFrom(type); this.creationTime = creationTime; diff --git a/src/main/java/io/spring/issuebot/github/GitHubTemplate.java b/src/main/java/io/spring/issuebot/github/GitHubTemplate.java index e5d2bb2..aee8260 100644 --- a/src/main/java/io/spring/issuebot/github/GitHubTemplate.java +++ b/src/main/java/io/spring/issuebot/github/GitHubTemplate.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.hc.client5.http.utils.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +45,6 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.util.Base64Utils; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import org.springframework.web.client.DefaultResponseErrorHandler; @@ -86,31 +86,24 @@ public class GitHubTemplate implements GitHubOperations { rest.setErrorHandler(new DefaultResponseErrorHandler() { @Override public void handleError(ClientHttpResponse response) throws IOException { - if (response.getStatusCode() == HttpStatus.FORBIDDEN && response - .getHeaders().getFirst("X-RateLimit-Remaining").equals("0")) { - throw new IllegalStateException( - "Rate limit exceeded. Limit will reset at " - + new Date(Long - .valueOf(response.getHeaders() - .getFirst("X-RateLimit-Reset")) - * 1000)); + if (response.getStatusCode() == HttpStatus.FORBIDDEN + && response.getHeaders().getFirst("X-RateLimit-Remaining").equals("0")) { + throw new IllegalStateException("Rate limit exceeded. Limit will reset at " + + new Date(Long.valueOf(response.getHeaders().getFirst("X-RateLimit-Reset")) * 1000)); } } }); BufferingClientHttpRequestFactory bufferingClient = new BufferingClientHttpRequestFactory( new HttpComponentsClientHttpRequestFactory()); rest.setRequestFactory(bufferingClient); - rest.setInterceptors(Collections - .singletonList(new BasicAuthorizationInterceptor(username, password))); - rest.setMessageConverters( - Arrays.asList(new ErrorLoggingMappingJackson2HttpMessageConverter())); + rest.setInterceptors(Collections.singletonList(new BasicAuthorizationInterceptor(username, password))); + rest.setMessageConverters(Arrays.asList(new ErrorLoggingMappingJackson2HttpMessageConverter())); return rest; } @Override public Page getIssues(String organization, String repository) { - String url = "https://api.github.com/repos/" + organization + "/" + repository - + "/issues"; + String url = "https://api.github.com/repos/" + organization + "/" + repository + "/issues"; return getPage(url, Issue[].class); } @@ -129,8 +122,7 @@ public class GitHubTemplate implements GitHubOperations { return null; } ResponseEntity contents = this.rest.getForEntity(url, type); - return new StandardPage<>(Arrays.asList(contents.getBody()), - () -> getPage(getNextUrl(contents), type)); + return new StandardPage<>(Arrays.asList(contents.getBody()), () -> getPage(getNextUrl(contents), type)); } private String getNextUrl(ResponseEntity response) { @@ -141,16 +133,13 @@ public class GitHubTemplate implements GitHubOperations { public Issue addLabel(Issue issue, String labelName) { URI uri = URI.create(issue.getLabelsUrl().replace("{/name}", "")); log.info("Adding label {} to {}", labelName, uri); - ResponseEntity response = this.rest.exchange( - new RequestEntity<>(Arrays.asList(labelName), HttpMethod.POST, uri), - Label[].class); + ResponseEntity response = this.rest + .exchange(new RequestEntity<>(Arrays.asList(labelName), HttpMethod.POST, uri), Label[].class); if (response.getStatusCode() != HttpStatus.OK) { - log.warn("Failed to add label to issue. Response status: " - + response.getStatusCode()); + log.warn("Failed to add label to issue. Response status: " + response.getStatusCode()); } - return new Issue(issue.getUrl(), issue.getCommentsUrl(), issue.getEventsUrl(), - issue.getLabelsUrl(), issue.getUser(), Arrays.asList(response.getBody()), - issue.getMilestone(), issue.getPullRequest()); + return new Issue(issue.getUrl(), issue.getCommentsUrl(), issue.getEventsUrl(), issue.getLabelsUrl(), + issue.getUser(), Arrays.asList(response.getBody()), issue.getMilestone(), issue.getPullRequest()); } @Override @@ -162,42 +151,35 @@ public class GitHubTemplate implements GitHubOperations { catch (URISyntaxException ex) { throw new RuntimeException(ex); } - ResponseEntity response = this.rest.exchange( - new RequestEntity(HttpMethod.DELETE, URI.create( - issue.getLabelsUrl().replace("{/name}", "/" + encodedName))), - Label[].class); + ResponseEntity response = this.rest.exchange(new RequestEntity(HttpMethod.DELETE, + URI.create(issue.getLabelsUrl().replace("{/name}", "/" + encodedName))), Label[].class); List