Break out ReviewerFilter filtering to util class In preparation of separating event handling from suggests feature. Feature: Issue 12694 Change-Id: Iefe1b4c6c6574cd2ebd160e73ec18500589eaa6b
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java index 348e856..6ace126 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java +++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Reviewers.java
@@ -16,11 +16,7 @@ import static java.util.stream.Collectors.toSet; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; import com.google.common.flogger.FluentLogger; import com.google.gerrit.common.Nullable; import com.google.gerrit.entities.Account; @@ -34,13 +30,9 @@ import com.google.gerrit.extensions.events.RevisionCreatedListener; import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener; import com.google.gerrit.index.query.QueryParseException; -import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.change.ReviewerSuggestion; import com.google.gerrit.server.change.SuggestedReviewer; -import com.google.gerrit.server.query.change.ChangeQueryBuilder; -import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.reviewers.config.ReviewersConfig; import java.util.List; @@ -59,9 +51,7 @@ private final AddReviewers.Factory addReviewersFactory; private final ReviewerWorkQueue workQueue; private final ReviewersConfig config; - private final Provider<CurrentUser> user; - private final ChangeQueryBuilder queryBuilder; - private final Provider<InternalChangeQuery> queryProvider; + private final ReviewersFilterUtil filterUtil; @Inject Reviewers( @@ -69,16 +59,12 @@ AddReviewers.Factory addReviewersFactory, ReviewerWorkQueue workQueue, ReviewersConfig config, - Provider<CurrentUser> user, - ChangeQueryBuilder queryBuilder, - Provider<InternalChangeQuery> queryProvider) { + ReviewersFilterUtil util) { this.resolver = resolver; this.addReviewersFactory = addReviewersFactory; this.workQueue = workQueue; this.config = config; - this.user = user; - this.queryBuilder = queryBuilder; - this.queryProvider = queryProvider; + this.filterUtil = util; } @Override @@ -109,7 +95,7 @@ } try { - Set<String> reviewers = findReviewers(changeId.get(), filters); + Set<String> reviewers = filterUtil.findReviewers(changeId.get(), filters); if (!reviewers.isEmpty()) { return resolver.resolve(reviewers, projectName, changeId.get(), null).stream() .map(a -> suggestedReviewer(a)) @@ -153,9 +139,8 @@ AccountInfo uploader = event.getWho(); int changeNumber = c._number; try { - List<ReviewerFilter> matching = findMatchingFilters(changeNumber, filters); - Set<String> reviewers = getReviewersFrom(matching); - Set<String> ccs = getCcsFrom(matching); + Set<String> reviewers = filterUtil.findReviewers(changeNumber, filters); + Set<String> ccs = filterUtil.findCcs(changeNumber, filters); if (reviewers.isEmpty() && ccs.isEmpty()) { return; } @@ -176,48 +161,4 @@ logger.atSevere().withCause(x).log(x.getMessage()); } } - - private Set<String> findReviewers(int change, List<ReviewerFilter> filters) - throws StorageException, QueryParseException { - return getReviewersFrom(findMatchingFilters(change, filters)); - } - - private Set<String> getReviewersFrom(List<ReviewerFilter> filters) throws StorageException { - ImmutableSet.Builder<String> reviewers = ImmutableSet.builder(); - for (ReviewerFilter f : filters) { - reviewers.addAll(f.getReviewers()); - } - return reviewers.build(); - } - - private Set<String> getCcsFrom(List<ReviewerFilter> filters) throws StorageException { - Set<String> ccs = Sets.newHashSet(); - for (ReviewerFilter f : filters) { - ccs.addAll(f.getCcs()); - } - return ccs; - } - - private List<ReviewerFilter> findMatchingFilters(int change, List<ReviewerFilter> filters) - throws StorageException, QueryParseException { - ImmutableList.Builder<ReviewerFilter> found = ImmutableList.builder(); - for (ReviewerFilter s : filters) { - if (Strings.isNullOrEmpty(s.getFilter()) || s.getFilter().equals("*")) { - found.add(s); - } else if (filterMatch(change, s.getFilter())) { - found.add(s); - } - } - return found.build(); - } - - boolean filterMatch(int change, String filter) throws StorageException, QueryParseException { - Preconditions.checkNotNull(filter); - ChangeQueryBuilder qb = queryBuilder.asUser(user.get()); - return !queryProvider - .get() - .noFields() - .query(qb.parse(String.format("change:%s %s", change, filter))) - .isEmpty(); - } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersFilterUtil.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersFilterUtil.java new file mode 100644 index 0000000..5f0574c --- /dev/null +++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ReviewersFilterUtil.java
@@ -0,0 +1,88 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.googlesource.gerrit.plugins.reviewers; + +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; +import com.google.gerrit.exceptions.StorageException; +import com.google.gerrit.index.query.QueryParseException; +import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.query.change.ChangeQueryBuilder; +import com.google.gerrit.server.query.change.InternalChangeQuery; +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.List; +import java.util.Set; + +public class ReviewersFilterUtil { + private final ChangeQueryBuilder queryBuilder; + private final Provider<InternalChangeQuery> queryProvider; + private final Provider<CurrentUser> user; + + @Inject + public ReviewersFilterUtil( + ChangeQueryBuilder queryBuilder, + Provider<InternalChangeQuery> queryProvider, + Provider<CurrentUser> user) { + this.queryBuilder = queryBuilder; + this.queryProvider = queryProvider; + this.user = user; + } + + public Set<String> findReviewers(int change, List<ReviewerFilter> filters) + throws StorageException, QueryParseException { + Set<String> reviewers = Sets.newHashSet(); + List<ReviewerFilter> found = findReviewerFilters(change, filters); + for (ReviewerFilter s : found) { + reviewers.addAll(s.getReviewers()); + } + return reviewers; + } + + public Set<String> findCcs(int change, List<ReviewerFilter> filters) + throws StorageException, QueryParseException { + Set<String> ccs = Sets.newHashSet(); + List<ReviewerFilter> found = findReviewerFilters(change, filters); + for (ReviewerFilter s : found) { + ccs.addAll(s.getCcs()); + } + return ccs; + } + + private List<ReviewerFilter> findReviewerFilters(int change, List<ReviewerFilter> sections) + throws StorageException, QueryParseException { + ImmutableList.Builder<ReviewerFilter> found = ImmutableList.builder(); + for (ReviewerFilter s : sections) { + if (Strings.isNullOrEmpty(s.getFilter()) || s.getFilter().equals("*")) { + found.add(s); + } else if (filterMatch(change, s.getFilter())) { + found.add(s); + } + } + return found.build(); + } + + boolean filterMatch(int change, String filter) throws StorageException, QueryParseException { + Preconditions.checkNotNull(filter); + ChangeQueryBuilder qb = queryBuilder.asUser(user.get()); + return !queryProvider + .get() + .noFields() + .query(qb.parse(String.format("change:%s %s", change, filter))) + .isEmpty(); + } +}