]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7370 WS api/ce/activity returns developers
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Fri, 6 May 2016 13:23:55 +0000 (15:23 +0200)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Tue, 10 May 2016 13:03:59 +0000 (15:03 +0200)
server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java
server/sonar-server/src/test/java/org/sonar/server/component/ws/TreeActionTest.java
server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionTest.java
sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml
sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java
sonar-db/src/test/java/org/sonar/db/component/ComponentDbTester.java

index 1a15334bd80ddbc7ce41f053478d7d2c61041a26..8ab38f7c912c8b798ca5152665c47de534261be2 100644 (file)
@@ -74,6 +74,7 @@ import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_TYPE;
 public class ActivityAction implements CeWsAction {
   private static final int OFFSET = 0;
   private static final int MAX_PAGE_SIZE = 1000;
+  private static final List<String> POSSIBLE_QUALIFIERS = ImmutableList.of(Qualifiers.PROJECT, Qualifiers.VIEW, "DEV");
 
   private final UserSession userSession;
   private final DbClient dbClient;
@@ -216,22 +217,28 @@ public class ActivityAction implements CeWsAction {
       query.setStatuses(request.getStatus());
     }
 
-    loadComponentUuids(dbSession, request, query);
+    query.setComponentUuids(loadComponentUuids(dbSession, request));
     return query;
   }
 
