Convert ListDashboards to PermissionBackend

Change the getState() on ProjectResource to instead return
ProjectState object from the ProjectCache, which is much
more useful to callers.

Change-Id: Ib448c0ad41bc31f5a70907cabba2bb5e0c58ed4c
This commit is contained in:
Shawn Pearce
2017-02-23 11:57:43 -08:00
committed by David Pursehouse
parent 8ea6df30a2
commit 17ab8ce41e
2 changed files with 40 additions and 19 deletions

View File

@@ -19,12 +19,20 @@ import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.permissions.ProjectPermission;
import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.BlobBasedConfig; import org.eclipse.jgit.lib.BlobBasedConfig;
@@ -41,42 +49,56 @@ class ListDashboards implements RestReadView<ProjectResource> {
private static final Logger log = LoggerFactory.getLogger(ListDashboards.class); private static final Logger log = LoggerFactory.getLogger(ListDashboards.class);
private final GitRepositoryManager gitManager; private final GitRepositoryManager gitManager;
private final PermissionBackend permissionBackend;
private final Provider<CurrentUser> user;
@Option(name = "--inherited", usage = "include inherited dashboards") @Option(name = "--inherited", usage = "include inherited dashboards")
private boolean inherited; private boolean inherited;
@Inject @Inject
ListDashboards(GitRepositoryManager gitManager) { ListDashboards(
GitRepositoryManager gitManager,
PermissionBackend permissionBackend,
Provider<CurrentUser> user) {
this.gitManager = gitManager; this.gitManager = gitManager;
this.permissionBackend = permissionBackend;
this.user = user;
} }
@Override @Override
public List<?> apply(ProjectResource resource) throws ResourceNotFoundException, IOException { public List<?> apply(ProjectResource rsrc)
ProjectControl ctl = resource.getControl(); throws ResourceNotFoundException, IOException, PermissionBackendException {
String project = ctl.getProject().getName(); String project = rsrc.getName();
if (!inherited) { if (!inherited) {
return scan(resource.getControl(), project, true); return scan(rsrc.getControl(), project, true);
} }
List<List<DashboardInfo>> all = new ArrayList<>(); List<List<DashboardInfo>> all = new ArrayList<>();
boolean setDefault = true; boolean setDefault = true;
for (ProjectState ps : ctl.getProjectState().tree()) { for (ProjectState ps : tree(rsrc)) {
ctl = ps.controlFor(ctl.getUser()); List<DashboardInfo> list = scan(ps.controlFor(user.get()), project, setDefault);
if (ctl.isVisible()) { for (DashboardInfo d : list) {
List<DashboardInfo> list = scan(ctl, project, setDefault); if (d.isDefault != null && Boolean.TRUE.equals(d.isDefault)) {
for (DashboardInfo d : list) { setDefault = false;
if (d.isDefault != null && Boolean.TRUE.equals(d.isDefault)) {
setDefault = false;
}
}
if (!list.isEmpty()) {
all.add(list);
} }
} }
if (!list.isEmpty()) {
all.add(list);
}
} }
return all; return all;
} }
private Collection<ProjectState> tree(ProjectResource rsrc) throws PermissionBackendException {
Map<Project.NameKey, ProjectState> tree = new LinkedHashMap<>();
for (ProjectState ps : rsrc.getProjectState().tree()) {
tree.put(ps.getProject().getNameKey(), ps);
}
tree.keySet()
.retainAll(permissionBackend.user(user).filter(ProjectPermission.ACCESS, tree.keySet()));
return tree.values();
}
private List<DashboardInfo> scan(ProjectControl ctl, String project, boolean setDefault) private List<DashboardInfo> scan(ProjectControl ctl, String project, boolean setDefault)
throws ResourceNotFoundException, IOException { throws ResourceNotFoundException, IOException {
Project.NameKey projectName = ctl.getProject().getNameKey(); Project.NameKey projectName = ctl.getProject().getNameKey();

View File

@@ -14,7 +14,6 @@
package com.google.gerrit.server.project; package com.google.gerrit.server.project;
import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.extensions.restapi.RestResource; import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project;
@@ -42,8 +41,8 @@ public class ProjectResource implements RestResource {
return control.getProject().getNameKey(); return control.getProject().getNameKey();
} }
public ProjectState getState() { public ProjectState getProjectState() {
return control.getProject().getState(); return control.getProjectState();
} }
public ProjectControl getControl() { public ProjectControl getControl() {