Clean up RefControl by inlining trivial methods and moving state checks

This commit cleans up RefControl by inlining one-line methods directly
where called if the method only has a single caller.

It delegates the project state check for isVisible to ChangeControl and
ForRef.READ as this is the second last occurence of a state check in
RefControl. This splits up further refactoring into two steps which will
happen in subsequent commits.

Change-Id: Ieccf0622beaec2fc5202d660d87e53630469c8ac
diff --git a/java/com/google/gerrit/server/project/ChangeControl.java b/java/com/google/gerrit/server/project/ChangeControl.java
index 9bc59e2..0b1b2a8 100644
--- a/java/com/google/gerrit/server/project/ChangeControl.java
+++ b/java/com/google/gerrit/server/project/ChangeControl.java
@@ -22,6 +22,7 @@
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.common.data.LabelFunction;
 import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.common.data.PermissionRange;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.reviewdb.client.Account;
@@ -129,7 +130,7 @@
     if (getChange().isPrivate() && !isPrivateVisible(db, cd)) {
       return false;
     }
-    return refControl.isVisible();
+    return refControl.isVisible() && getProjectControl().getProject().getState().permitsRead();
   }
 
   /** Can this user abandon this change? */
@@ -137,7 +138,7 @@
     return (isOwner() // owner (aka creator) of the change can abandon
             || refControl.isOwner() // branch owner can abandon
             || getProjectControl().isOwner() // project owner can abandon
-            || refControl.canAbandon() // user can abandon a specific ref
+            || refControl.canPerform(Permission.ABANDON) // user can abandon a specific ref
             || getProjectControl().isAdmin())
         && !isPatchSetLocked(db);
   }
@@ -147,7 +148,8 @@
     switch (status) {
       case NEW:
       case ABANDONED:
-        return (isOwner() && refControl.canDeleteOwnChanges()) || getProjectControl().isAdmin();
+        return (isOwner() && refControl.canPerform(Permission.DELETE_OWN_CHANGES))
+            || getProjectControl().isAdmin();
       case MERGED:
       default:
         return false;
@@ -241,7 +243,8 @@
       return isOwner() // owner (aka creator) of the change can edit topic
           || refControl.isOwner() // branch owner can edit topic
           || getProjectControl().isOwner() // project owner can edit topic
-          || refControl.canEditTopicName() // user can edit topic on a specific ref
+          || refControl.canPerform(
+              Permission.EDIT_TOPIC_NAME) // user can edit topic on a specific ref
           || getProjectControl().isAdmin();
     }
     return refControl.canForceEditTopicName();
@@ -261,7 +264,7 @@
   private boolean canEditAssignee() {
     return isOwner()
         || getProjectControl().isOwner()
-        || refControl.canEditAssignee()
+        || refControl.canPerform(Permission.EDIT_ASSIGNEE)
         || isAssignee();
   }
 
@@ -270,14 +273,15 @@
     return isOwner() // owner (aka creator) of the change can edit hashtags
         || refControl.isOwner() // branch owner can edit hashtags
         || getProjectControl().isOwner() // project owner can edit hashtags
-        || refControl.canEditHashtags() // user can edit hashtag on a specific ref
+        || refControl.canPerform(
+            Permission.EDIT_HASHTAGS) // user can edit hashtag on a specific ref
         || getProjectControl().isAdmin();
   }
 
   private boolean isPrivateVisible(ReviewDb db, ChangeData cd) throws OrmException {
     return isOwner()
         || isReviewer(db, cd)
-        || refControl.canViewPrivateChanges()
+        || refControl.canPerform(Permission.VIEW_PRIVATE_CHANGES)
         || getUser().isInternalUser();
   }
 
diff --git a/java/com/google/gerrit/server/project/ProjectState.java b/java/com/google/gerrit/server/project/ProjectState.java
index e3d6078..6a5ecd8 100644
--- a/java/com/google/gerrit/server/project/ProjectState.java
+++ b/java/com/google/gerrit/server/project/ProjectState.java
@@ -259,6 +259,10 @@
     return config.getMaxObjectSizeLimit();
   }
 
