]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6947 api/permissions/groups use GroupsWsRequest
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Wed, 11 Nov 2015 10:45:39 +0000 (11:45 +0100)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Tue, 17 Nov 2015 12:40:18 +0000 (13:40 +0100)
14 files changed:
server/sonar-server/src/main/java/org/sonar/server/permission/ws/GroupsAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionChangeBuilder.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionDependenciesFinder.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionRequest.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/UsersAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/WsProjectRef.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/ApplyTemplateAction.java
server/sonar-server/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java
sonar-ws/src/main/java/org/sonarqube/ws/client/permission/GroupsWsRequest.java [new file with mode: 0644]
sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsWsClient.java
sonar-ws/src/main/java/org/sonarqube/ws/client/permission/WsGroupsRequest.java [deleted file]
sonar-ws/src/test/java/org/sonarqube/ws/client/WsClientTest.java

index 041d215e55199234caf19fbeafb224c4759ee2a1..5bdb246ac2a6c65477c91146b7747dfb3e767bae 100644 (file)
@@ -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();
-  }
 }
index 3418bfe041301d34df4219237235b19437b75eed..d3e47832542a27b323df4640f9831741bab3cacf 100644 (file)
@@ -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());
     }
index 1bd97f2dad5c882950010a645af5f7b88ed78374..44429626dc262ca6ec0af9fde7eece2d47768fb9 100644 (file)
@@ -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));
   }
 
index 352e0e606b5b348ded6ffa08884b79e5770b8ebe..a11a8adbeae18364b03f2031399741d45c07b7ff 100644 (file)
@@ -140,7 +140,7 @@ class PermissionRequest {
     }
 
     private void setProject(Request request) {
-      this.project = WsProjectRef.optionalFromRequest(request);
+      this.project = WsProjectRef.newOptionalWsProjectRef(request);
     }
 
     private void checkPermissionParameter() {
index aa6f842ea561b97138641a5fe6dbd33faf3bc754..d0e4ccfabd1512d47c2cf913c16c379c6e403c11 100644 (file)
@@ -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;
index 0e91bce2eb551523ad24b3c3a3979c89333b7070..91587892a539df5948430ff560d6fbc8beef9c32 100644 (file)
@@ -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()));
index 1de9929e0eac9088839dfbcff8e009010adc2cf0..967471638a6d55819db6e623e557c52cfa49eead 100644 (file)
@@ -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;
index 97f44766dd96a88559ed1dfbefb569c1e483344a..d71b6861442b216482d16054b0ea307857fc0b31 100644 (file)
@@ -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);
index 8a10f4b17d958cc65d3515a5a6b73463d83c8022..f1a93a983d53a173dad3e0d97cf4a8bd7d502bca 100644 (file)
@@ -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(),
index ade5d7a6a9a859bc2380c1bbc4ad16724e0cafad..7e77eb15fa11cd11e369553c920889efa545c91c 100644 (file)
@@ -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 (file)
index 0000000..e43fb44
--- /dev/null
@@ -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;
+  }
+}
index c84ebab181fdd621a41792a0c14c21f329645027..2f84930e96fbe7c2ca9ad6cc8e33202dce9c1525 100644 (file)
@@ -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 (file)
index e8d6da0..0000000
+++ /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;
-  }
-}
index 1e0c65ba55d97539b80f33230a9691861b51a254..3f2beff0d2c80a7e1a49d7f779d0d4a8ac4c1048 100644 (file)
@@ -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");
   }