diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java index ee25d54790..556ff2a127 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java @@ -111,7 +111,7 @@ public class ReviewersUtil { private final AccountQueryBuilder accountQueryBuilder; private final Provider queryProvider; private final GroupBackend groupBackend; - private final GroupMembers.Factory groupMembersFactory; + private final GroupMembers groupMembers; private final Provider currentUser; private final ReviewerRecommender reviewerRecommender; private final Metrics metrics; @@ -122,7 +122,7 @@ public class ReviewersUtil { AccountQueryBuilder accountQueryBuilder, Provider queryProvider, GroupBackend groupBackend, - GroupMembers.Factory groupMembersFactory, + GroupMembers groupMembers, Provider currentUser, ReviewerRecommender reviewerRecommender, Metrics metrics) { @@ -133,7 +133,7 @@ public class ReviewersUtil { this.queryProvider = queryProvider; this.currentUser = currentUser; this.groupBackend = groupBackend; - this.groupMembersFactory = groupMembersFactory; + this.groupMembers = groupMembers; this.reviewerRecommender = reviewerRecommender; this.metrics = metrics; } @@ -303,10 +303,7 @@ public class ReviewersUtil { } try { - Set members = - groupMembersFactory - .create(currentUser.get()) - .listAccounts(group.getUUID(), project.getNameKey()); + Set members = groupMembers.listAccounts(group.getUUID(), project.getNameKey()); if (members.isEmpty()) { return result; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java index 4dc960d323..f1f688cc6e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java @@ -21,15 +21,14 @@ import com.google.gerrit.common.errors.NoSuchGroupException; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; -import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.group.InternalGroup; import com.google.gerrit.server.group.InternalGroupDescription; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.server.project.NoSuchProjectException; -import com.google.gerrit.server.project.ProjectControl; +import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.project.ProjectState; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; -import com.google.inject.assistedinject.Assisted; import java.io.IOException; import java.util.Collections; import java.util.HashSet; @@ -37,28 +36,22 @@ import java.util.Optional; import java.util.Set; public class GroupMembers { - public interface Factory { - GroupMembers create(CurrentUser currentUser); - } private final GroupCache groupCache; private final GroupControl.Factory groupControlFactory; private final AccountCache accountCache; - private final ProjectControl.GenericFactory projectControl; - private final CurrentUser currentUser; + private final ProjectCache projectCache; @Inject GroupMembers( GroupCache groupCache, GroupControl.Factory groupControlFactory, AccountCache accountCache, - ProjectControl.GenericFactory projectControl, - @Assisted CurrentUser currentUser) { + ProjectCache projectCache) { this.groupCache = groupCache; this.groupControlFactory = groupControlFactory; this.accountCache = accountCache; - this.projectControl = projectControl; - this.currentUser = currentUser; + this.projectCache = projectCache; } public Set listAccounts(AccountGroup.UUID groupUUID, Project.NameKey project) @@ -88,11 +81,13 @@ public class GroupMembers { return Collections.emptySet(); } - final Iterable ownerGroups = - projectControl.controlFor(project, currentUser).getProjectState().getAllOwners(); + ProjectState projectState = projectCache.checkedGet(project); + if (projectState == null) { + throw new NoSuchProjectException(project); + } final HashSet projectOwners = new HashSet<>(); - for (AccountGroup.UUID ownerGroup : ownerGroups) { + for (AccountGroup.UUID ownerGroup : projectState.getAllOwners()) { if (!seen.contains(ownerGroup)) { projectOwners.addAll(listAccounts(ownerGroup, project, seen)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java index fabf1286bd..d267896622 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java @@ -34,7 +34,6 @@ import com.google.gerrit.server.group.ListGroups; import com.google.gerrit.server.group.QueryGroups; import com.google.gerrit.server.permissions.GlobalPermission; import com.google.gerrit.server.permissions.PermissionBackend; -import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.project.ProjectResource; import com.google.gerrit.server.project.ProjectsCollection; import com.google.inject.Inject; @@ -54,7 +53,6 @@ class GroupsImpl implements Groups { private final PermissionBackend permissionBackend; private final CreateGroup.Factory createGroup; private final GroupApiImpl.Factory api; - private final ProjectControl.GenericFactory projectControlFactory; @Inject GroupsImpl( @@ -66,8 +64,7 @@ class GroupsImpl implements Groups { Provider user, PermissionBackend permissionBackend, CreateGroup.Factory createGroup, - GroupApiImpl.Factory api, - ProjectControl.GenericFactory projectControlFactory) { + GroupApiImpl.Factory api) { this.accounts = accounts; this.groups = groups; this.projects = projects; @@ -77,7 +74,6 @@ class GroupsImpl implements Groups { this.permissionBackend = permissionBackend; this.createGroup = createGroup; this.api = api; - this.projectControlFactory = projectControlFactory; } @Override @@ -125,7 +121,7 @@ class GroupsImpl implements Groups { for (String project : req.getProjects()) { try { ProjectResource rsrc = projects.parse(tlr, IdString.fromDecoded(project)); - list.addProject(projectControlFactory.controlFor(rsrc.getNameKey(), rsrc.getUser())); + list.addProject(rsrc.getProjectState()); } catch (Exception e) { throw asRestApiException("Error looking up project " + project, e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java index f642aa4082..3664293cf4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java @@ -91,7 +91,7 @@ public class PostReviewers private final PermissionBackend permissionBackend; private final GroupsCollection groupsCollection; - private final GroupMembers.Factory groupMembersFactory; + private final GroupMembers groupMembers; private final AccountLoader.Factory accountLoaderFactory; private final Provider dbProvider; private final ChangeData.Factory changeDataFactory; @@ -111,7 +111,7 @@ public class PostReviewers ReviewerResource.Factory reviewerFactory, PermissionBackend permissionBackend, GroupsCollection groupsCollection, - GroupMembers.Factory groupMembersFactory, + GroupMembers groupMembers, AccountLoader.Factory accountLoaderFactory, Provider db, ChangeData.Factory changeDataFactory, @@ -130,7 +130,7 @@ public class PostReviewers this.reviewerFactory = reviewerFactory; this.permissionBackend = permissionBackend; this.groupsCollection = groupsCollection; - this.groupMembersFactory = groupMembersFactory; + this.groupMembers = groupMembers; this.accountLoaderFactory = accountLoaderFactory; this.dbProvider = db; this.changeDataFactory = changeDataFactory; @@ -287,10 +287,7 @@ public class PostReviewers Set reviewers = new HashSet<>(); Set members; try { - members = - groupMembersFactory - .create(rsrc.getUser()) - .listAccounts(group.getGroupUUID(), rsrc.getProject()); + members = groupMembers.listAccounts(group.getGroupUUID(), rsrc.getProject()); } catch (NoSuchGroupException e) { return fail( reviewer, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java index 0e4e8b4122..3332b98864 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java @@ -91,7 +91,6 @@ import com.google.gerrit.server.account.EmailExpander; import com.google.gerrit.server.account.GroupCacheImpl; import com.google.gerrit.server.account.GroupControl; import com.google.gerrit.server.account.GroupIncludeCacheImpl; -import com.google.gerrit.server.account.GroupMembers; import com.google.gerrit.server.account.VersionedAuthorizedKeys; import com.google.gerrit.server.account.externalids.ExternalIdModule; import com.google.gerrit.server.api.accounts.AccountExternalIdCreator; @@ -250,7 +249,6 @@ public class GerritGlobalModule extends FactoryModule { factory(ChangeData.AssistedFactory.class); factory(ChangeJson.AssistedFactory.class); factory(CreateChangeSender.Factory.class); - factory(GroupMembers.Factory.class); factory(EmailMerge.Factory.class); factory(MergedSender.Factory.class); factory(MergeUtil.Factory.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java index 910468f6e2..0c5b160a7e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java @@ -67,7 +67,7 @@ public class ListGroups implements RestReadView { protected final GroupCache groupCache; - private final List projects = new ArrayList<>(); + private final List projects = new ArrayList<>(); private final Set groupsToInspect = new HashSet<>(); private final GroupControl.Factory groupControlFactory; private final GroupControl.GenericFactory genericGroupControlFactory; @@ -95,6 +95,10 @@ public class ListGroups implements RestReadView { usage = "projects for which the groups should be listed" ) public void addProject(ProjectControl project) { + addProject(project.getProjectState()); + } + + public void addProject(ProjectState project) { projects.add(project); } @@ -241,7 +245,7 @@ public class ListGroups implements RestReadView { return user; } - public List getProjects() { + public List getProjects() { return projects; } @@ -298,7 +302,6 @@ public class ListGroups implements RestReadView { if (!projects.isEmpty()) { return projects .stream() - .map(ProjectControl::getProjectState) .map(ProjectState::getAllGroups) .flatMap(Collection::stream) .map(GroupReference::getUUID) @@ -318,9 +321,7 @@ public class ListGroups implements RestReadView { List groupRefs = Lists.newArrayList( Iterables.limit( - groupBackend.suggest( - suggest, - projects.stream().findFirst().map(pc -> pc.getProjectState()).orElse(null)), + groupBackend.suggest(suggest, projects.stream().findFirst().orElse(null)), limit <= 0 ? 10 : Math.min(limit, 10))); List groupInfos = Lists.newArrayListWithCapacity(groupRefs.size());