From c974ed78686582ac6f47b2ada36c1ea9796e3c95 Mon Sep 17 00:00:00 2001 From: Dariusz Luksza Date: Mon, 3 Dec 2012 12:46:37 +0100 Subject: Include project object during group name suggestion GroupBackend implementers should have more information about context in which group name suggestion should occurs. Our context here is project to which we user want to add new access configuration. Project name and parent project name could narrow list of possible suggestions. Change-Id: I1349f00c3999843925750c195a218b0ea0614951 Signed-off-by: Dariusz Luksza --- .../gerrit/httpd/rpc/SuggestServiceImpl.java | 5 ++- .../google/gerrit/server/account/GroupBackend.java | 5 ++- .../gerrit/server/account/GroupBackends.java | 43 +++++++++++++++++++--- .../server/account/InternalGroupBackend.java | 4 +- .../server/account/UniversalGroupBackend.java | 5 ++- .../gerrit/server/auth/ldap/LdapGroupBackend.java | 3 +- .../server/query/change/ChangeQueryBuilder.java | 2 +- 7 files changed, 53 insertions(+), 14 deletions(-) diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java index 559c270270..22546a7955 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java @@ -201,8 +201,9 @@ class SuggestServiceImpl extends BaseServiceImplementation implements private List suggestAccountGroup( @Nullable final ProjectControl projectControl, final String query, final int limit) { - final int n = limit <= 0 ? 10 : Math.min(limit, 10); - return Lists.newArrayList(Iterables.limit(groupBackend.suggest(query), n)); + return Lists.newArrayList(Iterables.limit( + groupBackend.suggest(query, projectControl), + limit <= 0 ? 10 : Math.min(limit, 10))); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java index b4e770fdbe..34db9672c6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java @@ -19,6 +19,7 @@ import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.project.ProjectControl; import java.util.Collection; @@ -44,7 +45,9 @@ public interface GroupBackend { GroupDescription.Basic get(AccountGroup.UUID uuid); /** @return suggestions for the group name sorted by name. */ - Collection suggest(String name); + Collection suggest( + String name, + @Nullable ProjectControl project); /** @return the group membership checker for the backend. */ GroupMembership membershipsOf(IdentifiedUser user); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java index cdbb0e49bc..f7e06344d2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java @@ -16,6 +16,8 @@ package com.google.gerrit.server.account; import com.google.common.collect.Iterables; import com.google.gerrit.common.data.GroupReference; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.project.ProjectControl; import java.util.Collection; import java.util.Comparator; @@ -36,7 +38,7 @@ public class GroupBackends { }; /** - * Runs {@link GroupBackend#suggest(String)} and filters the result to return + * Runs {@link GroupBackend#suggest(String, Project)} and filters the result to return * the best suggestion, or null if one does not exist. * * @param groupBackend the group backend @@ -44,9 +46,23 @@ public class GroupBackends { * @return the best single GroupReference suggestion */ @Nullable - public static GroupReference findBestSuggestion( - GroupBackend groupBackend, String name) { - Collection refs = groupBackend.suggest(name); + public static GroupReference findBestSuggestion(GroupBackend groupBackend, + String name) { + return findBestSuggestion(groupBackend, name, null); + } + /** + * Runs {@link GroupBackend#suggest(String, Project)} and filters the result to return + * the best suggestion, or null if one does not exist. + * + * @param groupBackend the group backend + * @param name the name for which to suggest groups + * @param project the project for which to suggest groups + * @return the best single GroupReference suggestion + */ + @Nullable + public static GroupReference findBestSuggestion(GroupBackend groupBackend, + String name, @Nullable ProjectControl project) { + Collection refs = groupBackend.suggest(name, project); if (refs.size() == 1) { return Iterables.getOnlyElement(refs); } @@ -60,7 +76,7 @@ public class GroupBackends { } /** - * Runs {@link GroupBackend#suggest(String)} and filters the result to return + * Runs {@link GroupBackend#suggest(String, Project)} and filters the result to return * the exact suggestion, or null if one does not exist. * * @param groupBackend the group backend @@ -70,7 +86,22 @@ public class GroupBackends { @Nullable public static GroupReference findExactSuggestion( GroupBackend groupBackend, String name) { - Collection refs = groupBackend.suggest(name); + return findExactSuggestion(groupBackend, name, null); + } + + /** + * Runs {@link GroupBackend#suggest(String, Project)} and filters the result to return + * the exact suggestion, or null if one does not exist. + * + * @param groupBackend the group backend + * @param name the name for which to suggest groups + * @param project the project for which to suggest groups + * @return the exact single GroupReference suggestion + */ + @Nullable + public static GroupReference findExactSuggestion( + GroupBackend groupBackend, String name, ProjectControl project) { + Collection refs = groupBackend.suggest(name, project); for (GroupReference ref : refs) { if (isExactSuggestion(ref, name)) { return ref; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java index d06db4d336..a70f9429a2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java @@ -23,6 +23,7 @@ import com.google.gerrit.common.data.GroupDescriptions; import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -71,7 +72,8 @@ public class InternalGroupBackend implements GroupBackend { } @Override - public Collection suggest(final String name) { + public Collection suggest(final String name, + final ProjectControl project) { Iterable filtered = Iterables.filter(groupCache.all(), new Predicate() { @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java index d9c9257296..046dfa5a59 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java @@ -26,6 +26,7 @@ import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -82,10 +83,10 @@ public class UniversalGroupBackend implements GroupBackend { } @Override - public Collection suggest(String name) { + public Collection suggest(String name, ProjectControl project) { Set groups = Sets.newTreeSet(GROUP_REF_NAME_COMPARATOR); for (GroupBackend g : backends) { - groups.addAll(g.suggest(name)); + groups.addAll(g.suggest(name, project)); } return groups; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java index 2cf372b493..97a03098bb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java @@ -33,6 +33,7 @@ import com.google.gerrit.server.account.GroupMembership; import com.google.gerrit.server.account.ListGroupMembership; import com.google.gerrit.server.auth.ldap.Helper.LdapSchema; import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.name.Named; @@ -164,7 +165,7 @@ public class LdapGroupBackend implements GroupBackend { } @Override - public Collection suggest(String name) { + public Collection suggest(String name, ProjectControl project) { AccountGroup.UUID uuid = new AccountGroup.UUID(name); if (isLdapUUID(uuid)) { GroupDescription.Basic g = get(uuid); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java index 7bbb073a6c..e74172e209 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java @@ -367,7 +367,7 @@ public class ChangeQueryBuilder extends QueryBuilder { // If its not an account, maybe its a group? // - Collection suggestions = args.groupBackend.suggest(who); + Collection suggestions = args.groupBackend.suggest(who, null); if (!suggestions.isEmpty()) { HashSet ids = new HashSet(); for (GroupReference ref : suggestions) { -- cgit v1.2.3