summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2017-08-25 10:05:09 +0200
committerJanos Gyerik <janos.gyerik@sonarsource.com>2017-09-12 11:34:53 +0200
commit0cf6dd627a9949749ce1400a82193e33632491b8 (patch)
treeaa353592d01d1f7f042d253b5295e9a8df61258e /server
parentb56de575ec830f18533a61d0ccd8523c0766a240 (diff)
downloadsonarqube-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.java24
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java66
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) {