ScopedProvider is now more similar to standard Guice's Provider

By hiding the HttpServletRequest inside the HttpSessionProvider,
the ScopedProvider<T> can be now 100% compatible with the standard
Guice's Provider<T> interface.

Moving as well from constructor injection to field injection so
that the concrete implementation do not have to replicate the
constructor injection definition. Code is more compact and extensible.

The ability to get an instance by passing an actual HttpServletRequest
is kept in order to allow the standard servlet filter (outside the Guice
domain) to retrieve the object in the current session, without
having to request a Provider<HttpServletRequest> which would fail.

Change-Id: I20f32fc42ca05e9a4a140b64a1d5693d83ecf125
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java
index da86a02..ccb04b3 100644
--- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java
+++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/GitHubLogin.java
@@ -17,8 +17,6 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -46,15 +44,10 @@
 
   @Singleton
   public static class Provider extends HttpSessionProvider<GitHubLogin> {
-    @Inject
-    public Provider(com.google.inject.Provider<GitHubLogin> provider) {
-      super(provider);
-    }
-
     @Override
-    public GitHubLogin get(HttpServletRequest req) {
-      GitHubLogin login = super.get(req);
-      login.initOAuthCookie(req);
+    public GitHubLogin get(HttpServletRequest request) {
+      GitHubLogin login = super.get(request);
+      login.initOAuthCookie(request);
       return login;
     }
   }
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/HttpSessionProvider.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/HttpSessionProvider.java
index 13cc038..649bd6d 100644
--- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/HttpSessionProvider.java
+++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/HttpSessionProvider.java
@@ -18,14 +18,18 @@
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
-import com.google.inject.Singleton;
 
 public abstract class HttpSessionProvider<T> implements ScopedProvider<T> {
 
-  private final Provider<T> provider;
+  @Inject
+  private Provider<T> provider;
 
-  public HttpSessionProvider(Provider<T> provider) {
-    this.provider = provider;
+  @Inject
+  private Provider<HttpServletRequest> httpRequestProvider;
+
+  @Override
+  public T get() {
+    return get(httpRequestProvider.get());
   }
 
   @Override
@@ -43,4 +47,9 @@
       return instance;
     }
   }
+
+  @Override
+  public HttpServletRequest getScopedRequest() {
+    return httpRequestProvider.get();
+  }
 }
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthFilter.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthFilter.java
index fa604db..7f6e3e6 100644
--- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthFilter.java
+++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/OAuthFilter.java
@@ -84,7 +84,7 @@
 
     Cookie gerritCookie = getGerritCookie(httpRequest);
     try {
-      GitHubLogin ghLogin = loginProvider.get((HttpServletRequest) request);
+      GitHubLogin ghLogin = loginProvider.get(httpRequest);
 
       OAuthCookie authCookie =
           getOAuthCookie(httpRequest, (HttpServletResponse) response);
diff --git a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/ScopedProvider.java b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/ScopedProvider.java
index b1f408c..8ebde44 100644
--- a/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/ScopedProvider.java
+++ b/github-oauth/src/main/java/com/googlesource/gerrit/plugins/github/oauth/ScopedProvider.java
@@ -15,6 +15,11 @@
 
 import javax.servlet.http.HttpServletRequest;
 
-public interface ScopedProvider<T> {
-  T get(HttpServletRequest req);
+import com.google.inject.Provider;
+
+
+public interface ScopedProvider<T> extends Provider<T>{
+  T get(HttpServletRequest request);
+
+  HttpServletRequest getScopedRequest();
 }
diff --git a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitHubRepository.java b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitHubRepository.java
index 8fcb821..f272630 100644
--- a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitHubRepository.java
+++ b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitHubRepository.java
@@ -13,8 +13,6 @@
 // limitations under the License.
 package com.googlesrouce.gerrit.plugins.github.git;
 
-import javax.servlet.http.HttpServletRequest;
-
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import com.googlesource.gerrit.plugins.github.GitHubURL;
@@ -48,13 +46,13 @@
 
 
   @Inject
-  public GitHubRepository(ScopedProvider<GitHubLogin> ghLoginProvider, HttpServletRequest httpRequest,
+  public GitHubRepository(ScopedProvider<GitHubLogin> ghLoginProvider,
       @GitHubURL String gitHubUrl,
       @Assisted("organisation") String organisation,
       @Assisted("repository") String repository) {
     this.cloneUrl = gitHubUrl + "/" + organisation + "/" + repository + ".git";
     this.organisation = organisation;
     this.repository = repository;
-    this.ghLogin = ghLoginProvider.get(httpRequest);
+    this.ghLogin = ghLoginProvider.get();
   }
 }
diff --git a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImporter.java b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImporter.java
index c06bb96..d0671fb 100644
--- a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImporter.java
+++ b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/GitImporter.java
@@ -24,12 +24,7 @@
 public class GitImporter extends BatchImporter {
 
   @Singleton
-  public static class Provider extends HttpSessionProvider<GitImporter> {
-    @Inject
-    public Provider(com.google.inject.Provider<GitImporter> provider) {
-      super(provider);
-    }
-  }
+  public static class Provider extends HttpSessionProvider<GitImporter> {}
 
   private static final Logger log = LoggerFactory.getLogger(GitImporter.class);
   private final GitCloneStep.Factory cloneFactory;
diff --git a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/PullRequestImportJob.java b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/PullRequestImportJob.java
index 494a80b..a3de221 100644
--- a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/PullRequestImportJob.java
+++ b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/PullRequestImportJob.java
@@ -14,19 +14,13 @@
 package com.googlesrouce.gerrit.plugins.github.git;
 
 import java.io.IOException;
-import java.net.URL;
 import java.util.List;
 
-import javax.servlet.http.HttpServletRequest;
-
 import org.eclipse.jgit.api.FetchCommand;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.InvalidRemoteException;
-import org.eclipse.jgit.api.errors.NoHeadException;
 import org.eclipse.jgit.api.errors.TransportException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Repository;
@@ -36,7 +30,6 @@
 import org.eclipse.jgit.transport.RefSpec;
 import org.kohsuke.github.GHPullRequest;
 import org.kohsuke.github.GHPullRequestCommitDetail;
-import org.kohsuke.github.GHPullRequestCommitDetail.Authorship;
 import org.kohsuke.github.GHRepository;
 import org.kohsuke.github.GHUser;
 import org.kohsuke.github.GitUser;
@@ -44,7 +37,6 @@
 import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Lists;
-import com.google.gerrit.common.errors.EmailException;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
@@ -53,16 +45,10 @@
 import com.google.gerrit.reviewdb.client.AccountExternalId;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.Project.NameKey;
-import com.google.gerrit.reviewdb.server.AccountAccess;
 import com.google.gerrit.reviewdb.server.AccountExternalIdAccess;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.account.AccountImpoter;
-import com.google.gerrit.server.account.CreateAccount;
 import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectState;
@@ -115,13 +101,13 @@
       Provider<ReviewDb> schema, AccountImpoter accountImporter,
       GitHubRepository.Factory gitHubRepoFactory,
       ScopedProvider<GitHubLogin> ghLoginProvider,
-      HttpServletRequest httpRequest, @Assisted("index") int jobIndex,
+      @Assisted("index") int jobIndex,
       @Assisted("organisation") String organisation,
       @Assisted("name") String repoName, @Assisted int pullRequestId,
       @Assisted PullRequestImportType importType) {
     this.jobIndex = jobIndex;
     this.repoMgr = repoMgr;
-    this.ghLogin = ghLoginProvider.get(httpRequest);
+    this.ghLogin = ghLoginProvider.get();
     this.organisation = organisation;
     this.repoName = repoName;
     this.importType = importType;
diff --git a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/ReplicateProjectStep.java b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/ReplicateProjectStep.java
index ce74c03..83fbb51 100644
--- a/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/ReplicateProjectStep.java
+++ b/github-plugin/src/main/java/com/googlesrouce/gerrit/plugins/github/git/ReplicateProjectStep.java
@@ -13,8 +13,6 @@
 // limitations under the License.
 package com.googlesrouce.gerrit.plugins.github.git;
 
-import javax.servlet.http.HttpServletRequest;
-
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,14 +40,13 @@
   public ReplicateProjectStep(final ReplicationConfig replicationConfig,
       final GitHubRepository.Factory gitHubRepoFactory,
       final ScopedProvider<GitHubLogin> ghLoginProvider,
-      final HttpServletRequest httpRequest,
       @GitHubURL String gitHubUrl,
       @Assisted("organisation") String organisation,
       @Assisted("name") String repository) {
     super(gitHubUrl, organisation, repository, gitHubRepoFactory);
     LOG.debug("Gerrit ReplicateProject " + organisation + "/" + repository);
     this.replicationConfig = replicationConfig;
-    GitHubLogin ghLogin = ghLoginProvider.get(httpRequest);
+    GitHubLogin ghLogin = ghLoginProvider.get();
     this.authUsername = ghLogin.getMyself().getLogin();
     this.authToken = ghLogin.token.access_token;
     this.gitHubUrl = gitHubUrl;