Filter out partial name matches in OWNERS file

Make sure that the result of the account ids resolved from
the OWNERS file lookup does not include any partial matches.

Change-Id: Ic0dfe6f269ea4a60bb82efb3145495b730bfc327
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
index 67e7888..c5a5989 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
@@ -14,28 +14,34 @@
 
 package com.vmware.gerrit.owners.common;
 
-import java.util.Collections;
-import java.util.Set;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Account.Id;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 public class AccountsImpl implements Accounts {
   private static final Logger log = LoggerFactory.getLogger(AccountsImpl.class);
 
   private ReviewDb db;
   private AccountResolver resolver;
+  private final AccountCache byId;
 
   @Inject
-  public AccountsImpl(AccountResolver resolver, ReviewDb db) {
+  public AccountsImpl(AccountResolver resolver, AccountCache byId,
+      ReviewDb db) {
     this.resolver = resolver;
+    this.byId = byId;
     this.db = db;
   }
 
@@ -43,7 +49,9 @@
   public Set<Account.Id> find(String nameOrEmail) {
     Set<Id> accountIds = Collections.emptySet();
     try {
-      accountIds = resolver.findAll(db, nameOrEmail);
+      accountIds = resolver.findAll(db, nameOrEmail).stream()
+          .filter(id -> isFullMatch(id, nameOrEmail))
+          .collect(Collectors.toSet());
     } catch (OrmException e) {
       log.error("Error trying to resolve user " + nameOrEmail, e);
     }
@@ -52,4 +60,12 @@
     }
     return accountIds;
   }
+
+  private boolean isFullMatch(Account.Id id, String nameOrEmail) {
+    AccountState account = byId.get(id);
+    return account.getAccount().getFullName().trim()
+        .equalsIgnoreCase(nameOrEmail)
+        || account.getExternalIds().stream().anyMatch(extId -> extId
+            .getSchemeRest().trim().equalsIgnoreCase(nameOrEmail));
+  }
 }