ExternalIdCache: Add method to get external IDs by account ID + scheme

Change-Id: I800c41923facbfe9194ce47716ed2d23d0ffd70a
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
index b1d1324..442f4e7 100644
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
+++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
@@ -210,8 +210,8 @@
   @VisibleForTesting
   public static FluentIterable<AccountExternalId> getGpgExtIds(
       ExternalIdCache externalIdCache, Account.Id accountId) {
-    return FluentIterable.from(externalIdCache.byAccount(accountId))
-        .filter(in -> in.isScheme(SCHEME_GPGKEY));
+    return FluentIterable.from(
+        externalIdCache.byAccount(accountId, SCHEME_GPGKEY));
   }
 
   private Iterable<AccountExternalId> getGpgExtIds(AccountResource rsrc) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
index bbe7ba6..e600e9c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
@@ -30,7 +30,6 @@
 import com.google.inject.assistedinject.Assisted;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.concurrent.Callable;
@@ -76,7 +75,8 @@
   @Override
   public VoidResult call() throws OrmException, NameAlreadyUsedException,
       InvalidUserNameException, IOException {
-    final Collection<AccountExternalId> old = old();
+    Collection<AccountExternalId> old =
+        externalIdCache.byAccount(user.getAccountId(), SCHEME_USERNAME);
     if (!old.isEmpty()) {
       throw new IllegalStateException(USERNAME_CANNOT_BE_CHANGED);
     }
@@ -128,15 +128,4 @@
     sshKeyCache.evict(newUsername);
     return VoidResult.INSTANCE;
   }
-
-  private Collection<AccountExternalId> old() {
-    final Collection<AccountExternalId> r = new ArrayList<>(1);
-    for (AccountExternalId i : externalIdCache.byAccount(
-        user.getAccountId())) {
-      if (i.isScheme(SCHEME_USERNAME)) {
-        r.add(i);
-      }
-    }
-    return r;
-  }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ExternalIdCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/ExternalIdCache.java
index 8852e81e..001febd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/ExternalIdCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/ExternalIdCache.java
@@ -14,11 +14,14 @@
 
 package com.google.gerrit.server.account;
 
+import static java.util.stream.Collectors.toSet;
+
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.AccountExternalId;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Set;
 
 /** Caches external ids of all accounts */
 public interface ExternalIdCache {
@@ -40,4 +43,10 @@
   default void onRemove(Account.Id accountId, AccountExternalId.Key extIdKey) {
     onRemove(accountId, Collections.singleton(extIdKey));
   }
+
+  default Set<AccountExternalId> byAccount(Account.Id accountId,
+      String scheme) {
+    return byAccount(accountId).stream().filter(e -> e.isScheme(scheme))
+        .collect(toSet());
+  }
 }