Adjust to core Gerrit API changes

Change-Id: I091047c76cdd7c636e67eaad210e28d12bbc3d24
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
index 185ae63..2d5ecc8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
@@ -25,9 +25,13 @@
 import com.google.gerrit.extensions.restapi.IdString;
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.mime.FileTypeRegistry;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.CommitsCollection;
 import com.google.gerrit.server.project.GetHead;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectCache;
@@ -63,29 +67,35 @@
   public static final String PATH_PREFIX = "/project/";
 
   private final String pluginName;
-  private final Provider<ReviewDb> db;
   private final ProjectControl.Factory projectControlFactory;
   private final ProjectCache projectCache;
   private final Provider<GetHead> getHead;
   private final GitRepositoryManager repoManager;
   private final FileTypeRegistry fileTypeRegistry;
+  private final CommitsCollection commits;
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
 
   @Inject
   ImageServlet(
       @PluginName String pluginName,
-      Provider<ReviewDb> db,
       ProjectControl.Factory projectControlFactory,
       ProjectCache projectCache,
       Provider<GetHead> getHead,
       GitRepositoryManager repoManager,
-      FileTypeRegistry fileTypeRegistry) {
+      FileTypeRegistry fileTypeRegistry,
+      CommitsCollection commits,
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend) {
     this.pluginName = pluginName;
-    this.db = db;
     this.projectControlFactory = projectControlFactory;
     this.projectCache = projectCache;
     this.getHead = getHead;
     this.repoManager = repoManager;
     this.fileTypeRegistry = fileTypeRegistry;
+    this.commits = commits;
+    this.self = self;
+    this.permissionBackend = permissionBackend;
   }
 
   @Override
@@ -119,7 +129,10 @@
           if (!rev.startsWith(Constants.R_REFS)) {
             rev = Constants.R_HEADS + rev;
           }
-          if (!projectControl.controlForRef(rev).isVisible()) {
+          PermissionBackend.ForProject perm = permissionBackend.user(self).project(key.project);
+          try {
+            perm.ref(rev).check(RefPermission.READ);
+          } catch (AuthException e) {
             notFound(res);
             return;
           }
@@ -135,7 +148,7 @@
         if (ObjectId.isId(rev)) {
           try (RevWalk rw = new RevWalk(repo)) {
             RevCommit commit = rw.parseCommit(repo.resolve(rev));
-            if (!projectControl.canReadCommit(db.get(), repo, commit)) {
+            if (!commits.canRead(state, repo, commit)) {
               notFound(res);
               return;
             }
@@ -193,7 +206,8 @@
         | NoSuchProjectException
         | ResourceNotFoundException
         | AuthException
-        | RevisionSyntaxException e) {
+        | RevisionSyntaxException
+        | PermissionBackendException e) {
       notFound(res);
       return;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
index f94f3ac..27ac2ae 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
@@ -21,7 +21,9 @@
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.IdentifiedUser;
@@ -30,10 +32,12 @@
 import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.mime.FileTypeRegistry;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.CreateRefControl;
+import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.RefControl;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.imagare.PostImage.Input;
@@ -71,6 +75,7 @@
   private final String canonicalWebUrl;
   private final Config cfg;
   private final String pluginName;
+  private final CreateRefControl createRefControl;
 
   @Inject
   public PostImage(
@@ -81,7 +86,8 @@
       @GerritPersonIdent PersonIdent myIdent,
       @CanonicalWebUrl String canonicalWebUrl,
       @GerritServerConfig Config cfg,
-      @PluginName String pluginName) {
+      @PluginName String pluginName,
+      CreateRefControl createRefControl) {
     this.registry = registry;
     this.imageDataPattern = Pattern.compile("data:([\\w/.-]+);([\\w]+),(.*)");
     this.self = self;
@@ -91,12 +97,12 @@
     this.canonicalWebUrl = canonicalWebUrl;
     this.cfg = cfg;
     this.pluginName = pluginName;
+    this.createRefControl = createRefControl;
   }
 
   @Override
   public Response<ImageInfo> apply(ProjectResource rsrc, Input input)
-      throws MethodNotAllowedException, BadRequestException, AuthException, IOException,
-          ResourceConflictException {
+      throws RestApiException, IOException, PermissionBackendException, NoSuchProjectException {
     if (input == null) {
       input = new Input();
     }
@@ -110,8 +116,7 @@
   }
 
   private ImageInfo storeImage(ProjectControl pc, String imageData, String fileName)
-      throws MethodNotAllowedException, BadRequestException, AuthException, IOException,
-          ResourceConflictException {
+      throws RestApiException, IOException, PermissionBackendException, NoSuchProjectException {
     Matcher m = imageDataPattern.matcher(imageData);
     if (m.matches()) {
       String receivedMimeType = m.group(1);
@@ -144,7 +149,8 @@
   }
 
   private String storeImage(ProjectControl pc, byte[] content, String fileName)
-      throws AuthException, IOException, ResourceConflictException {
+      throws AuthException, IOException, ResourceConflictException, PermissionBackendException,
+          NoSuchProjectException {
     long maxSize = getEffectiveMaxObjectSizeLimit(pc.getProjectState());
     // maxSize == 0 means that there is no limit
     if (maxSize > 0 && content.length > maxSize) {
@@ -152,7 +158,6 @@
     }
 
     String ref = getRef(content, fileName);
-    RefControl rc = pc.controlForRef(ref);
 
     try (Repository repo = repoManager.openRepository(pc.getProject().getNameKey())) {
       ObjectId commitId = repo.resolve(ref);
@@ -182,7 +187,13 @@
         commitId = oi.insert(cb);
         oi.flush();
 
-        if (!rc.canCreate(repo, rw.parseCommit(commitId))) {
+        try {
+          createRefControl.checkCreateRef(
+              self,
+              repo,
+              new Branch.NameKey(pc.getProject().getNameKey(), ref),
+              rw.parseCommit(commitId));
+        } catch (AuthException e) {
           throw new AuthException(
               String.format("Project %s doesn't allow image upload.", pc.getProject().getName()));
         }