summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-06-08 18:18:31 -0700
committerShawn O. Pearce <sop@google.com>2009-06-08 18:18:31 -0700
commit8e9387a1f109303e85fed93f192ab26917cef36e (patch)
treee97a04141989ea4268be1120497b545a8c4c2acc
parent56e2fc7e95b504011f382c26635e7bdd10a0be0c (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>
-rw-r--r--src/main/java/com/google/gerrit/client/data/AccountInfo.java4
-rw-r--r--src/main/java/com/google/gerrit/client/reviewdb/Account.java37
-rw-r--r--src/main/java/com/google/gerrit/client/reviewdb/AccountAccess.java3
-rw-r--r--src/main/java/com/google/gerrit/client/ui/SuggestServiceImpl.java4
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 &lt;email@example&gt;", or just the preferred email
- * address ("email@example"), or a full name.
+ * "Full Name &lt;email@example&gt;", 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);
}
}
}