diff options
author | Shawn O. Pearce <sop@google.com> | 2009-06-08 18:18:31 -0700 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-06-08 18:18:31 -0700 |
commit | 8e9387a1f109303e85fed93f192ab26917cef36e (patch) | |
tree | e97a04141989ea4268be1120497b545a8c4c2acc | |
parent | 56e2fc7e95b504011f382c26635e7bdd10a0be0c (diff) |
Show email address matched by completion rather than preferred
By showing the address entered by the user in the list of possible
completions it is less likely the user will be fooled into taking
the wrong account, especially if there are multiple users created
with a common name (like John Smith).
Bug: GERRIT-191
Signed-off-by: Shawn O. Pearce <sop@google.com>
4 files changed, 39 insertions, 9 deletions
diff --git a/src/main/java/com/google/gerrit/client/data/AccountInfo.java b/src/main/java/com/google/gerrit/client/data/AccountInfo.java index aa3c893985..90dde97c58 100644 --- a/src/main/java/com/google/gerrit/client/data/AccountInfo.java +++ b/src/main/java/com/google/gerrit/client/data/AccountInfo.java @@ -61,4 +61,8 @@ public class AccountInfo { public String getPreferredEmail() { return preferredEmail; } + + public void setPreferredEmail(final String email) { + preferredEmail = email; + } } diff --git a/src/main/java/com/google/gerrit/client/reviewdb/Account.java b/src/main/java/com/google/gerrit/client/reviewdb/Account.java index 992311ae37..594664eb20 100644 --- a/src/main/java/com/google/gerrit/client/reviewdb/Account.java +++ b/src/main/java/com/google/gerrit/client/reviewdb/Account.java @@ -14,6 +14,7 @@ package com.google.gerrit.client.reviewdb; +import com.google.gerrit.client.rpc.Common; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.IntKey; import com.google.gwtorm.client.OrmException; @@ -63,32 +64,52 @@ public final class Account { * * @param db open database handle to use for the query. * @param nameOrEmail a string of the format - * "Full Name <email@example>", or just the preferred email - * address ("email@example"), or a full name. + * "Full Name <email@example>", or just the email address + * ("email@example"), or a full name, or an account id. * @return the single account that matches; null if no account matches or * there are multiple candidates. */ public static Account find(final ReviewDb db, final String nameOrEmail) throws OrmException { + if (nameOrEmail.matches("^[1-9][0-9]*$")) { + return Common.getAccountCache().get(Account.Id.parse(nameOrEmail)); + } + final int lt = nameOrEmail.indexOf('<'); final int gt = nameOrEmail.indexOf('>'); - if (lt >= 0 && gt > lt) { - final String email = nameOrEmail.substring(lt + 1, gt); - return one(db.accounts().byPreferredEmail(email)); + if (lt >= 0 && gt > lt && nameOrEmail.contains("@")) { + return findByEmail(db, nameOrEmail.substring(lt + 1, gt)); } if (nameOrEmail.contains("@")) { - return one(db.accounts().byPreferredEmail(nameOrEmail)); + return findByEmail(db, nameOrEmail); } - return one(db.accounts().suggestByFullName(nameOrEmail, nameOrEmail, 2)); + return oneAccount(db.accounts().byFullName(nameOrEmail)); } - private static Account one(final ResultSet<Account> rs) { + private static Account findByEmail(final ReviewDb db, final String email) + throws OrmException { + Account a = oneAccount(db.accounts().byPreferredEmail(email)); + if (a == null) { + a = oneAccountExternalId(db.accountExternalIds().byEmailAddress(email)); + } + return a; + } + + private static Account oneAccount(ResultSet<Account> rs) { final List<Account> r = rs.toList(); return r.size() == 1 ? r.get(0) : null; } + private static Account oneAccountExternalId(ResultSet<AccountExternalId> rs) { + final List<AccountExternalId> r = rs.toList(); + if (r.size() == 1) { + return Common.getAccountCache().get(r.get(0).getAccountId()); + } + return null; + } + /** Key local to Gerrit to identify a user. */ public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/google/gerrit/client/reviewdb/AccountAccess.java b/src/main/java/com/google/gerrit/client/reviewdb/AccountAccess.java index f6e3707908..ecd261c256 100644 --- a/src/main/java/com/google/gerrit/client/reviewdb/AccountAccess.java +++ b/src/main/java/com/google/gerrit/client/reviewdb/AccountAccess.java @@ -32,6 +32,9 @@ public interface AccountAccess extends Access<Account, Account.Id> { @Query("WHERE sshUserName = ?") ResultSet<Account> bySshUserName(String userName) throws OrmException; + @Query("WHERE fullName = ? LIMIT 2") + ResultSet<Account> byFullName(String name) throws OrmException; + @Query("WHERE fullName >= ? AND fullName <= ? ORDER BY fullName LIMIT ?") ResultSet<Account> suggestByFullName(String nameA, String nameB, int limit) throws OrmException; diff --git a/src/main/java/com/google/gerrit/client/ui/SuggestServiceImpl.java b/src/main/java/com/google/gerrit/client/ui/SuggestServiceImpl.java index ad75ed1aed..c3cde37626 100644 --- a/src/main/java/com/google/gerrit/client/ui/SuggestServiceImpl.java +++ b/src/main/java/com/google/gerrit/client/ui/SuggestServiceImpl.java @@ -81,7 +81,9 @@ public class SuggestServiceImpl extends BaseServiceImplementation implements if (!r.containsKey(e.getAccountId())) { final Account p = ac.get(e.getAccountId(), db); if (p != null) { - r.put(e.getAccountId(), new AccountInfo(p)); + final AccountInfo info = new AccountInfo(p); + info.setPreferredEmail(e.getEmailAddress()); + r.put(e.getAccountId(), info); } } } |