-  private void loadComponentUuids(DbSession dbSession, ActivityWsRequest request, CeTaskQuery query) {
+  @CheckForNull
+  private List<String> loadComponentUuids(DbSession dbSession, ActivityWsRequest request) {
     String componentUuid = request.getComponentId();
     String componentQuery = request.getQuery();
 
     if (componentUuid != null) {
-      query.setComponentUuid(componentUuid);
+      return singletonList(componentUuid);
     }
     if (componentQuery != null) {
-      ComponentQuery componentDtoQuery = ComponentQuery.builder().setNameOrKeyQuery(componentQuery).setQualifiers(Qualifiers.PROJECT, Qualifiers.VIEW).build();
+      ComponentQuery componentDtoQuery = ComponentQuery.builder()
+        .setNameOrKeyQuery(componentQuery)
+        .setQualifiers(POSSIBLE_QUALIFIERS.toArray(new String[0]))
+        .build();
       List<ComponentDto> componentDtos = dbClient.componentDao().selectByQuery(dbSession, componentDtoQuery, 0, CeTaskQuery.MAX_COMPONENT_UUIDS);
-      query.setComponentUuids(Lists.transform(componentDtos, ComponentDtoFunctions.toUuid()));
+      return Lists.transform(componentDtos, ComponentDtoFunctions.toUuid());
     }
+
+    return null;
   }
 
   private Iterable<WsCe.Task> loadQueuedTasks(DbSession dbSession, ActivityWsRequest request, CeTaskQuery query) {
index eeb4690492e54394d47e94f3bbdc942f8fefffcc..da181306d8744f003d22c384f9c2ee2b5f8801f8 100644 (file)
@@ -43,6 +43,7 @@ import org.sonar.db.ce.CeActivityDto;
 import org.sonar.db.ce.CeQueueDto;
 import org.sonar.db.ce.CeTaskTypes;
 import org.sonar.db.component.ComponentDbTester;
+import org.sonar.db.component.ComponentDto;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.TestRequest;
@@ -61,7 +62,9 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.sonar.api.utils.DateUtils.formatDate;
 import static org.sonar.api.utils.DateUtils.formatDateTime;
+import static org.sonar.db.component.ComponentTesting.newDeveloper;
 import static org.sonar.db.component.ComponentTesting.newProjectDto;
+import static org.sonar.db.component.ComponentTesting.newView;
 import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_QUERY;
 import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_STATUS;
 
@@ -210,11 +213,14 @@ public class ActivityActionTest {
 
   @Test
   public void search_activity_by_component_name() throws IOException {
-    componentDb.insertProjectAndSnapshot(newProjectDto().setName("apache struts").setUuid("P1"));
-    componentDb.insertProjectAndSnapshot(newProjectDto().setName("apache zookeeper").setUuid("P2"));
-    componentDb.insertProjectAndSnapshot(newProjectDto().setName("eclipse").setUuid("P3"));
+    ComponentDto struts = newProjectDto().setName("old apache struts").setUuid("P1");
+    ComponentDto zookeeper = newProjectDto().setName("new apache zookeeper").setUuid("P2");
+    ComponentDto eclipse = newProjectDto().setName("eclipse").setUuid("P3");
+    componentDb.insertProjectAndSnapshot(struts);
+    componentDb.insertProjectAndSnapshot(zookeeper);
+    componentDb.insertProjectAndSnapshot(eclipse);
     dbTester.commit();
-    componentDb.indexProjects();
+    componentDb.indexComponents(struts.getId(), zookeeper.getId(), eclipse.getId());
     userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     insertActivity("T1", "P1", CeActivityDto.Status.SUCCESS);
     insertActivity("T2", "P2", CeActivityDto.Status.SUCCESS);
@@ -225,6 +231,22 @@ public class ActivityActionTest {
     assertThat(activityResponse.getTasksList()).extracting("id").containsOnly("T1", "T2");
   }
 
+  @Test
+  public void search_activity_returns_views_and_developers() {
+    ComponentDto developer = newDeveloper("Apache Developer").setUuid("D1");
+    ComponentDto apacheView = newView().setName("Apache View").setUuid("V1");
+    componentDb.insertDeveloperAndSnapshot(developer);
+    componentDb.insertViewAndSnapshot(apacheView);
+    componentDb.indexComponents(developer.getId(), apacheView.getId());
+    userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    insertActivity("T1", "D1", CeActivityDto.Status.SUCCESS);
+    insertActivity("T2", "V1", CeActivityDto.Status.SUCCESS);
+
+    ActivityResponse activityResponse = call(ws.newRequest().setParam(PARAM_COMPONENT_QUERY, "apac"));
+
+    assertThat(activityResponse.getTasksList()).extracting("id").containsOnly("T1", "T2");
+  }
+
   @Test
   public void search_task_id_in_queue_ignoring_other_parameters() throws IOException {
     insertQueue("T1", "PROJECT_1", CeQueueDto.Status.IN_PROGRESS);
index 16f4f42fc2a22f2680974c6be3089ae47de65dac..81f47d59f973f9a4f887e12bb47ed3ddd3fe0e53 100644 (file)
@@ -118,7 +118,7 @@ public class TreeActionTest {
     SnapshotDto directorySnapshot = componentDb.insertComponentAndSnapshot(newDirectory(project, "directory-path-1"), moduleSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, 10), directorySnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     TreeWsResponse response = call(ws.newRequest()
       .setParam(PARAM_STRATEGY, "children")
@@ -149,7 +149,7 @@ public class TreeActionTest {
     SnapshotDto directorySnapshot = componentDb.insertComponentAndSnapshot(newDirectory(project, "directory-path-1"), moduleSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, 1), directorySnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     TreeWsResponse response = call(ws.newRequest()
       .setParam(PARAM_STRATEGY, "all")
@@ -175,7 +175,7 @@ public class TreeActionTest {
     SnapshotDto directorySnapshot = componentDb.insertComponentAndSnapshot(newDirectory(project, "directory-path-1"), moduleSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, 3), directorySnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     TreeWsResponse response = call(ws.newRequest()
       .setParam(PARAM_STRATEGY, "leaves")
@@ -195,7 +195,7 @@ public class TreeActionTest {
     componentDb.insertComponentAndSnapshot(newFileDto(project, 2), projectSnapshot);
     componentDb.insertComponentAndSnapshot(newModuleDto("module-uuid-1", project), projectSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     TreeWsResponse response = call(ws.newRequest()
       .setParam(PARAM_STRATEGY, "all")
@@ -215,7 +215,7 @@ public class TreeActionTest {
     componentDb.insertComponentAndSnapshot(module, projectSnapshot);
     componentDb.insertComponentAndSnapshot(newDirectory(project, "path/directory/", "directory-uuid-1"), projectSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     TreeWsResponse response = call(ws.newRequest()
       .setParam(PARAM_STRATEGY, "all")
@@ -234,7 +234,7 @@ public class TreeActionTest {
     componentDb.insertComponentAndSnapshot(newProjectCopy("project-uuid-1-copy", project, view), viewSnapshot);
     componentDb.insertComponentAndSnapshot(newSubView(view, "sub-view-uuid", "sub-view-key").setName("sub-view-name"), viewSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     TreeWsResponse response = call(ws.newRequest()
       .setParam(PARAM_STRATEGY, "children")
@@ -414,7 +414,7 @@ public class TreeActionTest {
         projectSnapshot);
     }
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
     return project;
   }
 
index fa54083e525734bde532f67d7bf131b60ef5c619..73e96ee5aec0397c8e7ea7c5372981192b449cca 100644 (file)
@@ -184,7 +184,7 @@ public class SearchProjectPermissionsActionTest {
   public void search_by_query_on_name() {
     componentDb.insertProjectAndSnapshot(newProjectDto().setName("project-name"));
     componentDb.insertProjectAndSnapshot(newProjectDto().setName("another-name"));
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     String result = ws.newRequest()
       .setParam(TEXT_QUERY, "project")
@@ -198,7 +198,7 @@ public class SearchProjectPermissionsActionTest {
   public void search_by_query_on_key_must_match_exactly() {
     componentDb.insertProjectAndSnapshot(newProjectDto().setKey("project-key"));
     componentDb.insertProjectAndSnapshot(newProjectDto().setKey("another-key"));
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     String result = ws.newRequest()
       .setParam(TEXT_QUERY, "project-key")
@@ -213,7 +213,7 @@ public class SearchProjectPermissionsActionTest {
     for (int i = 1; i <= 1001; i++) {
       componentDb.insertProjectAndSnapshot(newProjectDto("project-uuid-" + i));
     }
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     String result = ws.newRequest()
       .setParam(TEXT_QUERY, "project")
index 629c32a1a0e7b067641306a53fdca719bf75cd04..8b3e5a8a9df0a18d6ce36f4a649da0c5cfbb5587 100644 (file)
@@ -181,7 +181,7 @@ public class BulkApplyTemplateActionTest {
     // match must be exact on key
     ComponentDto projectUntouched = newProjectDto().setKey("new-sonar").setName("project-name");
     componentDb.insertProjectAndSnapshot(projectUntouched);
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     call(ws.newRequest()
       .setParam(PARAM_TEMPLATE_ID, template1.getUuid())
index 91641a7a37902e8eab2985b47408ceee317a7c87..a21fca2c369b17adee95ff2467bbf8b586754257 100644 (file)
     select
     <include refid="componentColumns"/>
     <include refid="sqlSelectByQuery"/>
-    ORDER BY LOWER(p.name), p.name
+    ORDER BY LOWER(p.name), p.name, p.id
   </select>
 
   <select id="countByQuery" resultType="int">
index 8af397c8ae25280ecf8e9c444a2bf33fda265f33..6c4308fd068f2201af55d40856a9e8ddfde779e3 100644 (file)
@@ -695,7 +695,7 @@ public class ComponentDaoTest {
     for (int i = 9; i >= 1; i--) {
       componentDb.insertProjectAndSnapshot(newProjectDto().setName("project-" + i));
     }
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentQuery query = ComponentQuery.builder().setNameOrKeyQuery("oJect").setQualifiers(Qualifiers.PROJECT).build();
     List<ComponentDto> result = underTest.selectByQuery(dbSession, query, 1, 3);
@@ -708,7 +708,7 @@ public class ComponentDaoTest {
   @Test
   public void select_by_query_name_with_special_characters() {
     componentDb.insertProjectAndSnapshot(newProjectDto().setName("project-\\_%/-name"));
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentQuery query = ComponentQuery.builder().setNameOrKeyQuery("-\\_%/-").setQualifiers(Qualifiers.PROJECT).build();
     List<ComponentDto> result = underTest.selectByQuery(dbSession, query, 0, 10);
@@ -720,7 +720,7 @@ public class ComponentDaoTest {
   @Test
   public void select_by_query_key_with_special_characters() {
     componentDb.insertProjectAndSnapshot(newProjectDto().setKey("project-_%-key"));
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentQuery query = ComponentQuery.builder().setNameOrKeyQuery("project-_%-key").setQualifiers(Qualifiers.PROJECT).build();
     List<ComponentDto> result = underTest.selectByQuery(dbSession, query, 0, 10);
@@ -749,7 +749,7 @@ public class ComponentDaoTest {
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-1-uuid"), projectSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-2-uuid"), moduleSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(projectSnapshot).build();
 
@@ -768,7 +768,7 @@ public class ComponentDaoTest {
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-1-uuid").setName("file-name-1"), projectSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-2-uuid").setName("file-name-2"), moduleSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(projectSnapshot)
       .setNameOrKeyQuery("file-name").build();
@@ -788,7 +788,7 @@ public class ComponentDaoTest {
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-1-uuid").setKey("file-key-1").setName("File one"), projectSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-2-uuid").setKey("file-key-2").setName("File two"), moduleSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(projectSnapshot)
       .setNameOrKeyQuery("file-key-1").build();
@@ -808,7 +808,7 @@ public class ComponentDaoTest {
       componentDb.insertComponentAndSnapshot(newFileDto(project, "file-uuid-" + i), projectSnapshot);
     }
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(projectSnapshot)
       .setPage(2)
@@ -831,7 +831,7 @@ public class ComponentDaoTest {
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-uuid-2").setName("file-name-2").setPath("2"), projectSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-uuid-3").setName("file-name-3").setPath("1"), projectSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(projectSnapshot)
       .setSortFields(singletonList("path"))
@@ -851,7 +851,7 @@ public class ComponentDaoTest {
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-1-uuid"), projectSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-2-uuid"), moduleSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(moduleSnapshot).build();
 
@@ -868,7 +868,7 @@ public class ComponentDaoTest {
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-1-uuid"), projectSnapshot);
     componentDb.insertComponentAndSnapshot(newFileDto(project, "file-2-uuid"), moduleSnapshot);
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(projectSnapshot).build();
 
@@ -890,7 +890,7 @@ public class ComponentDaoTest {
     ComponentDto project = newProjectDto("project-uuid").setName("project-name");
     componentDb.insertProjectAndSnapshot(project);
     componentDb.insertComponentAndSnapshot(newProjectCopy("project-copy-uuid", project, view), viewSnapshot);
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
     ComponentTreeQuery dbQuery = newTreeQuery(viewSnapshot).build();
 
     List<ComponentDtoWithSnapshotId> components = underTest.selectDirectChildren(dbSession, dbQuery);
@@ -909,7 +909,7 @@ public class ComponentDaoTest {
     ComponentDto project = newProjectDto("project-uuid").setName("project name");
     componentDb.insertProjectAndSnapshot(project);
     componentDb.insertComponentAndSnapshot(newProjectCopy("project-copy-uuid", project, view), viewSnapshot);
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
     ComponentTreeQuery dbQuery = newTreeQuery(viewSnapshot).setNameOrKeyQuery("name").build();
 
     List<ComponentDtoWithSnapshotId> components = underTest.selectDirectChildren(dbSession, dbQuery);
@@ -928,7 +928,7 @@ public class ComponentDaoTest {
       componentDb.insertComponentAndSnapshot(newFileDto(project, "file-uuid-" + i).setName("file-name-" + i), moduleSnapshot);
     }
     db.commit();
-    componentDb.indexProjects();
+    componentDb.indexProjectsAndViews();
 
     ComponentTreeQuery query = newTreeQuery(projectSnapshot)
       .setQualifiers(newArrayList(Qualifiers.FILE))
index f9d949404f647d852524af3e75bbcb5da2d1b82d..389e674b6e87b2c3ef8302e95521097655f5bead 100644 (file)
@@ -83,8 +83,15 @@ public class ComponentDbTester {
     db.commit();
   }
 
-  public void indexProjects() {
+  public void indexProjectsAndViews() {
     dbClient.componentIndexDao().indexProjects();
     db.commit();
   }
+
+  public void indexComponents(long... componentIdList) {
+    for (long componentId : componentIdList) {
+      dbClient.componentIndexDao().indexResource(dbSession, componentId);
+    }
+    db.commit();
+  }
 }