From ddd38f36dcf1bf55b0c2cd5578b37add28490cea Mon Sep 17 00:00:00 2001 From: David Ostrovsky Date: Wed, 30 Jan 2019 00:07:17 +0100 Subject: [PATCH] ListChildProjects: Use parent predicate to find child projects Change-Id: I4c51f0c3826a71ad4aec9246e07883741b95b7ff --- .../gerrit/server/restapi/project/Index.java | 6 +-- .../restapi/project/ListChildProjects.java | 53 +++++++------------ .../sshd/commands/SetParentCommand.java | 5 +- 3 files changed, 25 insertions(+), 39 deletions(-) diff --git a/java/com/google/gerrit/server/restapi/project/Index.java b/java/com/google/gerrit/server/restapi/project/Index.java index 1b2a523079..b9fb82edd8 100644 --- a/java/com/google/gerrit/server/restapi/project/Index.java +++ b/java/com/google/gerrit/server/restapi/project/Index.java @@ -22,9 +22,8 @@ import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.extensions.api.projects.IndexProjectInput; import com.google.gerrit.extensions.common.ProjectInfo; -import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.Response; +import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.index.project.ProjectIndexer; import com.google.gerrit.reviewdb.client.Project; @@ -59,8 +58,7 @@ public class Index implements RestModifyView @Override public Response.Accepted apply(ProjectResource rsrc, IndexProjectInput input) - throws IOException, AuthException, OrmException, PermissionBackendException, - ResourceConflictException { + throws IOException, OrmException, PermissionBackendException, RestApiException { String response = "Project " + rsrc.getName() + " submitted for reindexing"; reindex(rsrc.getNameKey(), input.async); diff --git a/java/com/google/gerrit/server/restapi/project/ListChildProjects.java b/java/com/google/gerrit/server/restapi/project/ListChildProjects.java index 3067c895cc..e5555aa470 100644 --- a/java/com/google/gerrit/server/restapi/project/ListChildProjects.java +++ b/java/com/google/gerrit/server/restapi/project/ListChildProjects.java @@ -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 { @@ -40,24 +37,18 @@ public class ListChildProjects implements RestReadView { @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 queryProvider; @Inject ListChildProjects( - ProjectCache projectCache, PermissionBackend permissionBackend, - AllProjectsName allProjectsName, - ProjectJson json, - ChildProjects childProjects) { - this.projectCache = projectCache; + ChildProjects childProjects, + Provider 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 { @Override public List 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 { } private List directChildProjects(Project.NameKey parent) - throws PermissionBackendException { - Map 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()); } } diff --git a/java/com/google/gerrit/sshd/commands/SetParentCommand.java b/java/com/google/gerrit/sshd/commands/SetParentCommand.java index 56ee371786..f2d8c4c8ae 100644 --- a/java/com/google/gerrit/sshd/commands/SetParentCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetParentCommand.java @@ -33,6 +33,7 @@ import com.google.gerrit.server.restapi.project.ListChildProjects; import com.google.gerrit.server.restapi.project.SetParent; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; +import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import java.io.IOException; import java.util.ArrayList; @@ -111,7 +112,7 @@ final class SetParentCommand extends SshCommand { childProjects.addAll(getChildrenForReparenting(oldParent)); } catch (PermissionBackendException e) { throw new Failure(1, "permissions unavailable", e); - } catch (RestApiException e) { + } catch (OrmException | RestApiException e) { throw new Failure(1, "failure in request", e); } } @@ -148,7 +149,7 @@ final class SetParentCommand extends SshCommand { * reparenting. */ private List getChildrenForReparenting(ProjectState parent) - throws PermissionBackendException, RestApiException { + throws PermissionBackendException, OrmException, RestApiException { final List childProjects = new ArrayList<>(); final List excluded = new ArrayList<>(excludedChildren.size()); for (ProjectState excludedChild : excludedChildren) {