aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-server/src
diff options
context:
space:
mode:
authorJacek <52388493+jacek-poreda-sonarsource@users.noreply.github.com>2019-07-10 14:49:01 +0200
committerSonarTech <sonartech@sonarsource.com>2019-07-10 17:22:54 +0200
commitc51c7a56f6b0586c4143b11cfec8030f4a7def57 (patch)
treefdbb6a5f5427a8c64d7cabecbdca571abb64c1f8 /server/sonar-server/src
parenta3fd5e44071f2ffec5dc9b019f2b2026d40d2c61 (diff)
downloadsonarqube-c51c7a56f6b0586c4143b11cfec8030f4a7def57.tar.gz
sonarqube-c51c7a56f6b0586c4143b11cfec8030f4a7def57.zip
SONAR-12275 Add 'component' param to ce/activity endpoint (#1904)
* add 'component' param to ce/activity endpoint * deprecate 'componentId' request param * remove unnecessary method in IT
Diffstat (limited to 'server/sonar-server/src')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java49
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java43
2 files changed, 87 insertions, 5 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java b/server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
index b7fc096d6b7..cefe7441f2a 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
@@ -60,6 +60,7 @@ import static org.sonar.api.utils.DateUtils.parseEndingDateOrDateTime;
import static org.sonar.api.utils.DateUtils.parseStartingDateOrDateTime;
import static org.sonar.core.util.stream.MoreCollectors.toList;
import static org.sonar.db.Pagination.forPage;
+import static org.sonar.server.ce.ws.CeWsParameters.PARAM_COMPONENT;
import static org.sonar.server.ce.ws.CeWsParameters.PARAM_COMPONENT_ID;
import static org.sonar.server.ce.ws.CeWsParameters.PARAM_MAX_EXECUTED_AT;
import static org.sonar.server.ce.ws.CeWsParameters.PARAM_MIN_SUBMITTED_AT;
@@ -94,8 +95,10 @@ public class ActivityAction implements CeWsAction {
public void define(WebService.NewController controller) {
WebService.NewAction action = controller.createAction("activity")
.setDescription(format("Search for tasks.<br> " +
+ "Either %s or %s can be provided, but not both.<br> " +
"Requires the system administration permission, " +
- "or project administration permission if %s is set.", PARAM_COMPONENT_ID))
+ "or project administration permission if %s or %s is set.",
+ PARAM_COMPONENT_ID, PARAM_COMPONENT, PARAM_COMPONENT_ID, PARAM_COMPONENT))
.setResponseExample(getClass().getResource("activity-example.json"))
.setHandler(this)
.setChangelog(
@@ -108,7 +111,14 @@ public class ActivityAction implements CeWsAction {
action.createParam(PARAM_COMPONENT_ID)
.setDescription("Id of the component (project) to filter on")
+ .setDeprecatedSince("8.0")
.setExampleValue(Uuids.UUID_EXAMPLE_03);
+
+ action.createParam(PARAM_COMPONENT)
+ .setDescription("Key of the component (project) to filter on")
+ .setExampleValue("projectKey")
+ .setSince("8.0");
+
action.createParam(TEXT_QUERY)
.setDescription(format("Limit search to: <ul>" +
"<li>component names that contain the supplied string</li>" +
@@ -177,10 +187,19 @@ public class ActivityAction implements CeWsAction {
@CheckForNull
private ComponentDto loadComponent(DbSession dbSession, Request request) {
String componentId = request.getComponentId();
- if (componentId == null) {
- return null;
+ String componentKey = request.getComponent();
+
+ Optional<ComponentDto> foundComponent;
+
+ if (componentId != null) {
+ foundComponent = dbClient.componentDao().selectByUuid(dbSession, componentId);
+ return checkFoundWithOptional(foundComponent, "Component '%s' does not exist", componentId);
+ } else if (componentKey != null) {
+ foundComponent = dbClient.componentDao().selectByKey(dbSession, componentKey);
+ return checkFoundWithOptional(foundComponent, "Component '%s' does not exist", componentKey);
}
- return checkFoundWithOptional(dbClient.componentDao().selectByUuid(dbSession, componentId), "Component '%s' does not exist", componentId);
+
+ return null;
}
private void checkPermission(@Nullable ComponentDto component) {
@@ -275,6 +294,7 @@ public class ActivityAction implements CeWsAction {
private static Request toSearchWsRequest(org.sonar.api.server.ws.Request request) {
Request activityWsRequest = new Request()
.setComponentId(request.param(PARAM_COMPONENT_ID))
+ .setComponent(request.param(PARAM_COMPONENT))
.setQ(request.param(TEXT_QUERY))
.setStatus(request.paramAsStrings(PARAM_STATUS))
.setType(request.param(PARAM_TYPE))
@@ -285,12 +305,20 @@ public class ActivityAction implements CeWsAction {
checkRequest(activityWsRequest.getComponentId() == null || activityWsRequest.getQ() == null, "%s and %s must not be set at the same time",
PARAM_COMPONENT_ID, TEXT_QUERY);
+
+ checkRequest(activityWsRequest.getComponent() == null || activityWsRequest.getQ() == null, "%s and %s must not be set at the same time",
+ PARAM_COMPONENT, TEXT_QUERY);
+
+ checkRequest(activityWsRequest.getComponentId() == null || activityWsRequest.getComponent() == null, "%s and %s must not be set at the same time",
+ PARAM_COMPONENT_ID, PARAM_COMPONENT);
+
return activityWsRequest;
}
private static class Request {
private String componentId;
+ private String component;
private String maxExecutedAt;
private String minSubmittedAt;
private String onlyCurrents;
@@ -317,6 +345,19 @@ public class ActivityAction implements CeWsAction {
}
/**
+ * Example value: "sample:src/main/xoo/sample/Sample2.xoo"
+ */
+ private Request setComponent(@Nullable String component) {
+ this.component = component;
+ return this;
+ }
+
+ @CheckForNull
+ private String getComponent() {
+ return component;
+ }
+
+ /**
* Example value: "2017-10-19T13:00:00+0200"
*/
private Request setMaxExecutedAt(@Nullable String maxExecutedAt) {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java
index 8df62cca4f7..417ff3ea812 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java
@@ -250,7 +250,7 @@ public class ActivityActionTest {
}
@Test
- public void project_administrator_can_access_his_project_activity() {
+ public void project_administrator_can_access_his_project_activity_using_component_id() {
ComponentDto project1 = db.components().insertPrivateProject();
ComponentDto project2 = db.components().insertPrivateProject();
// no need to be a system admin
@@ -267,6 +267,23 @@ public class ActivityActionTest {
}
@Test
+ public void project_administrator_can_access_his_project_activity_using_component_key() {
+ ComponentDto project1 = db.components().insertPrivateProject();
+ ComponentDto project2 = db.components().insertPrivateProject();
+ // no need to be a system admin
+ userSession.logIn().addProjectPermission(UserRole.ADMIN, project1);
+ insertActivity("T1", project1, SUCCESS);
+ insertActivity("T2", project2, FAILED);
+
+ ActivityResponse activityResponse = call(ws.newRequest().setParam("component", project1.getDbKey()));
+
+ assertThat(activityResponse.getTasksCount()).isEqualTo(1);
+ assertThat(activityResponse.getTasks(0).getId()).isEqualTo("T1");
+ assertThat(activityResponse.getTasks(0).getStatus()).isEqualTo(Ce.TaskStatus.SUCCESS);
+ assertThat(activityResponse.getTasks(0).getComponentId()).isEqualTo(project1.uuid());
+ }
+
+ @Test
public void return_401_if_user_is_not_logged_in() {
ComponentDto project = db.components().insertPrivateProject();
userSession.anonymous();
@@ -457,6 +474,30 @@ public class ActivityActionTest {
}
@Test
+ public void fail_if_both_component_id_and_component_key_provided() {
+ expectedException.expect(BadRequestException.class);
+ expectedException.expectMessage("componentId and component must not be set at the same time");
+
+ ws.newRequest()
+ .setParam("componentId", "ID1")
+ .setParam("component", "apache")
+ .setMediaType(MediaTypes.PROTOBUF)
+ .execute();
+ }
+
+ @Test
+ public void fail_if_both_filters_on_component_key_and_name() {
+ expectedException.expect(BadRequestException.class);
+ expectedException.expectMessage("component and q must not be set at the same time");
+
+ ws.newRequest()
+ .setParam("q", "apache")
+ .setParam("component", "apache")
+ .setMediaType(MediaTypes.PROTOBUF)
+ .execute();
+ }
+
+ @Test
public void fail_if_both_filters_on_component_id_and_name() {
expectedException.expect(BadRequestException.class);
expectedException.expectMessage("componentId and q must not be set at the same time");