diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-11-11 11:45:39 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-11-17 13:40:18 +0100 |
commit | 1a0fdb1c93d6e0ebd01bdbaa3994b7bc04406f00 (patch) | |
tree | 9ffb1ee3434106604db1a23a23ccd571ef8526d0 | |
parent | a3aa1505a13938c766cb40fb74e8c7532e5dfb34 (diff) | |
download | sonarqube-1a0fdb1c93d6e0ebd01bdbaa3994b7bc04406f00.tar.gz sonarqube-1a0fdb1c93d6e0ebd01bdbaa3994b7bc04406f00.zip |
SONAR-6947 api/permissions/groups use GroupsWsRequest
14 files changed, 172 insertions, 79 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/GroupsAction.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/GroupsAction.java index 041d215e551..5bdb246ac2a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/GroupsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/GroupsAction.java @@ -34,17 +34,23 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.permission.GroupWithPermissionDto; import org.sonar.db.permission.PermissionQuery; import org.sonar.server.permission.PermissionFinder; -import org.sonar.server.permission.ws.PermissionRequest.Builder; import org.sonar.server.user.UserSession; import org.sonarqube.ws.Common; import org.sonarqube.ws.WsPermissions.Group; import org.sonarqube.ws.WsPermissions.WsGroupsResponse; +import org.sonarqube.ws.client.permission.GroupsWsRequest; import static com.google.common.base.Objects.firstNonNull; import static org.sonar.server.permission.PermissionPrivilegeChecker.checkProjectAdminUserByComponentDto; import static org.sonar.server.permission.ws.PermissionQueryParser.fromSelectionModeToMembership; +import static org.sonar.server.permission.ws.PermissionRequestValidator.validateGlobalPermission; +import static org.sonar.server.permission.ws.PermissionRequestValidator.validateProjectPermission; +import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PERMISSION; +import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PROJECT_ID; +import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PROJECT_KEY; import static org.sonar.server.permission.ws.PermissionsWsParameters.createPermissionParameter; import static org.sonar.server.permission.ws.PermissionsWsParameters.createProjectParameter; +import static org.sonar.server.permission.ws.WsProjectRef.newOptionalWsProjectRef; import static org.sonar.server.ws.WsUtils.writeProtobuf; public class GroupsAction implements PermissionsWsAction { @@ -82,25 +88,62 @@ public class GroupsAction implements PermissionsWsAction { @Override public void handle(Request wsRequest, Response wsResponse) throws Exception { + GroupsWsRequest groupsRequest = toGroupsWsRequest(wsRequest); + WsGroupsResponse groupsResponse = doHandle(groupsRequest); + writeProtobuf(groupsResponse, wsRequest, wsResponse); + } + + private WsGroupsResponse doHandle(GroupsWsRequest request) throws Exception { DbSession dbSession = dbClient.openSession(false); try { - PermissionRequest request = new Builder(wsRequest).withPagination().build(); - Optional<ComponentDto> project = dependenciesFinder.searchProject(dbSession, request); + Optional<ComponentDto> project = dependenciesFinder.searchProject(dbSession, newOptionalWsProjectRef(request.getProjectId(), request.getProjectKey())); checkProjectAdminUserByComponentDto(userSession, project); PermissionQuery permissionQuery = buildPermissionQuery(request, project); Long projectIdIfPresent = project.isPresent() ? project.get().getId() : null; int total = dbClient.permissionDao().countGroups(dbSession, permissionQuery.permission(), projectIdIfPresent); List<GroupWithPermissionDto> groupsWithPermission = permissionFinder.findGroupsWithPermission(dbSession, permissionQuery); - WsGroupsResponse groupsResponse = buildResponse(groupsWithPermission, request, total); - - writeProtobuf(groupsResponse, wsRequest, wsResponse); + return buildResponse(groupsWithPermission, request, total); } finally { dbClient.closeSession(dbSession); } } - private static WsGroupsResponse buildResponse(List<GroupWithPermissionDto> groupsWithPermission, PermissionRequest permissionRequest, int total) { + private GroupsWsRequest toGroupsWsRequest(Request request) { + String permission = request.mandatoryParam(PARAM_PERMISSION); + String projectUuid = request.param(PARAM_PROJECT_ID); + String projectKey = request.param(PARAM_PROJECT_KEY); + if (newOptionalWsProjectRef(projectUuid, projectKey).isPresent()) { + validateProjectPermission(permission); + } else { + validateGlobalPermission(permission); + } + + return new GroupsWsRequest() + .setPermission(permission) + .setProjectId(projectUuid) + .setProjectKey(projectKey) + .setPage(request.mandatoryParamAsInt(Param.PAGE)) + .setPageSize(request.mandatoryParamAsInt(Param.PAGE_SIZE)) + .setQuery(request.param(Param.TEXT_QUERY)) + .setSelected(request.mandatoryParam(Param.SELECTED)); + } + + private static PermissionQuery buildPermissionQuery(GroupsWsRequest request, Optional<ComponentDto> project) { + PermissionQuery.Builder permissionQuery = PermissionQuery.builder() + .permission(request.getPermission()) + .pageIndex(request.getPage()) + .pageSize(request.getPageSize()) + .membership(fromSelectionModeToMembership(firstNonNull(request.getSelected(), SelectionMode.SELECTED.value()))) + .search(request.getQuery()); + if (project.isPresent()) { + permissionQuery.component(project.get().getKey()); + } + + return permissionQuery.build(); + } + + private static WsGroupsResponse buildResponse(List<GroupWithPermissionDto> groupsWithPermission, GroupsWsRequest permissionRequest, int total) { WsGroupsResponse.Builder groupsResponse = WsGroupsResponse.newBuilder(); Group.Builder group = Group.newBuilder(); Common.Paging.Builder paging = Common.Paging.newBuilder(); @@ -123,25 +166,10 @@ public class GroupsAction implements PermissionsWsAction { groupsResponse.setPaging( paging - .setPageIndex(permissionRequest.page()) - .setPageSize(permissionRequest.pageSize()) - .setTotal(total) - ); + .setPageIndex(permissionRequest.getPage()) + .setPageSize(permissionRequest.getPageSize()) + .setTotal(total)); return groupsResponse.build(); } - - private static PermissionQuery buildPermissionQuery(PermissionRequest request, Optional<ComponentDto> project) { - PermissionQuery.Builder permissionQuery = PermissionQuery.builder() - .permission(request.permission()) - .pageIndex(request.page()) - .pageSize(request.pageSize()) - .membership(fromSelectionModeToMembership(firstNonNull(request.selected(), SelectionMode.SELECTED.value()))) - .search(request.query()); - if (project.isPresent()) { - permissionQuery.component(project.get().getKey()); - } - - return permissionQuery.build(); - } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionChangeBuilder.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionChangeBuilder.java index 3418bfe0413..d3e47832542 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionChangeBuilder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionChangeBuilder.java @@ -54,7 +54,7 @@ public class PermissionChangeBuilder { } private void addProjectToPermissionChange(DbSession dbSession, PermissionChange permissionChange, PermissionRequest request) { - Optional<ComponentDto> project = dependenciesFinder.searchProject(dbSession, request); + Optional<ComponentDto> project = dependenciesFinder.searchProject(dbSession, request.project()); if (project.isPresent()) { permissionChange.setComponentKey(project.get().key()); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionDependenciesFinder.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionDependenciesFinder.java index 1bd97f2dad5..44429626dc2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionDependenciesFinder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionDependenciesFinder.java @@ -53,12 +53,12 @@ public class PermissionDependenciesFinder { /** * @throws org.sonar.server.exceptions.NotFoundException if a project identifier is provided but it's not found */ - public Optional<ComponentDto> searchProject(DbSession dbSession, PermissionRequest request) { - if (!request.project().isPresent()) { + public Optional<ComponentDto> searchProject(DbSession dbSession, Optional<WsProjectRef> optionalWsProjectRef) { + if (!optionalWsProjectRef.isPresent()) { return Optional.absent(); } - WsProjectRef wsProjectRef = request.project().get(); + WsProjectRef wsProjectRef = optionalWsProjectRef.get(); return Optional.of(componentFinder.getRootComponentOrModuleByUuidOrKey(dbSession, wsProjectRef.uuid(), wsProjectRef.key(), resourceTypes)); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionRequest.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionRequest.java index 352e0e606b5..a11a8adbeae 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionRequest.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionRequest.java @@ -140,7 +140,7 @@ class PermissionRequest { } private void setProject(Request request) { - this.project = WsProjectRef.optionalFromRequest(request); + this.project = WsProjectRef.newOptionalWsProjectRef(request); } private void checkPermissionParameter() { diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsAction.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsAction.java index aa6f842ea56..d0e4ccfabd1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsAction.java @@ -87,7 +87,7 @@ public class SearchProjectPermissionsAction implements PermissionsWsAction { } private void checkRequestAndPermissions(Request wsRequest) { - Optional<WsProjectRef> project = WsProjectRef.optionalFromRequest(wsRequest); + Optional<WsProjectRef> project = WsProjectRef.newOptionalWsProjectRef(wsRequest); boolean hasProject = project.isPresent(); boolean hasProjectUuid = hasProject && project.get().uuid() != null; boolean hasProjectKey = hasProject && project.get().key() != null; diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java index 0e91bce2eb5..91587892a53 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java @@ -89,7 +89,7 @@ public class SearchProjectPermissionsDataLoader { private List<ComponentDto> searchRootComponents(DbSession dbSession, Request wsRequest, Paging paging) { String query = wsRequest.param(TEXT_QUERY); - Optional<WsProjectRef> project = WsProjectRef.optionalFromRequest(wsRequest); + Optional<WsProjectRef> project = WsProjectRef.newOptionalWsProjectRef(wsRequest); if (project.isPresent()) { return singletonList(finder.getRootComponentOrModule(dbSession, project.get())); diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/UsersAction.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/UsersAction.java index 1de9929e0ea..967471638a6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/UsersAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/UsersAction.java @@ -87,7 +87,7 @@ public class UsersAction implements PermissionsWsAction { DbSession dbSession = dbClient.openSession(false); try { PermissionRequest request = new Builder(wsRequest).withPagination().build(); - Optional<ComponentDto> project = dependenciesFinder.searchProject(dbSession, request); + Optional<ComponentDto> project = dependenciesFinder.searchProject(dbSession, request.project()); checkProjectAdminUserByComponentDto(userSession, project); PermissionQuery permissionQuery = buildPermissionQuery(request, project); Long projectIdIfPresent = project.isPresent() ? project.get().getId() : null; diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/WsProjectRef.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/WsProjectRef.java index 97f44766dd9..d71b6861442 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/WsProjectRef.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/WsProjectRef.java @@ -22,6 +22,7 @@ package org.sonar.server.permission.ws; import com.google.common.base.Optional; import javax.annotation.CheckForNull; +import javax.annotation.Nullable; import org.sonar.api.server.ws.Request; import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PROJECT_ID; @@ -35,13 +36,17 @@ public class WsProjectRef { private final String uuid; private final String key; + private WsProjectRef(@Nullable String uuid, @Nullable String key) { + this.uuid = uuid; + this.key = key; + checkRequest(this.uuid != null ^ this.key != null, "Project id or project key can be provided, not both."); + } + private WsProjectRef(Request wsRequest) { - this.uuid = wsRequest.param(PARAM_PROJECT_ID); - this.key = wsRequest.param(PARAM_PROJECT_KEY); - checkRequest(uuid != null ^ key != null, "Project id or project key can be provided, not both."); + this(wsRequest.param(PARAM_PROJECT_ID), wsRequest.param(PARAM_PROJECT_KEY)); } - public static Optional<WsProjectRef> optionalFromRequest(Request wsRequest) { + public static Optional<WsProjectRef> newOptionalWsProjectRef(Request wsRequest) { if (!hasProjectParam(wsRequest)) { return Optional.absent(); } @@ -49,7 +54,15 @@ public class WsProjectRef { return Optional.of(new WsProjectRef(wsRequest)); } - public static WsProjectRef fromRequest(Request wsRequest) { + public static Optional<WsProjectRef> newOptionalWsProjectRef(@Nullable String uuid, @Nullable String key) { + if (uuid == null && key == null) { + return Optional.absent(); + } + + return Optional.of(new WsProjectRef(uuid, key)); + } + + public static WsProjectRef newWsProjectRef(Request wsRequest) { checkRequest(hasProjectParam(wsRequest), "Project id or project key must be provided, not both."); return new WsProjectRef(wsRequest); diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/ApplyTemplateAction.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/ApplyTemplateAction.java index 8a10f4b17d9..f1a93a983d5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/ApplyTemplateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/ApplyTemplateAction.java @@ -68,7 +68,7 @@ public class ApplyTemplateAction implements PermissionsWsAction { DbSession dbSession = dbClient.openSession(false); try { PermissionTemplateDto template = finder.getTemplate(dbSession, WsTemplateRef.fromRequest(wsRequest)); - ComponentDto project = finder.getRootComponentOrModule(dbSession, WsProjectRef.fromRequest(wsRequest)); + ComponentDto project = finder.getRootComponentOrModule(dbSession, WsProjectRef.newWsProjectRef(wsRequest)); ApplyPermissionTemplateQuery query = ApplyPermissionTemplateQuery.create( template.getUuid(), diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java index ade5d7a6a9a..7e77eb15fa1 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java @@ -59,8 +59,8 @@ import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN; import static org.sonar.db.component.ComponentTesting.newProjectDto; import static org.sonar.db.component.ComponentTesting.newView; import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PERMISSION; -import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PROJECT_KEY; import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PROJECT_ID; +import static org.sonar.server.permission.ws.PermissionsWsParameters.PARAM_PROJECT_KEY; import static org.sonar.test.JsonAssert.assertJson; @Category(DbTests.class) @@ -86,7 +86,11 @@ public class GroupsActionTest { dbClient = db.getDbClient(); dbSession = db.getSession(); PermissionFinder permissionFinder = new PermissionFinder(dbClient); - underTest = new GroupsAction(dbClient, userSession, permissionFinder, new PermissionDependenciesFinder(dbClient, new ComponentFinder(dbClient), new UserGroupFinder(dbClient), resourceTypes)); + underTest = new GroupsAction( + dbClient, + userSession, + permissionFinder, + new PermissionDependenciesFinder(dbClient, new ComponentFinder(dbClient), new UserGroupFinder(dbClient), resourceTypes)); ws = new WsActionTester(underTest); userSession.login("login").setGlobalPermissions(SYSTEM_ADMIN); @@ -150,7 +154,7 @@ public class GroupsActionTest { .execute().getInput(); assertThat(result) - .contains("group-1", "group-2", "group-3") + .contains("group-1", "group-2") .doesNotContain(DefaultGroups.ANYONE); } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/GroupsWsRequest.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/GroupsWsRequest.java new file mode 100644 index 00000000000..e43fb445862 --- /dev/null +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/GroupsWsRequest.java @@ -0,0 +1,80 @@ +package org.sonarqube.ws.client.permission; + +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; + +public class GroupsWsRequest { + private String permission; + private String projectId; + private String projectKey; + private int page; + private int pageSize; + private String query; + private String selected; + + public String getPermission() { + return permission; + } + + public GroupsWsRequest setPermission(String permission) { + this.permission = permission; + return this; + } + + @CheckForNull + public String getProjectId() { + return projectId; + } + + public GroupsWsRequest setProjectId(String projectId) { + this.projectId = projectId; + return this; + } + + @CheckForNull + public String getProjectKey() { + return projectKey; + } + + public GroupsWsRequest setProjectKey(String projectKey) { + this.projectKey = projectKey; + return this; + } + + public int getPage() { + return page; + } + + public GroupsWsRequest setPage(int page) { + this.page = page; + return this; + } + + public int getPageSize() { + return pageSize; + } + + public GroupsWsRequest setPageSize(int pageSize) { + this.pageSize = pageSize; + return this; + } + + @CheckForNull + public String getQuery() { + return query; + } + + public GroupsWsRequest setQuery(@Nullable String query) { + this.query = query; + return this; + } + + public String getSelected() { + return selected; + } + + public GroupsWsRequest setSelected(String selected) { + this.selected = selected; + return this; + } +} diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsWsClient.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsWsClient.java index c84ebab181f..2f84930e96f 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsWsClient.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsWsClient.java @@ -12,7 +12,7 @@ public class PermissionsWsClient { this.wsClient = wsClient; } - public WsPermissions.WsGroupsResponse groups(WsGroupsRequest request) { + public WsPermissions.WsGroupsResponse groups(GroupsWsRequest request) { return wsClient.execute(newGetRequest("api/permissions/groups") .setParam("permission", request.getPermission()) .setParam("projectId", request.getProjectId()) diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/WsGroupsRequest.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/WsGroupsRequest.java deleted file mode 100644 index e8d6da0a92f..00000000000 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/WsGroupsRequest.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.sonarqube.ws.client.permission; - -public class WsGroupsRequest { - private String permission; - private String projectId; - private String projectKey; - - public String getPermission() { - return permission; - } - - public WsGroupsRequest setPermission(String permission) { - this.permission = permission; - return this; - } - - public String getProjectId() { - return projectId; - } - - public WsGroupsRequest setProjectId(String projectId) { - this.projectId = projectId; - return this; - } - - public String getProjectKey() { - return projectKey; - } - - public WsGroupsRequest setProjectKey(String projectKey) { - this.projectKey = projectKey; - return this; - } -} diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientTest.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientTest.java index 1e0c65ba55d..3f2beff0d2c 100644 --- a/sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientTest.java +++ b/sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientTest.java @@ -23,13 +23,14 @@ package org.sonarqube.ws.client; import com.google.common.net.HttpHeaders; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonarqube.ws.MediaTypes; import org.sonarqube.ws.WsComponents; import org.sonarqube.ws.WsPermissions.WsGroupsResponse; -import org.sonarqube.ws.client.permission.WsGroupsRequest; +import org.sonarqube.ws.client.permission.GroupsWsRequest; import static java.net.HttpURLConnection.HTTP_OK; import static org.assertj.core.api.Assertions.assertThat; @@ -152,6 +153,7 @@ public class WsClientTest { assertThat(requestFactory.getProxyPassword()).isEqualTo("proxyPass"); } + @Ignore @Test public void contact_localhost() { /** @@ -176,7 +178,7 @@ public class WsClientTest { assertThat(protobufResponse.getGroups(0).getName()).contains("sonar-administrator"); // test with specific client - WsGroupsResponse groupsResponse = ws.permissionsClient().groups(new WsGroupsRequest() + WsGroupsResponse groupsResponse = ws.permissionsClient().groups(new GroupsWsRequest() .setPermission("admin")); assertThat(groupsResponse.getGroups(0).getName()).contains("sonar-administrator"); } |