Adapt to the Gerrit master ExternalId refactoring

Gerrit master does not have anymore AccountExternalId and needs a
different way to look for account ids from the username.

Change-Id: I408ee04f6c36ea306272e22b8ca47fd2a9065438
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/IdentifiedUserGitHubLoginProvider.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/IdentifiedUserGitHubLoginProvider.java
index 4ea4494..c5c7161 100644
--- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/IdentifiedUserGitHubLoginProvider.java
+++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/IdentifiedUserGitHubLoginProvider.java
@@ -15,7 +15,6 @@
 package com.googlesource.gerrit.plugins.github.oauth;
 
 import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.AccountExternalId;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.AccountState;
@@ -34,7 +33,7 @@
   private static final Logger log =
       LoggerFactory.getLogger(IdentifiedUserGitHubLoginProvider.class);
   public static final String EXTERNAL_ID_PREFIX =
-      AccountExternalId.SCHEME_EXTERNAL + OAuthWebFilter.GITHUB_EXT_ID;
+      ExternalId.SCHEME_EXTERNAL + ":" + OAuthWebFilter.GITHUB_EXT_ID;
 
   private final Provider<IdentifiedUser> userProvider;
   private final GitHubOAuthConfig config;
@@ -80,7 +79,7 @@
     AccountState account = accountCache.getByUsername(username);
     Collection<ExternalId> externalIds = account.getExternalIds();
     for (ExternalId accountExternalId : externalIds) {
-      String key = accountExternalId.asAccountExternalId().getKey().get();
+      String key = accountExternalId.key().get();
       if (key.startsWith(EXTERNAL_ID_PREFIX)) {
         return new AccessToken(key.substring(EXTERNAL_ID_PREFIX.length()));
       }
diff --git a/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImporter.java b/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImporter.java
index ef9ba3c..dd8f712 100644
--- a/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImporter.java
+++ b/github-plugin/src/main/java/com/google/gerrit/server/account/AccountImporter.java
@@ -23,54 +23,48 @@
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Account.Id;
-import com.google.gerrit.reviewdb.client.AccountExternalId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.account.CreateAccount.Factory;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import java.io.IOException;
-import java.util.Arrays;
 import org.apache.http.HttpStatus;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 
 public class AccountImporter {
   private final Factory createAccountFactory;
-  private final Provider<ReviewDb> schema;
+  private final ExternalIdsUpdate.Server externalIdsUpdateServer;
 
   @Inject
   public AccountImporter(
-      final CreateAccount.Factory createAccountFactory, final Provider<ReviewDb> schema) {
+      final CreateAccount.Factory createAccountFactory,
+      ExternalIdsUpdate.Server externalIdsUpdateServer) {
     this.createAccountFactory = createAccountFactory;
-    this.schema = schema;
+    this.externalIdsUpdateServer = externalIdsUpdateServer;
   }
 
   public Account.Id importAccount(String login, String name, String email)
       throws IOException, BadRequestException, ResourceConflictException,
           UnprocessableEntityException, OrmException, ConfigInvalidException {
-    try (ReviewDb db = schema.get()) {
-      CreateAccount createAccount = createAccountFactory.create(login);
-      AccountInput accountInput = new AccountInput();
-      accountInput.email = email;
-      accountInput.username = login;
-      accountInput.name = MoreObjects.firstNonNull(name, login);
-      Response<AccountInfo> accountResponse =
-          createAccount.apply(TopLevelResource.INSTANCE, accountInput);
-      if (accountResponse.statusCode() != HttpStatus.SC_CREATED) {
-        throw new IOException(
-            "Cannot import GitHub account "
-                + login
-                + ": HTTP Status "
-                + accountResponse.statusCode());
-      }
-      Id accountId = new Account.Id(accountResponse.value()._accountId.intValue());
-      db.accountExternalIds()
-          .insert(
-              Arrays.asList(
-                  new AccountExternalId(
-                      accountId,
-                      new AccountExternalId.Key(AccountExternalId.SCHEME_GERRIT, login))));
-      return accountId;
+    CreateAccount createAccount = createAccountFactory.create(login);
+    AccountInput accountInput = new AccountInput();
+    accountInput.email = email;
+    accountInput.username = login;
+    accountInput.name = MoreObjects.firstNonNull(name, login);
+    Response<AccountInfo> accountResponse =
+        createAccount.apply(TopLevelResource.INSTANCE, accountInput);
+    if (accountResponse.statusCode() != HttpStatus.SC_CREATED) {
+      throw new IOException(
+          "Cannot import GitHub account "
+              + login
+              + ": HTTP Status "
+              + accountResponse.statusCode());
     }
+    Id accountId = new Account.Id(accountResponse.value()._accountId.intValue());
+    externalIdsUpdateServer
+        .create()
+        .insert(ExternalId.create(ExternalId.SCHEME_GERRIT, login, accountId));
+    return accountId;
   }
 }
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubOAuthServiceProvider.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubOAuthServiceProvider.java
index 7a52be1..7ee4dbf 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubOAuthServiceProvider.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubOAuthServiceProvider.java
@@ -19,7 +19,7 @@
 import com.google.gerrit.extensions.auth.oauth.OAuthToken;
 import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
 import com.google.gerrit.extensions.auth.oauth.OAuthVerifier;
-import com.google.gerrit.reviewdb.client.AccountExternalId;
+import com.google.gerrit.server.account.externalids.ExternalId;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.github.oauth.GitHubOAuthConfig;
 import com.googlesource.gerrit.plugins.github.oauth.OAuthProtocol;
@@ -65,7 +65,7 @@
     GHMyself myself = hub.getMyself();
     String login = myself.getLogin();
     return new OAuthUserInfo(
-        AccountExternalId.SCHEME_GERRIT + login, login, myself.getEmail(), myself.getName(), null);
+        ExternalId.SCHEME_GERRIT + login, login, myself.getEmail(), myself.getName(), null);
   }
 
   @Override
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/filters/GitHubOAuthFilter.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/filters/GitHubOAuthFilter.java
index 5316d13..60f3132 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/filters/GitHubOAuthFilter.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/filters/GitHubOAuthFilter.java
@@ -15,7 +15,6 @@
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
-import com.google.gerrit.reviewdb.client.AccountExternalId;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountCache;
@@ -71,17 +70,21 @@
     if (!hubLogin.isLoggedIn()
         && !OAuthFilter.skipOAuth((HttpServletRequest) request)
         && user.isIdentifiedUser()) {
-      AccountExternalId gitHubExtId = getGitHubExternalId(user);
+      ExternalId gitHubExtId = getGitHubExternalId(user);
 
       String oauthToken =
-          gitHubExtId.getSchemeRest().substring(OAuthWebFilter.GITHUB_EXT_ID.length());
+          gitHubExtId
+              .key()
+              .get()
+              .substring(
+                  ExternalId.SCHEME_EXTERNAL.length() + OAuthWebFilter.GITHUB_EXT_ID.length() + 1);
       hubLogin.login(new AccessToken(oauthToken));
     }
 
     chain.doFilter(request, response);
   }
 
