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) {