ListChildProjects: Use parent predicate to find child projects
Change-Id: I4c51f0c3826a71ad4aec9246e07883741b95b7ff
This commit is contained in:

committed by
David Pursehouse

parent
f358a748bb
commit
ddd38f36dc
@@ -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());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user