Merge branch 'stable-2.15'

* stable-2.15:
  Add test for NPE in account index query

Change-Id: I9180a1c70417466bb7b2f1900baa99f36860482e
diff --git a/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java b/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java
index 6138171..33b649a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java
@@ -34,6 +34,7 @@
 import com.google.gerrit.server.account.GroupBackend;
 import com.google.gerrit.server.account.GroupMembership;
 import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.account.externalids.ExternalId;
 import com.google.gerrit.server.project.ProjectState;
 import com.google.gerrit.server.query.account.AccountPredicates;
 import com.google.gerrit.server.query.account.AccountQueryBuilder;
@@ -45,6 +46,7 @@
 import com.google.inject.Singleton;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Optional;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -94,8 +96,8 @@
   public GroupMembership membershipsOf(IdentifiedUser user) {
     ImmutableList.Builder<AccountGroup.UUID> groups = ImmutableList.builder();
     groups.add(uuid(user.getAccountId()));
-    if (user.getUserName() != null) {
-      groups.add(uuid(user.getUserName()));
+    if (user.getUserName().isPresent()) {
+      groups.add(uuid(user.getUserName().get()));
     }
     return new ListGroupMembership(groups.build());
   }
@@ -103,17 +105,17 @@
   @Override
   public GroupDescription.Basic get(AccountGroup.UUID uuid) {
     String ident = username(uuid);
-    AccountState state;
+    Optional<AccountState> state;
     if (ident.matches(ACCOUNT_ID_PATTERN)) {
       state = accountCache.get(new Account.Id(Integer.parseInt(ident)));
-    } else if (ident.matches(Account.USER_NAME_PATTERN)) {
+    } else if (ExternalId.isValidUsername(ident)) {
       state = accountCache.getByUsername(ident);
     } else {
       return null;
     }
-    if (state != null) {
-      final String name = nameOf(uuid, state);
-      final String email = Strings.emptyToNull(state.getAccount().getPreferredEmail());
+    if (state.isPresent()) {
+      String name = nameOf(uuid, state.get());
+      String email = Strings.emptyToNull(state.get().getAccount().getPreferredEmail());
       return new GroupDescription.Basic() {
         @Override
         public AccountGroup.UUID getGroupUUID() {
@@ -154,8 +156,8 @@
             @Override
             public GroupReference apply(AccountState state) {
               AccountGroup.UUID uuid;
-              if (state.getUserName() != null) {
-                uuid = uuid(state.getUserName());
+              if (state.getUserName().isPresent()) {
+                uuid = uuid(state.getUserName().get());
               } else {
                 uuid = uuid(state.getAccount().getId());
               }
@@ -186,21 +188,21 @@
         uuid.get().startsWith(UUID_PREFIX), "SingleUserGroup does not handle %s", uuid.get());
   }
 
-  private static String nameOf(AccountGroup.UUID uuid, AccountState account) {
+  private static String nameOf(AccountGroup.UUID uuid, AccountState accountState) {
     StringBuilder buf = new StringBuilder();
-    if (account.getAccount().getFullName() != null) {
-      buf.append(account.getAccount().getFullName());
+    if (accountState.getAccount().getFullName() != null) {
+      buf.append(accountState.getAccount().getFullName());
     }
-    if (account.getUserName() != null) {
+    if (accountState.getUserName().isPresent()) {
       if (buf.length() > 0) {
-        buf.append(" (").append(account.getUserName()).append(")");
+        buf.append(" (").append(accountState.getUserName().get()).append(")");
       } else {
-        buf.append(account.getUserName());
+        buf.append(accountState.getUserName().get());
       }
     } else if (buf.length() > 0) {
-      buf.append(" (").append(account.getAccount().getId().get()).append(")");
+      buf.append(" (").append(accountState.getAccount().getId().get()).append(")");
     } else {
-      buf.append(account.getAccount().getId().get());
+      buf.append(accountState.getAccount().getId().get());
     }
 
     String ident = username(uuid);