ListChildProjects: Use parent predicate to find child projects

Change-Id: I4c51f0c3826a71ad4aec9246e07883741b95b7ff
This commit is contained in:
David Ostrovsky
2019-01-30 00:07:17 +01:00
committed by David Pursehouse
parent f358a748bb
commit ddd38f36dc
3 changed files with 25 additions and 39 deletions

View File

@@ -17,22 +17,19 @@ package com.google.gerrit.server.restapi.project;
import static java.util.stream.Collectors.toList;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsName;
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.ChildProjects;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectJson;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.server.project.ProjectState;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import java.util.HashMap;
import com.google.inject.Provider;
import java.util.List;
import java.util.Map;
import org.kohsuke.args4j.Option;
public class ListChildProjects implements RestReadView<ProjectResource> {
@@ -40,24 +37,18 @@ public class ListChildProjects implements RestReadView<ProjectResource> {
@Option(name = "--recursive", usage = "to list child projects recursively")
private boolean recursive;
private final ProjectCache projectCache;
private final PermissionBackend permissionBackend;
private final AllProjectsName allProjects;
private final ProjectJson json;
private final ChildProjects childProjects;
private final Provider<QueryProjects> queryProvider;
@Inject
ListChildProjects(
ProjectCache projectCache,
PermissionBackend permissionBackend,
AllProjectsName allProjectsName,
ProjectJson json,
ChildProjects childProjects) {
this.projectCache = projectCache;
ChildProjects childProjects,
Provider<QueryProjects> queryProvider) {
this.permissionBackend = permissionBackend;
this.allProjects = allProjectsName;
this.json = json;
this.childProjects = childProjects;
this.queryProvider = queryProvider;
}
public void setRecursive(boolean recursive) {
@@ -66,7 +57,7 @@ public class ListChildProjects implements RestReadView<ProjectResource> {
@Override
public List<ProjectInfo> apply(ProjectResource rsrc)
throws PermissionBackendException, ResourceConflictException {
throws PermissionBackendException, OrmException, RestApiException {
rsrc.getProjectState().checkStatePermitsRead();
if (recursive) {
return childProjects.list(rsrc.getNameKey());
@@ -76,22 +67,18 @@ public class ListChildProjects implements RestReadView<ProjectResource> {
}
private List<ProjectInfo> directChildProjects(Project.NameKey parent)
throws PermissionBackendException {
Map<Project.NameKey, Project> children = new HashMap<>();
for (Project.NameKey name : projectCache.all()) {
ProjectState c = projectCache.get(name);
if (c != null
&& parent.equals(c.getProject().getParent(allProjects))
&& c.statePermitsRead()) {
children.put(c.getNameKey(), c.getProject());
}
}
return permissionBackend
.currentUser()
.filter(ProjectPermission.ACCESS, children.keySet())
throws OrmException, RestApiException {
PermissionBackend.WithUser currentUser = permissionBackend.currentUser();
return queryProvider
.get()
.withQuery("parent:" + parent.get())
.apply(TopLevelResource.INSTANCE)
.stream()
.sorted()
.map((p) -> json.format(children.get(p)))
.filter(
p ->
currentUser
.project(new Project.NameKey(p.name))
.testOrFalse(ProjectPermission.ACCESS))
.collect(toList());
}
}