diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-08-25 10:05:09 +0200 |
---|---|---|
committer | Janos Gyerik <janos.gyerik@sonarsource.com> | 2017-09-12 11:34:53 +0200 |
commit | 0cf6dd627a9949749ce1400a82193e33632491b8 (patch) | |
tree | aa353592d01d1f7f042d253b5295e9a8df61258e /server | |
parent | b56de575ec830f18533a61d0ccd8523c0766a240 (diff) | |
download | sonarqube-0cf6dd627a9949749ce1400a82193e33632491b8.tar.gz sonarqube-0cf6dd627a9949749ce1400a82193e33632491b8.zip |
SONAR-9616 Handle branch in api/settings/values
Diffstat (limited to 'server')
-rw-r--r-- | server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java | 24 | ||||
-rw-r--r-- | server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java | 66 |
2 files changed, 83 insertions, 7 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java b/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java index 836e944cb1b..db6e2c21e31 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/setting/ws/ValuesAction.java @@ -49,9 +49,11 @@ import static java.util.stream.Stream.concat; import static org.apache.commons.lang.StringUtils.isEmpty; import static org.sonar.api.PropertyType.PROPERTY_SET; import static org.sonar.api.web.UserRole.USER; +import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; import static org.sonar.server.ws.WsUtils.writeProtobuf; import static org.sonarqube.ws.client.setting.SettingsWsParameters.ACTION_VALUES; +import static org.sonarqube.ws.client.setting.SettingsWsParameters.PARAM_BRANCH; import static org.sonarqube.ws.client.setting.SettingsWsParameters.PARAM_COMPONENT; import static org.sonarqube.ws.client.setting.SettingsWsParameters.PARAM_KEYS; @@ -95,12 +97,17 @@ public class ValuesAction implements SettingsWsAction { .setResponseExample(getClass().getResource("values-example.json")) .setSince("6.3") .setHandler(this); - action.createParam(PARAM_COMPONENT) - .setDescription("Component key") - .setExampleValue(KEY_PROJECT_EXAMPLE_001); action.createParam(PARAM_KEYS) .setDescription("List of setting keys") .setExampleValue("sonar.test.inclusions,sonar.dbcleaner.cleanDirectory"); + action.createParam(PARAM_COMPONENT) + .setDescription("Component key") + .setExampleValue(KEY_PROJECT_EXAMPLE_001); + action.createParam(PARAM_BRANCH) + .setDescription("Branch key") + .setExampleValue(KEY_BRANCH_EXAMPLE_001) + .setInternal(true) + .setSince("6.6"); } @Override @@ -122,7 +129,8 @@ public class ValuesAction implements SettingsWsAction { private static ValuesRequest toWsRequest(Request request) { ValuesRequest.Builder builder = ValuesRequest.builder() - .setComponent(request.param(PARAM_COMPONENT)); + .setComponent(request.param(PARAM_COMPONENT)) + .setBranch(request.param(PARAM_BRANCH)); if (request.hasParam(PARAM_KEYS)) { builder.setKeys(request.paramAsStrings(PARAM_KEYS)); } @@ -142,16 +150,20 @@ public class ValuesAction implements SettingsWsAction { if (componentKey == null) { return Optional.empty(); } - ComponentDto component = componentFinder.getByKey(dbSession, componentKey); + ComponentDto component = componentFinder.getByKeyAndOptionalBranch(dbSession, componentKey, valuesRequest.getBranch()); userSession.checkComponentPermission(USER, component); return Optional.of(component); } private List<Setting> loadSettings(DbSession dbSession, Optional<ComponentDto> component, Set<String> keys) { - // List of settings must be kept in the following orders : default -> global -> component + // List of settings must be kept in the following orders : default -> global -> component -> branch List<Setting> settings = new ArrayList<>(); settings.addAll(loadDefaultSettings(keys)); settings.addAll(settingsFinder.loadGlobalSettings(dbSession, keys)); + if (component.isPresent() && component.get().getBranch() != null && component.get().getMainBranchProjectUuid() != null) { + ComponentDto project = dbClient.componentDao().selectOrFailByUuid(dbSession, component.get().getMainBranchProjectUuid()); + settings.addAll(settingsFinder.loadComponentSettings(dbSession, keys, project).values()); + } component.ifPresent(componentDto -> settings.addAll(settingsFinder.loadComponentSettings(dbSession, keys, componentDto).values())); return settings.stream() .filter(settingsWsSupport.isSettingVisible(component)) diff --git a/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java index 1624a068e85..951d74abe7e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java @@ -728,6 +728,42 @@ public class ValuesActionTest { } @Test + public void branch_values() throws Exception { + ComponentDto project = db.components().insertMainBranch(); + userSession.logIn().addProjectPermission(USER, project); + ComponentDto branch = db.components().insertProjectBranch(project); + definitions.addComponent(PropertyDefinition.builder("sonar.leak.period").onQualifiers(PROJECT).build()); + propertyDb.insertProperties(newComponentPropertyDto(branch).setKey("sonar.leak.period").setValue("two")); + + ValuesWsResponse result = ws.newRequest() + .setParam("keys", "sonar.leak.period") + .setParam("component", branch.getKey()) + .setParam("branch", branch.getBranch()) + .executeProtobuf(ValuesWsResponse.class); + + assertThat(result.getSettingsList()).hasSize(1); + assertSetting(result.getSettings(0), "sonar.leak.period", "two", false); + } + + @Test + public void branch_values_inherit_from_project() throws Exception { + ComponentDto project = db.components().insertMainBranch(); + userSession.logIn().addProjectPermission(USER, project); + ComponentDto branch = db.components().insertProjectBranch(project); + definitions.addComponent(PropertyDefinition.builder("sonar.leak.period").onQualifiers(PROJECT).build()); + propertyDb.insertProperties(newComponentPropertyDto(project).setKey("sonar.leak.period").setValue("two")); + + ValuesWsResponse result = ws.newRequest() + .setParam("keys", "sonar.leak.period") + .setParam("component", branch.getKey()) + .setParam("branch", branch.getBranch()) + .executeProtobuf(ValuesWsResponse.class); + + assertThat(result.getSettingsList()).hasSize(1); + assertSetting(result.getSettings(0), "sonar.leak.period", "two", true); + } + + @Test public void fail_when_user_has_not_project_browse_permission() throws Exception { userSession.logIn("project-admin").addProjectPermission(CODEVIEWER, project); definitions.addComponent(PropertyDefinition.builder("foo").build()); @@ -753,6 +789,34 @@ public class ValuesActionTest { } @Test + public void fail_when_component_not_found() { + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Component key 'unknown' not found"); + + ws.newRequest() + .setParam("keys", "foo") + .setParam("component", "unknown") + .execute(); + } + + @Test + public void fail_when_branch_not_found() { + ComponentDto project = db.components().insertMainBranch(); + ComponentDto branch = db.components().insertProjectBranch(project); + String settingKey = "not_allowed_on_branch"; + userSession.logIn().addProjectPermission(USER, project); + + expectedException.expect(NotFoundException.class); + expectedException.expectMessage(format("Component '%s' on branch 'unknown' not found", branch.getKey())); + + ws.newRequest() + .setParam("keys", settingKey) + .setParam("component", branch.getKey()) + .setParam("branch", "unknown") + .execute(); + } + + @Test public void test_example_json_response() { logIn(); definitions.addComponent(PropertyDefinition @@ -804,7 +868,7 @@ public class ValuesActionTest { assertThat(action.isInternal()).isFalse(); assertThat(action.isPost()).isFalse(); assertThat(action.responseExampleAsString()).isNotEmpty(); - assertThat(action.params()).hasSize(2); + assertThat(action.params()).extracting(WebService.Param::key).containsExactlyInAnyOrder("keys", "component", "branch"); } private ValuesWsResponse executeRequestForComponentProperties(ComponentDto componentDto, String... keys) { |