+  public boolean statePermitsRead() {
+    return getProject().getState().permitsRead();
+  }
+
   public boolean statePermitsWrite() {
     return getProject().getState().permitsWrite();
   }
diff --git a/java/com/google/gerrit/server/project/RefControl.java b/java/com/google/gerrit/server/project/RefControl.java
index c65eb10..ab77ccd 100644
--- a/java/com/google/gerrit/server/project/RefControl.java
+++ b/java/com/google/gerrit/server/project/RefControl.java
@@ -100,9 +100,7 @@
   /** Can this user see this reference exists? */
   boolean isVisible() {
     if (isVisible == null) {
-      isVisible =
-          (getUser().isInternalUser() || canPerform(Permission.READ))
-              && isProjectStatePermittingRead();
+      isVisible = getUser().isInternalUser() || canPerform(Permission.READ);
     }
     return isVisible;
   }
@@ -132,35 +130,6 @@
     return canPerform(Permission.SUBMIT, isChangeOwner);
   }
 
-  /** @return true if this user can abandon a change for this ref */
-  boolean canAbandon() {
-    return canPerform(Permission.ABANDON);
-  }
-
-  /** @return true if this user can view private changes. */
-  boolean canViewPrivateChanges() {
-    return canPerform(Permission.VIEW_PRIVATE_CHANGES);
-  }
-
-  /** @return true if this user can delete their own changes. */
-  boolean canDeleteOwnChanges() {
-    return canPerform(Permission.DELETE_OWN_CHANGES);
-  }
-
-  /** @return true if this user can edit topic names. */
-  boolean canEditTopicName() {
-    return canPerform(Permission.EDIT_TOPIC_NAME);
-  }
-
-  /** @return true if this user can edit hashtag names. */
-  boolean canEditHashtags() {
-    return canPerform(Permission.EDIT_HASHTAGS);
-  }
-
-  boolean canEditAssignee() {
-    return canPerform(Permission.EDIT_ASSIGNEE);
-  }
-
   /** @return true if this user can force edit topic names. */
   boolean canForceEditTopicName() {
     return canForcePerform(Permission.EDIT_TOPIC_NAME);
@@ -189,17 +158,17 @@
     return canPerform(permissionName, false);
   }
 
-  boolean canPerform(String permissionName, boolean isChangeOwner) {
-    return doCanPerform(permissionName, isChangeOwner, false);
-  }
-
   ForRef asForRef() {
     return new ForRefImpl();
   }
 
+  private boolean canPerform(String permissionName, boolean isChangeOwner) {
+    return doCanPerform(permissionName, isChangeOwner, false);
+  }
+
   private boolean canUpload() {
     return projectControl.controlForRef("refs/for/" + refName).canPerform(Permission.PUSH)
-        && isProjectStatePermittingWrite();
+        && getProjectControl().getProject().getState().permitsWrite();
   }
 
   /** @return true if this user can submit merge patch sets to this ref */
@@ -246,14 +215,6 @@
     }
   }
 
-  private boolean isProjectStatePermittingWrite() {
-    return getProjectControl().getProject().getState().permitsWrite();
-  }
-
-  private boolean isProjectStatePermittingRead() {
-    return getProjectControl().getProject().getState().permitsRead();
-  }
-
   private boolean canPushWithForce() {
     if (RefNames.REFS_CONFIG.equals(refName) && !projectControl.isOwner()) {
       // Pushing requires being at least project owner, in addition to push.
@@ -530,7 +491,7 @@
     private boolean can(RefPermission perm) throws PermissionBackendException {
       switch (perm) {
         case READ:
-          return isVisible();
+          return isVisible() && getProjectControl().getProjectState().statePermitsRead();
         case CREATE:
           // TODO This isn't an accurate test.
           return canPerform(perm.permissionName().get());
@@ -562,7 +523,7 @@
           return projectControl.controlForRef(MagicBranch.NEW_CHANGE + refName).canSubmit(true);
 
         case READ_PRIVATE_CHANGES:
-          return canViewPrivateChanges();
+          return canPerform(Permission.VIEW_PRIVATE_CHANGES);
 
         case READ_CONFIG:
           return projectControl