diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java index 620b9ea72b..f98e588262 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java @@ -45,12 +45,9 @@ import org.junit.Test; import java.sql.Timestamp; import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.stream.StreamSupport; @NoHttpd public class GroupsIT extends AbstractDaemonTest { @@ -399,12 +396,10 @@ public class GroupsIT extends AbstractDaemonTest { @Test public void testListAllGroups() throws Exception { - List expectedGroups = - StreamSupport.stream(groupCache.all().spliterator(), false) + List expectedGroups = groupCache.all().stream() .map(a -> a.getName()) + .sorted() .collect(toList()); - Collections.sort(expectedGroups, Comparator.naturalOrder()); - assertThat(expectedGroups.size()).isAtLeast(2); assertThat(gApi.groups().list().getAsMap().keySet()) .containsExactlyElementsIn(expectedGroups).inOrder(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java index c7a2241a6f..3d966d2f0d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java @@ -14,6 +14,7 @@ package com.google.gerrit.server.account; +import com.google.common.collect.ImmutableList; import com.google.gerrit.common.Nullable; import com.google.gerrit.reviewdb.client.AccountGroup; @@ -31,8 +32,8 @@ public interface GroupCache { @Nullable AccountGroup get(AccountGroup.UUID uuid); - /** @return sorted iteration of groups. */ - Iterable all(); + /** @return sorted list of groups. */ + ImmutableList all(); /** Notify the cache that a new group was constructed. */ void onCreateGroup(AccountGroup.NameKey newGroupName); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java index a2f4b65413..4f5cc2b4ac 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java @@ -16,6 +16,7 @@ package com.google.gerrit.server.account; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableList; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.AccountGroupName; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -32,7 +33,6 @@ import com.google.inject.name.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.concurrent.ExecutionException; @@ -151,12 +151,12 @@ public class GroupCacheImpl implements GroupCache { } @Override - public Iterable all() { + public ImmutableList all() { try (ReviewDb db = schema.open()) { - return Collections.unmodifiableList(db.accountGroups().all().toList()); + return ImmutableList.copyOf(db.accountGroups().all()); } catch (OrmException e) { log.warn("Cannot list internal groups", e); - return Collections.emptyList(); + return ImmutableList.of(); } } 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 84660ece7d..2028654fbf 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 @@ -28,7 +28,6 @@ import com.google.inject.Singleton; import org.eclipse.jgit.lib.ObjectId; import java.util.Collection; -import java.util.stream.StreamSupport; /** Implementation of GroupBackend for the internal group system. */ @Singleton @@ -68,7 +67,7 @@ public class InternalGroupBackend implements GroupBackend { @Override public Collection suggest(final String name, final ProjectControl project) { - return StreamSupport.stream(groupCache.all().spliterator(), false) + return groupCache.all().stream() .filter(group -> // startsWithIgnoreCase && isVisible group.getName().regionMatches(true, 0, name, 0, name.length()) 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 d23cac4689..85c3d158cf 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 @@ -45,6 +45,7 @@ import com.google.inject.Provider; import org.kohsuke.args4j.Option; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; @@ -314,11 +315,11 @@ public class ListGroups implements RestReadView { return groups; } - private List filterGroups(final Iterable groups) { - final List filteredGroups = new ArrayList<>(); - final boolean isAdmin = + private List filterGroups(Collection groups) { + List filteredGroups = new ArrayList<>(groups.size()); + boolean isAdmin = identifiedUser.get().getCapabilities().canAdministrateServer(); - for (final AccountGroup group : groups) { + for (AccountGroup group : groups) { if (!Strings.isNullOrEmpty(matchSubstring)) { if (!group.getName().toLowerCase(Locale.US) .contains(matchSubstring.toLowerCase(Locale.US))) { @@ -326,7 +327,7 @@ public class ListGroups implements RestReadView { } } if (!isAdmin) { - final GroupControl c = groupControlFactory.controlFor(group); + GroupControl c = groupControlFactory.controlFor(group); if (!c.isVisible()) { continue; }