diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-04-28 11:39:40 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-04-28 18:36:09 +0200 |
commit | fdfa49be4133e34b6bb5849a137166eb29bf9109 (patch) | |
tree | 57c0ea40f099019e02e62b446f07a9f51142e845 | |
parent | e4390c1826c0e886be3bda201cac7f4401771778 (diff) | |
download | sonarqube-fdfa49be4133e34b6bb5849a137166eb29bf9109.tar.gz sonarqube-fdfa49be4133e34b6bb5849a137166eb29bf9109.zip |
Add visibility parameter in ProjectsService#create()
10 files changed, 103 insertions, 41 deletions
diff --git a/it/it-tests/src/test/java/it/administration/ProjectsAdministrationTest.java b/it/it-tests/src/test/java/it/administration/ProjectsAdministrationTest.java index 9efa0899ff5..c574563a4ae 100644 --- a/it/it-tests/src/test/java/it/administration/ProjectsAdministrationTest.java +++ b/it/it-tests/src/test/java/it/administration/ProjectsAdministrationTest.java @@ -34,7 +34,6 @@ import util.ItUtils; import static com.codeborne.selenide.Condition.text; import static com.codeborne.selenide.Selenide.$; -import static org.sonarqube.ws.client.project.UpdateVisibilityRequest.Visibility.PRIVATE; import static util.ItUtils.newAdminWsClient; import static util.ItUtils.projectDir; @@ -55,7 +54,7 @@ public class ProjectsAdministrationTest { public void return_all_projects_even_when_no_permission() throws Exception { orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")).setProperties("sonar.projectKey", "sample1")); orchestrator.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample")).setProperties("sonar.projectKey", "sample2")); - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(new UpdateVisibilityRequest("sample2", PRIVATE)); + ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject("sample2").setVisibility("private").build()); // Remove 'Admin' permission for admin group on project 2 -> No one can access or admin this project, expect System Admin newAdminWsClient(orchestrator).permissions().removeGroup(new RemoveGroupWsRequest().setProjectKey("sample2").setGroupName("sonar-administrators").setPermission("admin")); diff --git a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java b/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java index 5ec88a35529..e315c731c44 100644 --- a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java +++ b/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java @@ -37,7 +37,6 @@ import util.ItUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; -import static org.sonarqube.ws.client.project.UpdateVisibilityRequest.Visibility.PRIVATE; import static util.ItUtils.newAdminWsClient; import static util.ItUtils.runProjectAnalysis; @@ -85,7 +84,7 @@ public class ExecuteAnalysisPermissionTest { "You're only authorized to execute a local (preview) SonarQube analysis without pushing the results to the SonarQube server. Please contact your SonarQube administrator."); } - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(new UpdateVisibilityRequest(PROJECT_KEY, PRIVATE)); + ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject(PROJECT_KEY).setVisibility("private").build()); try { // Execute anonymous analysis executeAnonymousAnalysis(); @@ -102,7 +101,7 @@ public class ExecuteAnalysisPermissionTest { executeAnonymousAnalysis(); // make project private - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(new UpdateVisibilityRequest("sample", PRIVATE)); + ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject("sample").setVisibility("private").build()); // still no error executeAnonymousAnalysis(); diff --git a/it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java b/it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java index 27d31d0e09e..5d50b39d2d4 100644 --- a/it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java +++ b/it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java @@ -40,7 +40,6 @@ import util.ItUtils; import static java.util.Arrays.asList; import static junit.framework.TestCase.fail; import static org.assertj.core.api.Assertions.assertThat; -import static org.sonarqube.ws.client.project.UpdateVisibilityRequest.Visibility.PRIVATE; import static util.ItUtils.newAdminWsClient; import static util.ItUtils.newUserWsClient; import static util.ItUtils.projectDir; @@ -58,7 +57,7 @@ public class IssuePermissionTest { ItUtils.restoreProfile(orchestrator, getClass().getResource("/authorisation/one-issue-per-line-profile.xml")); orchestrator.getServer().provisionProject("privateProject", "PrivateProject"); - ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(new UpdateVisibilityRequest("privateProject", PRIVATE)); + ItUtils.newAdminWsClient(orchestrator).projects().updateVisibility(UpdateVisibilityRequest.builder().setProject("privateProject").setVisibility("private").build()); orchestrator.getServer().associateProjectToQualityProfile("privateProject", "xoo", "one-issue-per-line"); SonarScanner privateProject = SonarScanner.create(projectDir("shared/xoo-sample")) .setProperty("sonar.projectKey", "privateProject") diff --git a/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java b/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java index fe17b6d4c3d..84974174d53 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java @@ -45,11 +45,11 @@ import static org.sonarqube.ws.client.project.ProjectsWsParameters.ACTION_CREATE import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_BRANCH; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_NAME; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_VISIBILITY; public class CreateAction implements ProjectsWsAction { private static final String DEPRECATED_PARAM_KEY = "key"; - static final String PARAM_VISIBILITY = "visibility"; private final ProjectsWsSupport support; private final DbClient dbClient; @@ -117,13 +117,15 @@ public class CreateAction implements ProjectsWsAction { OrganizationDto organization = support.getOrganization(dbSession, ofNullable(request.getOrganization()) .orElseGet(defaultOrganizationProvider.get()::getKey)); userSession.checkPermission(PROVISION_PROJECTS, organization); + String visibility = request.getVisibility(); + Boolean changeToPrivate = visibility == null ? dbClient.organizationDao().getNewProjectPrivate(dbSession, organization) : "private".equals(visibility); ComponentDto componentDto = componentUpdater.create(dbSession, newComponentBuilder() .setOrganizationUuid(organization.getUuid()) .setKey(request.getKey()) .setName(request.getName()) .setBranch(request.getBranch()) - .setPrivate(request.getVisibility().map(Visibility::isPrivate).orElseGet(() -> dbClient.organizationDao().getNewProjectPrivate(dbSession, organization))) + .setPrivate(changeToPrivate) .setQualifier(PROJECT) .build(), userSession.isLoggedIn() ? userSession.getUserId() : null); diff --git a/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java b/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java index 3302a35e8f0..7b59665c5db 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java @@ -36,16 +36,16 @@ import org.sonar.server.component.ComponentFinder; import org.sonar.server.permission.index.PermissionIndexer; import org.sonar.server.project.Visibility; import org.sonar.server.user.UserSession; +import org.sonarqube.ws.client.project.ProjectsWsParameters; import static java.util.Collections.singletonList; import static org.sonar.core.permission.ProjectPermissions.PUBLIC_PERMISSIONS; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; import static org.sonar.server.ws.WsUtils.checkRequest; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_VISIBILITY; public class UpdateVisibilityAction implements ProjectsWsAction { - private static final String ACTION = "update_visibility"; - private static final String PARAM_VISIBILITY = "visibility"; private static final Set<String> ALLOWED_QUALIFIERS = ImmutableSet.of(Qualifiers.PROJECT, Qualifiers.VIEW); private final DbClient dbClient; @@ -62,7 +62,7 @@ public class UpdateVisibilityAction implements ProjectsWsAction { } public void define(WebService.NewController context) { - WebService.NewAction action = context.createAction(ACTION) + WebService.NewAction action = context.createAction(ProjectsWsParameters.ACTION_UPDATE_VISIBILITY) .setDescription("Updates visibility of a project or a view.<br/>" + "Requires 'Project administer' permission on the specified project or view") .setSince("6.4") diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/CreateRequest.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/CreateRequest.java index 8a03fff7c13..61c89eeabfc 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/CreateRequest.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/CreateRequest.java @@ -19,14 +19,10 @@ */ package org.sonarqube.ws.client.project; -import java.util.Optional; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import static com.google.common.base.Preconditions.checkArgument; -import static java.util.Arrays.asList; - @Immutable public class CreateRequest { @@ -50,10 +46,12 @@ public class CreateRequest { return organization; } + @CheckForNull public String getKey() { return key; } + @CheckForNull public String getName() { return name; } @@ -63,8 +61,9 @@ public class CreateRequest { return branch; } - public Optional<String> getVisibility() { - return Optional.ofNullable(visibility); + @CheckForNull + public String getVisibility() { + return visibility; } public static Builder builder() { @@ -82,17 +81,17 @@ public class CreateRequest { private Builder() { } - public Builder setOrganization(String organization) { + public Builder setOrganization(@Nullable String organization) { this.organization = organization; return this; } - public Builder setKey(String key) { + public Builder setKey(@Nullable String key) { this.key = key; return this; } - public Builder setName(String name) { + public Builder setName(@Nullable String name) { this.name = name; return this; } @@ -103,7 +102,6 @@ public class CreateRequest { } public Builder setVisibility(@Nullable String visibility) { - checkArgument(visibility == null || asList("private", "public").contains(visibility), "Unexpected visibility '" + visibility + "'"); this.visibility = visibility; return this; } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsService.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsService.java index a0d4b389258..f46f0f5701e 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsService.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsService.java @@ -35,6 +35,7 @@ import static org.sonarqube.ws.client.project.ProjectsWsParameters.ACTION_BULK_U import static org.sonarqube.ws.client.project.ProjectsWsParameters.ACTION_CREATE; import static org.sonarqube.ws.client.project.ProjectsWsParameters.ACTION_SEARCH; import static org.sonarqube.ws.client.project.ProjectsWsParameters.ACTION_UPDATE_KEY; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.ACTION_UPDATE_VISIBILITY; import static org.sonarqube.ws.client.project.ProjectsWsParameters.CONTROLLER; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_BRANCH; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_FROM; @@ -44,7 +45,7 @@ import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT_ID; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_QUALIFIERS; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_TO; -import static org.sonarqube.ws.client.project.UpdateVisibilityRequest.Visibility.PUBLIC; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_VISIBILITY; /** * Maps web service {@code api/projects}. @@ -66,7 +67,8 @@ public class ProjectsService extends BaseService { .setParam(PARAM_ORGANIZATION, project.getOrganization()) .setParam(PARAM_PROJECT, project.getKey()) .setParam(PARAM_NAME, project.getName()) - .setParam(PARAM_BRANCH, project.getBranch()); + .setParam(PARAM_BRANCH, project.getBranch()) + .setParam(PARAM_VISIBILITY, project.getVisibility()); return call(request, CreateWsResponse.parser()); } @@ -109,13 +111,9 @@ public class ProjectsService extends BaseService { } public void updateVisibility(UpdateVisibilityRequest request) { - PostRequest post = new PostRequest(path("update_visibility")) + PostRequest post = new PostRequest(path(ACTION_UPDATE_VISIBILITY)) .setParam(PARAM_PROJECT, request.getProject()) - .setParam("visibility", - request.getVisibility() - .map(visibility -> visibility == PUBLIC ? "public" : "private") - .orElse(null)); - + .setParam(PARAM_VISIBILITY, request.getVisibility()); call(post); } } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsWsParameters.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsWsParameters.java index c9b4a988a03..f4e9c7bc438 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsWsParameters.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/ProjectsWsParameters.java @@ -30,6 +30,7 @@ public class ProjectsWsParameters { public static final String ACTION_SEARCH = "search"; public static final String ACTION_UPDATE_KEY = "update_key"; public static final String ACTION_BULK_UPDATE_KEY = "bulk_update_key"; + public static final String ACTION_UPDATE_VISIBILITY = "update_visibility"; public static final String PARAM_PROJECT = "project"; public static final String PARAM_PROJECT_ID = "projectId"; @@ -41,6 +42,7 @@ public class ProjectsWsParameters { public static final String PARAM_TO = "to"; public static final String PARAM_DRY_RUN = "dryRun"; + public static final String PARAM_VISIBILITY = "visibility"; public static final String FILTER_LANGUAGES = "languages"; public static final String FILTER_TAGS = "tags"; diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/UpdateVisibilityRequest.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/UpdateVisibilityRequest.java index 38763165ad0..342b7a547b3 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/project/UpdateVisibilityRequest.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/project/UpdateVisibilityRequest.java @@ -19,26 +19,48 @@ */ package org.sonarqube.ws.client.project; -import java.util.Optional; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; public class UpdateVisibilityRequest { private final String project; - private final Visibility visibility; + private final String visibility; - public enum Visibility { - PUBLIC, PRIVATE - } - - public UpdateVisibilityRequest(String project, Visibility visibility) { - this.project = project; - this.visibility = visibility; + public UpdateVisibilityRequest(Builder builder) { + this.project = builder.project; + this.visibility = builder.visibility; } + @CheckForNull public String getProject() { return project; } - public Optional<Visibility> getVisibility() { - return Optional.ofNullable(visibility); + @CheckForNull + public String getVisibility() { + return visibility; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private String project; + private String visibility; + + public Builder setProject(@Nullable String project) { + this.project = project; + return this; + } + + public Builder setVisibility(@Nullable String visibility) { + this.visibility = visibility; + return this; + } + + public UpdateVisibilityRequest build() { + return new UpdateVisibilityRequest(this); + } } } diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/project/ProjectsServiceTest.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/project/ProjectsServiceTest.java index 2576eb3eb09..b329c02b774 100644 --- a/sonar-ws/src/test/java/org/sonarqube/ws/client/project/ProjectsServiceTest.java +++ b/sonar-ws/src/test/java/org/sonarqube/ws/client/project/ProjectsServiceTest.java @@ -85,6 +85,36 @@ public class ProjectsServiceTest { } @Test + public void creates_public_project() { + underTest.create(CreateRequest.builder() + .setKey("project_key") + .setName("Project Name") + .setVisibility("public") + .build()); + + assertThat(serviceTester.getPostRequest().getPath()).isEqualTo("api/projects/create"); + assertThat(serviceTester.getPostRequest().getParams()).containsOnly( + entry("project", "project_key"), + entry("name", "Project Name"), + entry("visibility", "public")); + } + + @Test + public void creates_private_project() { + underTest.create(CreateRequest.builder() + .setKey("project_key") + .setName("Project Name") + .setVisibility("private") + .build()); + + assertThat(serviceTester.getPostRequest().getPath()).isEqualTo("api/projects/create"); + assertThat(serviceTester.getPostRequest().getParams()).containsOnly( + entry("project", "project_key"), + entry("name", "Project Name"), + entry("visibility", "private")); + } + + @Test public void deletes_project_by_id() { underTest.delete(DeleteRequest.builder().setId("abc").build()); @@ -119,4 +149,17 @@ public class ProjectsServiceTest { .hasParam(PAGE_SIZE, 10) .andNoOtherParam(); } + + @Test + public void update_visibility() { + underTest.updateVisibility(UpdateVisibilityRequest.builder() + .setProject("project_key") + .setVisibility("public") + .build()); + + assertThat(serviceTester.getPostRequest().getPath()).isEqualTo("api/projects/update_visibility"); + assertThat(serviceTester.getPostRequest().getParams()).containsOnly( + entry("project", "project_key"), + entry("visibility", "public")); + } } |