From 2ad244de1337d1ea0b19b7d28d13686da2c1c087 Mon Sep 17 00:00:00 2001 From: upagge Date: Fri, 10 Apr 2020 18:37:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../tsc/bitbucketbot/config/AppConfig.java | 8 ++ .../domain/change/AnswerCommentChange.java | 5 +- .../bitbucketbot/domain/change/Change.java | 6 +- .../domain/change/CommentChange.java | 12 +-- .../domain/change/ConflictPrChange.java | 5 +- .../domain/change/NewPrChange.java | 5 +- .../bitbucketbot/domain/change/PrChange.java | 4 +- .../domain/change/ReviewersPrChange.java | 5 +- .../domain/change/StatusPrChange.java | 5 +- .../domain/change/UpdatePrChange.java | 5 +- .../repository/jpa/UserRepository.java | 2 +- .../scheduler/SchedulerChangeParsing.java | 6 +- .../scheduler/SchedulerComments.java | 73 ++++++++++--------- .../scheduler/SchedulerPullRequest.java | 18 +++-- .../scheduler/SchedulerPushMessageSend.java | 6 +- .../tsc/bitbucketbot/service/UserService.java | 2 +- .../service/executor/DataScan.java | 11 +++ .../service/executor/Executor.java | 12 +++ .../service/executor/ResultScan.java | 13 ++++ .../bitbucketbot/service/executor/Seeker.java | 30 ++++++++ .../service/impl/ExecutorScanner.java | 64 ++++++++++++++++ .../service/impl/UserServiceImpl.java | 2 +- .../com/tsc/bitbucketbot/utils/Message.java | 6 +- .../tsc/bitbucketbot/utils/NonNullUtils.java | 19 +++++ src/main/resources/logback.xml | 2 +- 26 files changed, 249 insertions(+), 83 deletions(-) create mode 100644 src/main/java/com/tsc/bitbucketbot/service/executor/DataScan.java create mode 100644 src/main/java/com/tsc/bitbucketbot/service/executor/Executor.java create mode 100644 src/main/java/com/tsc/bitbucketbot/service/executor/ResultScan.java create mode 100644 src/main/java/com/tsc/bitbucketbot/service/executor/Seeker.java create mode 100644 src/main/java/com/tsc/bitbucketbot/service/impl/ExecutorScanner.java create mode 100644 src/main/java/com/tsc/bitbucketbot/utils/NonNullUtils.java diff --git a/pom.xml b/pom.xml index e97aea4..3311195 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,12 @@ + + com.google.guava + guava + 28.2-jre + + com.squareup.okhttp3 okhttp diff --git a/src/main/java/com/tsc/bitbucketbot/config/AppConfig.java b/src/main/java/com/tsc/bitbucketbot/config/AppConfig.java index 049576f..39acfda 100644 --- a/src/main/java/com/tsc/bitbucketbot/config/AppConfig.java +++ b/src/main/java/com/tsc/bitbucketbot/config/AppConfig.java @@ -6,6 +6,9 @@ import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + @Configuration @EnableScheduling public class AppConfig { @@ -17,4 +20,9 @@ public class AppConfig { return taskScheduler; } + @Bean + public ExecutorService executorService() { + return Executors.newFixedThreadPool(10); + } + } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/AnswerCommentChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/AnswerCommentChange.java index 5d68eb4..d78d149 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/AnswerCommentChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/AnswerCommentChange.java @@ -4,7 +4,6 @@ import com.tsc.bitbucketbot.domain.Answer; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Singular; import java.util.List; import java.util.Set; @@ -19,12 +18,12 @@ public class AnswerCommentChange extends Change { @Builder protected AnswerCommentChange( - @Singular("telegramId") Set telegramId, + Set telegramIds, String youMessage, String url, List answers ) { - super(ChangeType.NEW_ANSWERS_COMMENT, telegramId); + super(ChangeType.NEW_ANSWERS_COMMENT, telegramIds); this.youMessage = youMessage; this.url = url; this.answers = answers; diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/Change.java b/src/main/java/com/tsc/bitbucketbot/domain/change/Change.java index 5f7e234..8f6e0e9 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/Change.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/Change.java @@ -13,13 +13,13 @@ public abstract class Change { protected final ChangeType type; protected final LocalDateTime localDateTime = LocalDateTime.now(); - protected final Set telegramId; + protected final Set telegramIds; @Setter protected Long id; - protected Change(ChangeType type, Set telegramId) { + protected Change(ChangeType type, Set telegramIds) { this.type = type; - this.telegramId = telegramId; + this.telegramIds = telegramIds; } } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/CommentChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/CommentChange.java index 29cb9e9..c033fc4 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/CommentChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/CommentChange.java @@ -3,28 +3,30 @@ package com.tsc.bitbucketbot.domain.change; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Singular; import java.util.Set; @Getter @EqualsAndHashCode(callSuper = true) -public class CommentChange extends PrChange { +public class CommentChange extends Change { private final String authorName; private final String message; + private final String url; @Builder private CommentChange( - @Singular("telegramId") Set telegramId, - String name, + Set telegramIds, String url, String authorName, String message ) { - super(ChangeType.NEW_COMMENT, telegramId, name, url); + super(ChangeType.NEW_COMMENT, telegramIds); this.authorName = authorName; this.message = message; + this.url = url; } } + + diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java index d58f23f..d5d9c8d 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java @@ -2,7 +2,6 @@ package com.tsc.bitbucketbot.domain.change; import lombok.Builder; import lombok.Getter; -import lombok.Singular; import java.util.Set; @@ -11,11 +10,11 @@ public class ConflictPrChange extends PrChange { @Builder private ConflictPrChange( - @Singular("telegramId") Set telegramId, + Set telegramIds, String name, String url ) { - super(ChangeType.CONFLICT_PR, telegramId, name, url); + super(ChangeType.CONFLICT_PR, telegramIds, name, url); } } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/NewPrChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/NewPrChange.java index 317790c..180c598 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/NewPrChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/NewPrChange.java @@ -3,7 +3,6 @@ package com.tsc.bitbucketbot.domain.change; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Singular; import java.util.Set; @@ -16,12 +15,12 @@ public class NewPrChange extends PrChange { @Builder private NewPrChange( - @Singular("telegramId") Set telegramId, + Set telegramIds, String name, String url, String description, String author) { - super(ChangeType.NEW_PR, telegramId, name, url); + super(ChangeType.NEW_PR, telegramIds, name, url); this.description = description; this.author = author; } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/PrChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/PrChange.java index 44e3c65..417fe28 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/PrChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/PrChange.java @@ -12,8 +12,8 @@ public abstract class PrChange extends Change { private final String name; private final String url; - protected PrChange(ChangeType type, Set telegramId, String name, String url) { - super(type, telegramId); + protected PrChange(ChangeType type, Set telegramIds, String name, String url) { + super(type, telegramIds); this.name = name; this.url = url; } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/ReviewersPrChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/ReviewersPrChange.java index 0d7df1a..1377fca 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/ReviewersPrChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/ReviewersPrChange.java @@ -4,7 +4,6 @@ import com.tsc.bitbucketbot.domain.util.ReviewerChange; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Singular; import java.util.List; import java.util.Set; @@ -17,11 +16,11 @@ public class ReviewersPrChange extends PrChange { @Builder private ReviewersPrChange( - @Singular("telegramId") Set telegramId, + Set telegramIds, String name, String url, List reviewerChanges) { - super(ChangeType.REVIEWERS, telegramId, name, url); + super(ChangeType.REVIEWERS, telegramIds, name, url); this.reviewerChanges = reviewerChanges; } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/StatusPrChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/StatusPrChange.java index 9110ae2..443a855 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/StatusPrChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/StatusPrChange.java @@ -4,7 +4,6 @@ import com.tsc.bitbucketbot.domain.PullRequestStatus; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Singular; import java.util.Set; @@ -17,12 +16,12 @@ public class StatusPrChange extends PrChange { @Builder private StatusPrChange( - @Singular("telegramId") Set telegramId, + Set telegramIds, String name, String url, PullRequestStatus oldStatus, PullRequestStatus newStatus) { - super(ChangeType.STATUS_PR, telegramId, name, url); + super(ChangeType.STATUS_PR, telegramIds, name, url); this.oldStatus = oldStatus; this.newStatus = newStatus; } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/UpdatePrChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/UpdatePrChange.java index f416585..932bdc1 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/UpdatePrChange.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/UpdatePrChange.java @@ -3,7 +3,6 @@ package com.tsc.bitbucketbot.domain.change; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Singular; import java.util.Set; @@ -15,10 +14,10 @@ public class UpdatePrChange extends PrChange { @Builder private UpdatePrChange( - @Singular("telegramId") Set telegramId, + Set telegramIds, String name, String url, String author) { - super(ChangeType.UPDATE_PR, telegramId, name, url); + super(ChangeType.UPDATE_PR, telegramIds, name, url); this.author = author; } diff --git a/src/main/java/com/tsc/bitbucketbot/repository/jpa/UserRepository.java b/src/main/java/com/tsc/bitbucketbot/repository/jpa/UserRepository.java index c12cc28..a38c046 100644 --- a/src/main/java/com/tsc/bitbucketbot/repository/jpa/UserRepository.java +++ b/src/main/java/com/tsc/bitbucketbot/repository/jpa/UserRepository.java @@ -27,7 +27,7 @@ public interface UserRepository extends JpaRepository { Long findTelegramIdByLogin(String login); @Query("SELECT u.telegramId FROM User u WHERE u.login IN :logins AND u.telegramId IS NOT NULL") - List findAllTelegramIdByLogin(Set logins); + Set findAllTelegramIdByLogin(Set logins); Optional findByLogin(String login); diff --git a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java index 0fb3914..5d30fa5 100644 --- a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java +++ b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java @@ -28,14 +28,14 @@ public class SchedulerChangeParsing { private final MessageSendService messageSendService; private final ChangeService changeService; - @Scheduled(cron = "30 */1 * * * MON-FRI") + @Scheduled(cron = "*/15 * * * * *") public void parsing() { final List newChange = changeService.getNew().stream() - .filter(change -> change.getTelegramId() != null && !change.getTelegramId().isEmpty()) + .filter(change -> change.getTelegramIds() != null && !change.getTelegramIds().isEmpty()) .collect(Collectors.toList()); for (Change change : newChange) { final String message = generateMessage(change); - change.getTelegramId().forEach( + change.getTelegramIds().forEach( telegramId -> messageSendService.add( MessageSend.builder() .telegramId(telegramId) diff --git a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerComments.java b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerComments.java index c3b4c4c..6f2ec70 100644 --- a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerComments.java +++ b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerComments.java @@ -13,6 +13,9 @@ import com.tsc.bitbucketbot.service.CommentService; import com.tsc.bitbucketbot.service.PullRequestsService; import com.tsc.bitbucketbot.service.UserService; import com.tsc.bitbucketbot.service.Utils; +import com.tsc.bitbucketbot.service.executor.DataScan; +import com.tsc.bitbucketbot.service.executor.ResultScan; +import com.tsc.bitbucketbot.service.impl.ExecutorScanner; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,6 +24,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -35,45 +40,48 @@ import java.util.stream.Collectors; public class SchedulerComments { private static final Integer COUNT = 100; - private static final Integer NO_COMMENT = 30; + private static final Integer NO_COMMENT = 6; private static final Pattern PATTERN = Pattern.compile("@[\\w]+"); private final CommentService commentService; private final PullRequestsService pullRequestsService; private final UserService userService; private final ChangeService changeService; + private final ExecutorScanner executorScanner; private final BitbucketConfig bitbucketConfig; - @Scheduled(cron = "0 */4 8-18 * * MON-FRI") + @Scheduled(cron = "0 */1 * * * MON-FRI") public void newComments() { - log.info("Начало сканирования комментариев"); long commentId = commentService.getLastCommentId() + 1; - long count = 0; + int count = 0; do { - int page = 0; - Page pullRequestPage = pullRequestsService.getAll(Pagination.of(page, COUNT)); - while (pullRequestPage.hasContent()) { - for (PullRequest pullRequest : pullRequestPage.getContent()) { - final String commentUrl = getCommentUrl(commentId, pullRequest); - final Optional optCommentJson = Utils.urlToJson(commentUrl, bitbucketConfig.getToken(), CommentJson.class); - if (optCommentJson.isPresent()) { - final CommentJson commentJson = optCommentJson.get(); - notification(commentJson, pullRequest); - saveComments(commentJson, commentUrl, pullRequest.getUrl()); - count = 0; - break; - } + List commentUrls = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + int page = 0; + Page pullRequestPage = pullRequestsService.getAll(Pagination.of(page, COUNT)); + while (pullRequestPage.hasContent()) { + long finalCommentId = commentId; + commentUrls.addAll(pullRequestPage.getContent().stream() + .map(pullRequest -> new DataScan(getCommentUrl(finalCommentId, pullRequest), pullRequest.getUrl())) + .collect(Collectors.toList())); + pullRequestPage = pullRequestsService.getAll(Pagination.of(++page, COUNT)); } - pullRequestPage = pullRequestsService.getAll(Pagination.of(++page, COUNT)); + commentId++; } - count++; - commentId += 1; - } while (count < NO_COMMENT); - log.info("Конец сканирования комментариев"); + executorScanner.registration(commentUrls); + final List result = executorScanner.getResult(); + if (!result.isEmpty()) { + result.forEach(resultScan -> { + notificationPersonal(resultScan.getCommentJson(), resultScan.getUrlPr()); + saveComments(resultScan.getCommentJson(), resultScan.getUrlComment(), resultScan.getUrlPr()); + }); + count = 0; + } + } while (count++ < NO_COMMENT); } - @Scheduled(cron = "0 */1 8-18 * * MON-FRI") + @Scheduled(cron = "0 */1 * * * MON-FRI") public void oldComments() { @NonNull final List comments = commentService.getAllBetweenDate(LocalDateTime.now().minusDays(10), LocalDateTime.now()); for (Comment comment : comments) { @@ -91,7 +99,11 @@ public class SchedulerComments { if (!newAnswers.isEmpty()) { changeService.add( AnswerCommentChange.builder() - .telegramId(userService.getTelegramIdByLogin(commentJson.getAuthor().getName()).orElse(null)) + .telegramIds( + userService.getTelegramIdByLogin(commentJson.getAuthor().getName()) + .map(Collections::singleton) + .orElse(Collections.emptySet()) + ) .url(comment.getPrUrl()) .youMessage(commentJson.getText()) .answers( @@ -127,24 +139,19 @@ public class SchedulerComments { .replace("{commentId}", String.valueOf(commentId)); } - private void notification(@NonNull CommentJson comment, @NonNull PullRequest pullRequest) { - notificationPersonal(comment, pullRequest); - } - - private void notificationPersonal(@NonNull CommentJson comment, @NonNull PullRequest pullRequest) { + private void notificationPersonal(@NonNull CommentJson comment, @NonNull String urlPr) { Matcher matcher = PATTERN.matcher(comment.getText()); Set recipientsLogins = new HashSet<>(); while (matcher.find()) { final String login = matcher.group(0).replace("@", ""); recipientsLogins.add(login); } - final List recipientsIds = userService.getAllTelegramIdByLogin(recipientsLogins); + final Set recipientsIds = userService.getAllTelegramIdByLogin(recipientsLogins); changeService.add( CommentChange.builder() .authorName(comment.getAuthor().getName()) - .name(pullRequest.getName()) - .url(pullRequest.getUrl()) - .telegramId(recipientsIds) + .url(urlPr) + .telegramIds(recipientsIds) .message(comment.getText()) .build() ); diff --git a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java index 7206d70..fea42b9 100644 --- a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java +++ b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java @@ -19,6 +19,7 @@ import com.tsc.bitbucketbot.service.ChangeService; import com.tsc.bitbucketbot.service.PullRequestsService; import com.tsc.bitbucketbot.service.UserService; import com.tsc.bitbucketbot.service.Utils; +import com.tsc.bitbucketbot.utils.NonNullUtils; import com.tsc.bitbucketbot.utils.Pair; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -28,6 +29,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -82,7 +84,7 @@ public class SchedulerPullRequest { .url(pullRequest.getUrl()) .oldStatus(pullRequest.getStatus()) .newStatus(DELETE) - .telegramId(pullRequest.getAuthor().getTelegramId()) + .telegramIds(Collections.singleton(pullRequest.getAuthor().getTelegramId())) .build() )); pullRequestsService.updateAll( @@ -183,7 +185,7 @@ public class SchedulerPullRequest { ConflictPrChange.builder() .name(pullRequest.getName()) .url(pullRequest.getUrl()) - .telegramId(pullRequest.getAuthor().getTelegramId()) + .telegramIds(NonNullUtils.telegramIdByUser(pullRequest.getAuthor())) .build() ); } @@ -194,13 +196,13 @@ public class SchedulerPullRequest { final Set logins = newPullRequest.getReviewers().stream() .map(Reviewer::getUser) .collect(Collectors.toSet()); - final List telegramIds = userService.getAllTelegramIdByLogin(logins); + final Set telegramIds = userService.getAllTelegramIdByLogin(logins); changeService.add( UpdatePrChange.builder() .name(newPullRequest.getName()) .url(newPullRequest.getUrl()) .author(newPullRequest.getAuthor().getLogin()) - .telegramId(telegramIds) + .telegramIds(telegramIds) .build() ); } @@ -241,7 +243,7 @@ public class SchedulerPullRequest { .name(pullRequest.getName()) .url(pullRequest.getUrl()) .reviewerChanges(reviewerChanges) - .telegramId(newPullRequest.getAuthor().getTelegramId()) + .telegramIds(NonNullUtils.telegramIdByUser(pullRequest.getAuthor())) .build() ); } @@ -259,7 +261,7 @@ public class SchedulerPullRequest { .url(newPullRequest.getUrl()) .oldStatus(oldStatus) .newStatus(newStatus) - .telegramId(newPullRequest.getAuthor().getTelegramId()) + .telegramIds(NonNullUtils.telegramIdByUser(newPullRequest.getAuthor())) .build() ); } @@ -293,7 +295,7 @@ public class SchedulerPullRequest { private void sendNotificationNewPullRequest(@NonNull List newPullRequests) { if (!newPullRequests.isEmpty()) { for (PullRequest newPullRequest : newPullRequests) { - final List reviewerTelegramIds = userService.getAllTelegramIdByLogin(newPullRequest.getReviewers().stream() + final Set reviewerTelegramIds = userService.getAllTelegramIdByLogin(newPullRequest.getReviewers().stream() .map(Reviewer::getUser) .collect(Collectors.toSet())); changeService.add( @@ -302,7 +304,7 @@ public class SchedulerPullRequest { .url(newPullRequest.getUrl()) .description(newPullRequest.getDescription()) .author(newPullRequest.getAuthor().getLogin()) - .telegramId(reviewerTelegramIds) + .telegramIds(reviewerTelegramIds) .build() ); } diff --git a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPushMessageSend.java b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPushMessageSend.java index 8ab827f..cf8ce99 100644 --- a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPushMessageSend.java +++ b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPushMessageSend.java @@ -38,8 +38,8 @@ public class SchedulerPushMessageSend { @PostConstruct public void init() { - int proxyPort = 8080; - String proxyHost = "proxy.tsc.ts"; + final int proxyPort = 8080; + final String proxyHost = "proxy.tsc.ts"; final String username = "internet"; final String password = "123454321"; @@ -72,12 +72,12 @@ public class SchedulerPushMessageSend { } private void sendMessage(String json) { + System.out.println(json); RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(pushMessageConfig.getUrl()) .post(body) .build(); - try (final Response response = client.newCall(request).execute()) { if (response.code() != 200) { log.error("Ошибка отправки сообщения: " + response); diff --git a/src/main/java/com/tsc/bitbucketbot/service/UserService.java b/src/main/java/com/tsc/bitbucketbot/service/UserService.java index 366d8d9..3dee2db 100644 --- a/src/main/java/com/tsc/bitbucketbot/service/UserService.java +++ b/src/main/java/com/tsc/bitbucketbot/service/UserService.java @@ -21,6 +21,6 @@ public interface UserService { Optional getTelegramIdByLogin(@NonNull String login); - List getAllTelegramIdByLogin(Set logins); + Set getAllTelegramIdByLogin(Set logins); } diff --git a/src/main/java/com/tsc/bitbucketbot/service/executor/DataScan.java b/src/main/java/com/tsc/bitbucketbot/service/executor/DataScan.java new file mode 100644 index 0000000..634be1b --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/service/executor/DataScan.java @@ -0,0 +1,11 @@ +package com.tsc.bitbucketbot.service.executor; + +import lombok.Data; + +@Data +public class DataScan { + + private final String urlComment; + private final String urlPr; + +} diff --git a/src/main/java/com/tsc/bitbucketbot/service/executor/Executor.java b/src/main/java/com/tsc/bitbucketbot/service/executor/Executor.java new file mode 100644 index 0000000..6b84000 --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/service/executor/Executor.java @@ -0,0 +1,12 @@ +package com.tsc.bitbucketbot.service.executor; + +import lombok.NonNull; + +import java.util.List; + +public interface Executor { + + boolean registration(@NonNull List seeker); + + List getResult(); +} diff --git a/src/main/java/com/tsc/bitbucketbot/service/executor/ResultScan.java b/src/main/java/com/tsc/bitbucketbot/service/executor/ResultScan.java new file mode 100644 index 0000000..671c8a2 --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/service/executor/ResultScan.java @@ -0,0 +1,13 @@ +package com.tsc.bitbucketbot.service.executor; + +import com.tsc.bitbucketbot.dto.bitbucket.CommentJson; +import lombok.Data; + +@Data +public class ResultScan { + + private final String urlComment; + private final String urlPr; + private final CommentJson commentJson; + +} diff --git a/src/main/java/com/tsc/bitbucketbot/service/executor/Seeker.java b/src/main/java/com/tsc/bitbucketbot/service/executor/Seeker.java new file mode 100644 index 0000000..75e4aeb --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/service/executor/Seeker.java @@ -0,0 +1,30 @@ +package com.tsc.bitbucketbot.service.executor; + +import com.tsc.bitbucketbot.dto.bitbucket.CommentJson; +import com.tsc.bitbucketbot.service.Utils; +import lombok.RequiredArgsConstructor; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +public class Seeker implements Callable> { + + private final List dataScan; + private final String token; + + @Override + public List call() throws Exception { + return dataScan.stream() + .map( + data -> Utils.urlToJson(data.getUrlComment(), token, CommentJson.class) + .map(commentJson -> new ResultScan(data.getUrlComment(), data.getUrlPr(), commentJson)) + ) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + } + +} diff --git a/src/main/java/com/tsc/bitbucketbot/service/impl/ExecutorScanner.java b/src/main/java/com/tsc/bitbucketbot/service/impl/ExecutorScanner.java new file mode 100644 index 0000000..46a011e --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/service/impl/ExecutorScanner.java @@ -0,0 +1,64 @@ +package com.tsc.bitbucketbot.service.impl; + +import com.google.common.collect.Lists; +import com.tsc.bitbucketbot.config.BitbucketConfig; +import com.tsc.bitbucketbot.service.executor.DataScan; +import com.tsc.bitbucketbot.service.executor.Executor; +import com.tsc.bitbucketbot.service.executor.ResultScan; +import com.tsc.bitbucketbot.service.executor.Seeker; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ExecutorScanner implements Executor { + + private final ExecutorService executorService; + private final List>> resultList = new ArrayList<>(); + private final BitbucketConfig bitbucketConfig; + + @Override + public boolean registration(@NonNull List dataScans) { + Lists.partition(dataScans, 20).forEach( + list -> resultList.add(executorService.submit(new Seeker(list, bitbucketConfig.getToken()))) + ); + return true; + } + + @Override + public List getResult() { + while (!resultList.stream().allMatch(Future::isDone)) { + + } + final List result = resultList.stream() + .filter(Future::isDone) + .map(this::getResultScans) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + resultList.clear(); + return result; + } + + private List getResultScans(Future> listFuture) { + try { + return listFuture.get(); + } catch (InterruptedException | ExecutionException e) { + log.error(e.getMessage()); + } + return Collections.emptyList(); + } + + +} diff --git a/src/main/java/com/tsc/bitbucketbot/service/impl/UserServiceImpl.java b/src/main/java/com/tsc/bitbucketbot/service/impl/UserServiceImpl.java index cb99fb0..5b5591b 100644 --- a/src/main/java/com/tsc/bitbucketbot/service/impl/UserServiceImpl.java +++ b/src/main/java/com/tsc/bitbucketbot/service/impl/UserServiceImpl.java @@ -69,7 +69,7 @@ public class UserServiceImpl implements UserService { } @Override - public List getAllTelegramIdByLogin(Set logins) { + public Set getAllTelegramIdByLogin(Set logins) { return userRepository.findAllTelegramIdByLogin(logins); } diff --git a/src/main/java/com/tsc/bitbucketbot/utils/Message.java b/src/main/java/com/tsc/bitbucketbot/utils/Message.java index 3894b8d..ab68bb8 100644 --- a/src/main/java/com/tsc/bitbucketbot/utils/Message.java +++ b/src/main/java/com/tsc/bitbucketbot/utils/Message.java @@ -151,10 +151,8 @@ public class Message { } public static String generate(@NonNull CommentChange commentChange) { - return Smile.BELL + " *Новое упоминание* | " + commentChange.getAuthorName() + Smile.BR + - link(commentChange.getName(), commentChange.getUrl()) + - Smile.HR + - commentChange.getMessage().replaceAll("@[\\w]+", ""); + return Smile.BELL + " *Новое упоминание* | " + link("ПР", commentChange.getUrl()) + Smile.HR + + commentChange.getAuthorName() + ": " + commentChange.getMessage().replaceAll("@[\\w]+", ""); } public static String generate(@NonNull AnswerCommentChange answerCommentChange) { diff --git a/src/main/java/com/tsc/bitbucketbot/utils/NonNullUtils.java b/src/main/java/com/tsc/bitbucketbot/utils/NonNullUtils.java new file mode 100644 index 0000000..a06d324 --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/utils/NonNullUtils.java @@ -0,0 +1,19 @@ +package com.tsc.bitbucketbot.utils; + +import com.tsc.bitbucketbot.domain.entity.User; +import lombok.NonNull; + +import java.util.Collections; +import java.util.Set; + +public class NonNullUtils { + + private NonNullUtils() { + throw new IllegalStateException("Утилитный класс"); + } + + public static Set telegramIdByUser(@NonNull User user) { + return user.getTelegramId() != null ? Collections.singleton(user.getTelegramId()) : Collections.emptySet(); + } + +} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 0335154..e106cf3 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -18,7 +18,7 @@ - + \ No newline at end of file