From bcf0c7cc3b5c19ea065b164c2569d6d13a200db7 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Sun, 1 Oct 2017 11:53:35 +0100 Subject: [PATCH] ProjectApi: Add method to list project dashboards In the initial implementation, support for the "inherit" flag is not included. Change-Id: I0c615236f395db36e8a35318b221c3127a2bd78d --- .../acceptance/api/project/DashboardIT.java | 7 ++++ .../extensions/api/projects/ProjectApi.java | 11 +++++++ .../server/api/projects/ProjectApiImpl.java | 33 +++++++++++++++++++ .../gerrit/server/project/ListDashboards.java | 2 +- 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java index 4469a46157..eafd29fa31 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java @@ -25,6 +25,7 @@ import com.google.gerrit.extensions.api.projects.DashboardInfo; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.server.project.DashboardsCollection; +import java.util.List; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -46,6 +47,7 @@ public class DashboardIT extends AbstractDaemonTest { @Test public void getDashboard() throws Exception { + assertThat(dashboards()).isEmpty(); DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test"); DashboardInfo result = gApi.projects().name(project.get()).dashboard(info.id).get(); assertThat(result.id).isEqualTo(info.id); @@ -53,6 +55,7 @@ public class DashboardIT extends AbstractDaemonTest { assertThat(result.ref).isEqualTo(info.ref); assertThat(result.project).isEqualTo(project.get()); assertThat(result.definingProject).isEqualTo(project.get()); + assertThat(dashboards()).hasSize(1); } @Test @@ -63,6 +66,10 @@ public class DashboardIT extends AbstractDaemonTest { gApi.projects().name(project.get()).dashboard(info.id).get(true); } + private List dashboards() throws Exception { + return gApi.projects().name(project.get()).dashboards().get(); + } + private DashboardInfo createDashboard(String ref, String path) throws Exception { DashboardInfo info = DashboardsCollection.newDashboardInfo(ref, path); String canonicalRef = DashboardsCollection.normalizeDashboardRef(info.ref); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java index a61b68a2e1..3379edcdb5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java @@ -154,6 +154,12 @@ public interface ProjectApi { */ DashboardApi defaultDashboard() throws RestApiException; + abstract class ListDashboardsRequest { + public abstract List get() throws RestApiException; + } + + ListDashboardsRequest dashboards() throws RestApiException; + /** * A default implementation which allows source compatibility when adding new methods to the * interface. @@ -273,5 +279,10 @@ public interface ProjectApi { public DashboardApi defaultDashboard() throws RestApiException { throw new NotImplementedException(); } + + @Override + public ListDashboardsRequest dashboards() throws RestApiException { + throw new NotImplementedException(); + } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java index 5012280d76..89c92d0f07 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java @@ -16,6 +16,7 @@ package com.google.gerrit.server.api.projects; import static com.google.gerrit.server.api.ApiUtil.asRestApiException; import static com.google.gerrit.server.project.DashboardsCollection.DEFAULT_DASHBOARD_NAME; +import static java.util.stream.Collectors.toList; import com.google.gerrit.extensions.api.access.ProjectAccessInfo; import com.google.gerrit.extensions.api.access.ProjectAccessInput; @@ -28,6 +29,7 @@ import com.google.gerrit.extensions.api.projects.CommitApi; import com.google.gerrit.extensions.api.projects.ConfigInfo; import com.google.gerrit.extensions.api.projects.ConfigInput; import com.google.gerrit.extensions.api.projects.DashboardApi; +import com.google.gerrit.extensions.api.projects.DashboardInfo; import com.google.gerrit.extensions.api.projects.DeleteBranchesInput; import com.google.gerrit.extensions.api.projects.DeleteTagsInput; import com.google.gerrit.extensions.api.projects.DescriptionInput; @@ -39,6 +41,7 @@ import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.ProjectInfo; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.IdString; +import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestApiException; @@ -58,6 +61,7 @@ import com.google.gerrit.server.project.GetConfig; import com.google.gerrit.server.project.GetDescription; import com.google.gerrit.server.project.ListBranches; import com.google.gerrit.server.project.ListChildProjects; +import com.google.gerrit.server.project.ListDashboards; import com.google.gerrit.server.project.ListTags; import com.google.gerrit.server.project.ProjectJson; import com.google.gerrit.server.project.ProjectResource; @@ -68,6 +72,7 @@ import com.google.gerrit.server.project.SetAccess; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; +import java.util.Collections; import java.util.List; public class ProjectApiImpl implements ProjectApi { @@ -104,6 +109,7 @@ public class ProjectApiImpl implements ProjectApi { private final CommitApiImpl.Factory commitApi; private final DashboardApiImpl.Factory dashboardApi; private final CheckAccess checkAccess; + private final Provider listDashboards; @AssistedInject ProjectApiImpl( @@ -132,6 +138,7 @@ public class ProjectApiImpl implements ProjectApi { CommitApiImpl.Factory commitApi, DashboardApiImpl.Factory dashboardApi, CheckAccess checkAccess, + Provider listDashboards, @Assisted ProjectResource project) { this( user, @@ -160,6 +167,7 @@ public class ProjectApiImpl implements ProjectApi { commitApi, dashboardApi, checkAccess, + listDashboards, null); } @@ -190,6 +198,7 @@ public class ProjectApiImpl implements ProjectApi { CommitApiImpl.Factory commitApi, DashboardApiImpl.Factory dashboardApi, CheckAccess checkAccess, + Provider listDashboards, @Assisted String name) { this( user, @@ -218,6 +227,7 @@ public class ProjectApiImpl implements ProjectApi { commitApi, dashboardApi, checkAccess, + listDashboards, name); } @@ -248,6 +258,7 @@ public class ProjectApiImpl implements ProjectApi { CommitApiImpl.Factory commitApi, DashboardApiImpl.Factory dashboardApi, CheckAccess checkAccess, + Provider listDashboards, String name) { this.user = user; this.permissionBackend = permissionBackend; @@ -275,6 +286,7 @@ public class ProjectApiImpl implements ProjectApi { this.createAccessChange = createAccessChange; this.dashboardApi = dashboardApi; this.checkAccess = checkAccess; + this.listDashboards = listDashboards; this.name = name; } @@ -473,6 +485,27 @@ public class ProjectApiImpl implements ProjectApi { return dashboard(DEFAULT_DASHBOARD_NAME); } + @Override + public ListDashboardsRequest dashboards() throws RestApiException { + return new ListDashboardsRequest() { + @Override + public List get() throws RestApiException { + try { + List r = listDashboards.get().apply(checkExists()); + if (r.isEmpty()) { + return Collections.emptyList(); + } + if (r.get(0) instanceof DashboardInfo) { + return r.stream().map(i -> (DashboardInfo) i).collect(toList()); + } + throw new NotImplementedException("list with inheritance"); + } catch (Exception e) { + throw asRestApiException("Cannot list dashboards", e); + } + } + }; + } + private ProjectResource checkExists() throws ResourceNotFoundException { if (project == null) { throw new ResourceNotFoundException(name); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java index 1d3c58c2d6..6960b47695 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java @@ -46,7 +46,7 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class ListDashboards implements RestReadView { +public class ListDashboards implements RestReadView { private static final Logger log = LoggerFactory.getLogger(ListDashboards.class); private final GitRepositoryManager gitManager;