From ec2ef4f0c4270830eab6dafcdb946fa6e0421dfd Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Wed, 19 Oct 2016 16:49:36 -0400 Subject: [PATCH] ProjectCacheImpl: Harden against null UUIDs Since Ie51b350d GroupList#uuids may include null UUIDs. Regardless of whether or not this is a good idea, these UUIDs are never relevant as defined by ProjectCache#guessRelevantGroupUUIDs. Harden ProjectCacheImpl against this state of affairs as well as future bugs. Change-Id: I74c62a5009123d5d95fea7d39e08addfd29f816c --- .../server/project/ProjectCacheImpl.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java index d27d4f97c2..6f85a28c4c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java @@ -14,6 +14,8 @@ package com.google.gerrit.server.project; +import static java.util.stream.Collectors.toSet; + import com.google.common.base.Throwables; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -40,9 +42,9 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; import java.util.NoSuchElementException; +import java.util.Objects; import java.util.Set; import java.util.SortedSet; import java.util.concurrent.ExecutionException; @@ -200,25 +202,24 @@ public class ProjectCacheImpl implements ProjectCache { } @Override - public Iterable all() { + public SortedSet all() { try { return list.get(ListKey.ALL); } catch (ExecutionException e) { log.warn("Cannot list available projects", e); - return Collections.emptyList(); + return Collections.emptySortedSet(); } } @Override public Set guessRelevantGroupUUIDs() { - Set groups = new HashSet<>(); - for (Project.NameKey n : all()) { - ProjectState p = byName.getIfPresent(n.get()); - if (p != null) { - groups.addAll(p.getConfig().getAllGroupUUIDs()); - } - } - return groups; + return all().stream().map(n -> byName.getIfPresent(n.get())) + .filter(Objects::nonNull) + .flatMap(p -> p.getConfig().getAllGroupUUIDs().stream()) + // getAllGroupUUIDs shouldn't really return null UUIDs, but harden + // against them just in case there is a bug or corner case. + .filter(id -> id != null && id.get() != null) + .collect(toSet()); } @Override