-  private AccountExternalId getGitHubExternalId(CurrentUser user) {
+  private ExternalId getGitHubExternalId(CurrentUser user) {
     Collection<ExternalId> accountExtIds =
         accountCache.get(((IdentifiedUser) user).getAccountId()).getExternalIds();
     Collection<ExternalId> gitHubExtId =
@@ -101,7 +104,7 @@
       throw new IllegalStateException(
           "Current Gerrit user " + user.getUserName() + " has no GitHub OAuth external ID");
     }
-    return gitHubExtId.iterator().next().asAccountExternalId();
+    return gitHubExtId.iterator().next();
   }
 
   @Override
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
index f0bf9df..646737e 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestImportJob.java
@@ -20,13 +20,13 @@
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountExternalId;
 import com.google.gerrit.reviewdb.client.Change.Id;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.Project.NameKey;
-import com.google.gerrit.reviewdb.server.AccountExternalIdAccess;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.account.AccountImporter;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectState;
@@ -39,6 +39,7 @@
 import com.googlesource.gerrit.plugins.github.oauth.ScopedProvider;
 import java.io.IOException;
 import java.util.List;
+import java.util.Optional;
 import org.eclipse.jgit.api.FetchCommand;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
@@ -82,6 +83,7 @@
   private final int prId;
   private final GitRepositoryManager repoMgr;
   private final int jobIndex;
+  private final ExternalIds externalIds;
   private PullRequestCreateChange createChange;
   private Project project;
   private GitJobStatus status;
@@ -98,6 +100,7 @@
       AccountImporter accountImporter,
       GitHubRepository.Factory gitHubRepoFactory,
       ScopedProvider<GitHubLogin> ghLoginProvider,
+      ExternalIds externalIds,
       @Assisted("index") int jobIndex,
       @Assisted("organisation") String organisation,
       @Assisted("name") String repoName,
@@ -114,6 +117,7 @@
     this.status = new GitJobStatus(jobIndex);
     this.schema = schema;
     this.accountImporter = accountImporter;
+    this.externalIds = externalIds;
   }
 
   private Project fetchGerritProject(
@@ -212,14 +216,20 @@
       ReviewDb db, String login, String name, String email)
       throws OrmException, BadRequestException, ResourceConflictException,
           UnprocessableEntityException, IOException, ConfigInvalidException {
-    AccountExternalId.Key userExtKey =
-        new AccountExternalId.Key(AccountExternalId.SCHEME_USERNAME, login);
-    AccountExternalIdAccess gerritExtIds = db.accountExternalIds();
-    AccountExternalId userExtId = gerritExtIds.get(userExtKey);
-    if (userExtId == null) {
-      return accountImporter.importAccount(login, name, email);
+    Optional<ExternalId> gerritId = externalIdByScheme(ExternalId.SCHEME_GERRIT, login);
+    if (gerritId.isPresent()) {
+      return gerritId.get().accountId();
     }
-    return userExtId.getAccountId();
+    return accountImporter.importAccount(login, name, email);
+  }
+
+  private Optional<ExternalId> externalIdByScheme(String scheme, String id) {
+    try {
+      return Optional.ofNullable(externalIds.get(ExternalId.Key.create(scheme, id)));
+    } catch (IOException | ConfigInvalidException e) {
+      LOG.error("Unable to get external id for " + scheme + ":" + id, e);
+      return Optional.empty();
+    }
   }
 
   private String getChangeMessage(GHPullRequest pr) {