ChangeJson: Project control cache is dead; remove it

ChangeJson tries to use Cache<Project.NameKey, ProjectControl> to
optimize construction of ChangeControl in control() method:

  if (cd.hasChangeControl()) {
    ctrl = cd.changeControl().forUser(userProvider.get());
  } else {
    ctrl = projectControls.get(cd.change().getProject())
      .controlFor(cd.change());
  }

However during rendering of multiple changes as result of change query
execution, the condition:

  if (cd.hasChangeControl()) {
    ctrl = cd.changeControl().forUser(userProvider.get());
  }

is always true and the cache is never used. That's because is_visible()
predicate is always get added to the query passed by user in:

  public List<List<ChangeData>> queryChanges(List<String> queries) {
    final Predicate<ChangeData> visibleToMe = queryBuilder.is_visible();
    [...]
    Predicate<ChangeData> q = parseQuery(query, visibleToMe);
    Predicate<ChangeData> s = queryRewriter.rewrite(q, start);

And the is_visible() predicate creates ChangeControl and set it into
ChangeData instance by calling cacheVisibleTo() method:

  void cacheVisibleTo(ChangeControl ctl) {
    visibleTo = ctl.getCurrentUser();
    changeControl = ctl;
  }

Change-Id: I596c1be8f5fcd6060797a9d601d00c982689b6bd
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
index 4f4f1d9..5c1ffdf 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
@@ -33,9 +33,6 @@
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.base.Optional;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
@@ -74,7 +71,6 @@
 import com.google.gerrit.reviewdb.client.PatchSetApproval;
 import com.google.gerrit.reviewdb.client.PatchSetInfo;
 import com.google.gerrit.reviewdb.client.PatchSetInfo.ParentInfo;
-import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.UserIdentity;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
@@ -88,7 +84,6 @@
 import com.google.gerrit.server.patch.PatchSetInfoFactory;
 import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
 import com.google.gerrit.server.project.ChangeControl;
-import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.query.change.ChangeData.ChangedLines;
@@ -100,7 +95,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.sql.Timestamp;
 import java.util.Collection;
 import java.util.Collections;
@@ -111,7 +105,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.concurrent.ExecutionException;
 
 public class ChangeJson {
   private static final Logger log = LoggerFactory.getLogger(ChangeJson.class);
@@ -137,7 +130,6 @@
   private final Provider<CurrentUser> userProvider;
   private final AnonymousUser anonymous;
   private final IdentifiedUser.GenericFactory userFactory;
-  private final ProjectControl.GenericFactory projectControlFactory;
   private final ChangeData.Factory changeDataFactory;
   private final PatchSetInfoFactory patchSetInfoFactory;
   private final ChangesCollection changes;
@@ -152,7 +144,6 @@
   private AccountInfo.Loader accountLoader;
   private ChangeControl lastControl;
   private Set<Change.Id> reviewed;
-  private LoadingCache<Project.NameKey, ProjectControl> projectControls;
   private Provider<WebLinks> webLinks;
 
   @Inject
@@ -178,7 +169,6 @@
     this.userProvider = user;
     this.anonymous = au;
     this.userFactory = uf;
-    this.projectControlFactory = pcf;
     this.changeDataFactory = cdf;
     this.patchSetInfoFactory = psi;
     this.changes = changes;
@@ -191,15 +181,6 @@
     this.webLinks = webLinks;
 
     options = EnumSet.noneOf(ListChangesOption.class);
-    projectControls = CacheBuilder.newBuilder()
-      .concurrencyLevel(1)
-      .build(new CacheLoader<Project.NameKey, ProjectControl>() {
-        @Override
-        public ProjectControl load(Project.NameKey key)
-            throws NoSuchProjectException, IOException {
-          return projectControlFactory.controlFor(key, userProvider.get());
-        }
-      });
   }
 
   public ChangeJson addOption(ListChangesOption o) {
@@ -369,19 +350,7 @@
         && cd.getId().equals(lastControl.getChange().getId())) {
       return lastControl;
     }
-    ChangeControl ctrl;
-    try {
-      if (cd.hasChangeControl()) {
-        ctrl = cd.changeControl().forUser(userProvider.get());
-      } else {
-        ctrl = projectControls.get(cd.change().getProject())
-            .controlFor(cd.change());
-      }
-    } catch (ExecutionException e) {
-      throw new OrmException(e);
-    }
-    lastControl = ctrl;
-    return ctrl;
+    return lastControl = cd.changeControl().forUser(userProvider.get());
   }
 
   private List<SubmitRecord> submitRecords(ChangeData cd) throws OrmException {