]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8615 add organization to response of api/issues/search 1533/head
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 16 Jan 2017 14:58:54 +0000 (15:58 +0100)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 17 Jan 2017 11:14:42 +0000 (12:14 +0100)
20 files changed:
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseData.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseLoader.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/assigned_to_me_facet_sticky.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/components_contains_sub_projects.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_deprecated_debt_fields.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_facets.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_facets_effort.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_zero_facets.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_on_removed_file.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_action_plan.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_attributes.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_comment_hidden.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_comments.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/load_additional_fields.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/load_additional_fields_with_issue_admin_permission.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/response_contains_all_fields_except_additional_fields.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/sort_by_updated_at.json
sonar-ws/src/main/protobuf/ws-issues.proto

index eaec552b104fac10952f5188a2213d11f51fe166..a6773692c520f6f29ab48c20699ab9fcaffe00ca 100644 (file)
@@ -32,6 +32,7 @@ import javax.annotation.Nullable;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.issue.IssueChangeDto;
 import org.sonar.db.issue.IssueDto;
+import org.sonar.db.organization.OrganizationDto;
 import org.sonar.db.rule.RuleDto;
 import org.sonar.db.user.UserDto;
 import org.sonar.server.issue.workflow.Transition;
@@ -48,6 +49,7 @@ public class SearchResponseData {
   private Long effortTotal = null;
   private List<UserDto> users = null;
   private List<RuleDto> rules = null;
+  private final Map<String, String> organizationKeysByUuid = new HashMap<>();
   private final Map<String, ComponentDto> componentsByUuid = new HashMap<>();
   private final ListMultimap<String, IssueChangeDto> commentsByIssueKey = ArrayListMultimap.create();
   private final ListMultimap<String, String> actionsByIssueKey = ArrayListMultimap.create();
@@ -83,6 +85,12 @@ public class SearchResponseData {
     return rules;
   }
 
+  public String getOrganizationKey(String organizationUuid) {
+    String organizationKey = organizationKeysByUuid.get(organizationUuid);
+    checkNotNull(organizationKey, "Organization for uuid '%s' not found", organizationUuid);
+    return organizationKey;
+  }
+
   @CheckForNull
   public List<IssueChangeDto> getCommentsForIssueKey(String issueKey) {
     if (commentsByIssueKey.containsKey(issueKey)) {
@@ -153,4 +161,8 @@ public class SearchResponseData {
   public void setEffortTotal(@Nullable Long effortTotal) {
     this.effortTotal = effortTotal;
   }
+
+  public void addOrganization(OrganizationDto organizationDto) {
+    this.organizationKeysByUuid.put(organizationDto.getUuid(), organizationDto.getKey());
+  }
 }
index 45367f19916a0d509a34dd24ef88344aad79783c..0061989a77baf35e17156e0d11be22ad780e22f3 100644 (file)
@@ -146,6 +146,7 @@ public class SearchResponseFormat {
     setNullable(dto.getType(), issueBuilder::setType, Common.RuleType::valueOf);
 
     ComponentDto component = data.getComponentByUuid(dto.getComponentUuid());
+    issueBuilder.setOrganization(data.getOrganizationKey(component.getOrganizationUuid()));
     issueBuilder.setComponent(component.key());
     // Only used for the compatibility with the Java WS Client <= 4.4 used by Eclipse
     issueBuilder.setComponentId(component.getId());
@@ -285,36 +286,38 @@ public class SearchResponseFormat {
   }
 
   private static List<Issues.Component> formatComponents(SearchResponseData data) {
-    List<Issues.Component> result = new ArrayList<>();
     Collection<ComponentDto> components = data.getComponents();
-    if (components != null) {
-      for (ComponentDto dto : components) {
-        String uuid = dto.uuid();
-        Issues.Component.Builder builder = Issues.Component.newBuilder()
-          .setId(dto.getId())
-          .setKey(dto.key())
-          .setUuid(uuid)
-          .setQualifier(dto.qualifier())
-          .setName(nullToEmpty(dto.name()))
-          .setLongName(nullToEmpty(dto.longName()))
-          .setEnabled(dto.isEnabled());
-        String path = dto.path();
-        // path is not applicable to the components that are not files.
-        // Value must not be "" in this case.
-        if (!Strings.isNullOrEmpty(path)) {
-          builder.setPath(path);
-        }
+    if (components == null) {
+      return Collections.emptyList();
+    }
+    List<Issues.Component> result = new ArrayList<>();
+    for (ComponentDto dto : components) {
+      String uuid = dto.uuid();
+      Issues.Component.Builder builder = Issues.Component.newBuilder()
+        .setOrganization(data.getOrganizationKey(dto.getOrganizationUuid()))
+        .setId(dto.getId())
+        .setKey(dto.key())
+        .setUuid(uuid)
+        .setQualifier(dto.qualifier())
+        .setName(nullToEmpty(dto.name()))
+        .setLongName(nullToEmpty(dto.longName()))
+        .setEnabled(dto.isEnabled());
+      String path = dto.path();
+      // path is not applicable to the components that are not files.
+      // Value must not be "" in this case.
+      if (!Strings.isNullOrEmpty(path)) {
+        builder.setPath(path);
+      }
 
-        // On a root project, parentProjectId is null but projectId is equal to itself, which make no sense.
-        if (!uuid.equals(dto.getRootUuid())) {
-          ComponentDto project = data.getComponentByUuid(dto.projectUuid());
-          setNullable(project, builder::setProjectId, ComponentDto::getId);
+      // On a root project, parentProjectId is null but projectId is equal to itself, which make no sense.
+      if (!uuid.equals(dto.getRootUuid())) {
+        ComponentDto project = data.getComponentByUuid(dto.projectUuid());
+        setNullable(project, builder::setProjectId, ComponentDto::getId);
 
-          ComponentDto subProject = data.getComponentByUuid(dto.getRootUuid());
-          setNullable(subProject, builder::setSubProjectId, ComponentDto::getId);
-        }
-        result.add(builder.build());
+        ComponentDto subProject = data.getComponentByUuid(dto.getRootUuid());
+        setNullable(subProject, builder::setSubProjectId, ComponentDto::getId);
       }
+      result.add(builder.build());
     }
     return result;
   }
index bcd8906f3ae4fc891f3dacfb52cc61d61df5347f..ec974e7d86d926ccc7940733089523cc261b9d9c 100644 (file)
@@ -30,6 +30,7 @@ import java.util.Set;
 import javax.annotation.Nullable;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.core.issue.DefaultIssue;
+import org.sonar.core.util.stream.Collectors;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.component.ComponentDto;
@@ -81,6 +82,7 @@ public class SearchResponseLoader {
       loadComments(collector, dbSession, result);
       loadUsers(collector, dbSession, result);
       loadComponents(collector, dbSession, result);
+      loadOrganizations(dbSession, result);
       loadActionsAndTransitions(collector, result);
       completeTotalEffortFromFacet(facets, result);
       return result;
@@ -130,6 +132,17 @@ public class SearchResponseLoader {
     result.addComponents(projects);
   }
 
+  private void loadOrganizations(DbSession dbSession, SearchResponseData result) {
+    Collection<ComponentDto> components = result.getComponents();
+    if (components == null) {
+      return;
+    }
+    dbClient.organizationDao().selectByUuids(
+      dbSession,
+      components.stream().map(ComponentDto::getOrganizationUuid).collect(Collectors.toSet()))
+      .forEach(result::addOrganization);
+  }
+
   private void loadActionsAndTransitions(Collector collector, SearchResponseData result) {
     if (collector.contains(ACTIONS) || collector.contains(TRANSITIONS)) {
       for (IssueDto dto : result.getIssues()) {
index d56656f7ea0b88587c195e4e6318b61cc9d68fc1..95afe917eff8b0ed881708de5ae89e419f51ab0f 100644 (file)
@@ -172,7 +172,7 @@ public class SearchActionMediumTest {
     db.userDao().insert(session, new UserDto().setLogin("john").setName("John"));
     db.userDao().insert(session, new UserDto().setLogin("fabrice").setName("Fabrice").setEmail("fabrice@email.com"));
 
-    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(defaultOrganization, "PROJECT_ID").setKey("PROJECT_KEY"));
+    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(otherOrganization2, "PROJECT_ID").setKey("PROJECT_KEY"));
     setDefaultProjectPermission(project);
     ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, null, "FILE_ID").setKey("FILE_KEY"));
     IssueDto issue = IssueTesting.newDto(newRule(), file, project)
@@ -283,7 +283,7 @@ public class SearchActionMediumTest {
   @Test
   public void issue_on_removed_file() throws Exception {
     RuleDto rule = newRule();
-    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(defaultOrganization, "PROJECT_ID").setKey("PROJECT_KEY"));
+    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(otherOrganization2, "PROJECT_ID").setKey("PROJECT_KEY"));
     setDefaultProjectPermission(project);
     ComponentDto removedFile = insertComponent(ComponentTesting.newFileDto(project, null).setUuid("REMOVED_FILE_ID")
       .setKey("REMOVED_FILE_KEY")
@@ -338,7 +338,7 @@ public class SearchActionMediumTest {
 
   @Test
   public void components_contains_sub_projects() throws Exception {
-    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(defaultOrganization, "PROJECT_ID").setKey("ProjectHavingModule"));
+    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(otherOrganization1, "PROJECT_ID").setKey("ProjectHavingModule"));
     setDefaultProjectPermission(project);
     ComponentDto module = insertComponent(ComponentTesting.newModuleDto(project).setKey("ModuleHavingFile"));
     ComponentDto file = insertComponent(ComponentTesting.newFileDto(module, null, "BCDE").setKey("FileLinkedToModule"));
@@ -377,7 +377,7 @@ public class SearchActionMediumTest {
 
   @Test
   public void display_facets_in_effort_mode() throws Exception {
-    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(defaultOrganization, "PROJECT_ID").setKey("PROJECT_KEY"));
+    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(otherOrganization2, "PROJECT_ID").setKey("PROJECT_KEY"));
     setDefaultProjectPermission(project);
     ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, null, "FILE_ID").setKey("FILE_KEY"));
     IssueDto issue = IssueTesting.newDto(newRule(), file, project)
@@ -560,7 +560,7 @@ public class SearchActionMediumTest {
   @Test
   public void sort_by_updated_at() throws Exception {
     RuleDto rule = newRule();
-    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(defaultOrganization, "PROJECT_ID").setKey("PROJECT_KEY"));
+    ComponentDto project = insertComponent(ComponentTesting.newProjectDto(otherOrganization2, "PROJECT_ID").setKey("PROJECT_KEY"));
     setDefaultProjectPermission(project);
     ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, null, "FILE_ID").setKey("FILE_KEY"));
     db.issueDao().insert(session, IssueTesting.newDto(rule, file, project)
index 294b82ab004da313a90dcf245d47524c8674d406..ca29e4e065eac482de4a0436ff6ea901a38f26df 100644 (file)
@@ -1,6 +1,7 @@
 {
   "issues": [
     {
+      "organization": "my-org-2",
       "key": "7b112bd4-b650-4037-80bc-82fd47d4eac2",
       "component": "FILE_KEY",
       "rule": "xoo:x1",
index 5ff9016c910dc962e2888fb02cb38ddc75760b1b..ff13b0b2e6baddd464ec1b27528e0f3bce68b4d5 100644 (file)
@@ -1,12 +1,15 @@
 {
   "components": [
     {
+      "organization": "my-org-1",
       "key": "FileLinkedToModule"
     },
     {
+      "organization": "my-org-1",
       "key": "ModuleHavingFile"
     },
     {
+      "organization": "my-org-1",
       "key": "ProjectHavingModule"
     }
   ]
index d3f950724f54de688f008917666a0f4f3541770d..daf235d50958067906130b44876952432798a054 100644 (file)
@@ -3,6 +3,7 @@
   "effortTotal": 10,
   "issues": [
     {
+      "organization": "my-org-1",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "component": "FILE_KEY",
       "project": "PROJECT_KEY",
index 2670131b7ec830897e4a2949b3a74161e3eb8cbd..5778db4cb022882d23ed715dcf1ec492cf508408 100644 (file)
@@ -1,6 +1,7 @@
 {
   "issues": [
     {
+      "organization": "my-org-1",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "component": "FILE_KEY",
       "rule": "xoo:x1",
index 9b3fd00c8367800ae38cd360cac8d13a0c60f92d..edf7821dd0c80e3d97d888642a141530c146e7a7 100644 (file)
@@ -2,6 +2,7 @@
   "effortTotal": 10,
   "issues": [
     {
+      "organization": "my-org-2",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "component": "FILE_KEY",
       "project": "PROJECT_KEY",
index 35810d03c73b3fa66d4a195f5fa4120a7d4dca7c..5bbf619ab43b4a588f65e12f0108661d07b226b3 100644 (file)
@@ -1,6 +1,7 @@
 {
   "issues": [
     {
+      "organization": "my-org-1",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "component": "FILE_KEY",
       "project": "PROJECT_KEY",
index 19b781d83e09c6fc9ea62d6e35b942e871723812..cb319e3392878498bb80f856ae74c1e875243864 100644 (file)
@@ -1,6 +1,7 @@
 {
   "issues": [
     {
+      "organization": "my-org-2",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "component": "REMOVED_FILE_KEY",
       "project": "PROJECT_KEY",
   ],
   "components": [
     {
+      "organization": "my-org-2",
       "key": "REMOVED_FILE_KEY",
       "enabled" : false
     },
     {
+      "organization": "my-org-2",
       "key": "PROJECT_KEY",
       "enabled" : true
     }
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_action_plan.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_action_plan.json
deleted file mode 100644 (file)
index 14f7b96..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "issues": [
-    {
-      "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
-      "actionPlan": "AP-ABCD"
-    }
-  ],
-  "actionPlans": [
-    {
-      "key": "AP-ABCD",
-      "name": "1.0",
-      "status": "OPEN",
-      "deadLine": "2014-01-24T19:10:03+0000",
-      "project": "PROJECT_KEY"
-    }
-  ]
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_attributes.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_attributes.json
deleted file mode 100644 (file)
index 0a295c5..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "issues": [
-    {
-      "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
-      "attr": {
-        "jira-issue-key": "SONAR-1234"
-      }
-    }
-  ]
-}
index f88d1338b2778067d5ab96d8be07386f341fe7ca..ccbba305815ecdd76207124b60fde89d44372cfb 100644 (file)
@@ -1,6 +1,7 @@
 {
   "issues": [
     {
+      "organization": "my-org-2",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "rule": "xoo:x1",
       "severity": "MAJOR",
index ab964dfb2411da0547ecc852478e575ec86ebf75..abaebf76bb6d91162c22b7373a3545683ea3fdaa 100644 (file)
@@ -1,6 +1,7 @@
 {
   "issues": [
     {
+      "organization": "my-org-2",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "assignee": "simon",
       "actions": [
index 3e73eee5dbc1baacc56c90ad2437daa71968f467..faac653a9f8b4eb33a424db49254c95a4428b057 100644 (file)
@@ -1,6 +1,7 @@
 {
   "issues": [
     {
+      "organization": "my-org-2",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
       "component": "FILE_KEY",
       "project": "PROJECT_KEY",
@@ -8,6 +9,7 @@
       "updateDate": "2014-11-01T00:00:00+0100"
     },
     {
+      "organization": "my-org-2",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac1",
       "component": "FILE_KEY",
       "project": "PROJECT_KEY",
@@ -15,6 +17,7 @@
       "updateDate": "2014-11-02T00:00:00+0100"
     },
     {
+      "organization": "my-org-2",
       "key": "82fd47d4-b650-4037-80bc-7b112bd4eac3",
       "component": "FILE_KEY",
       "project": "PROJECT_KEY",
index 7c4eef7607ac1a109151e02bd808642e32c7603a..a2d1aa67a2f0a1d676f9a28f7e828729358b2b7c 100644 (file)
@@ -60,6 +60,7 @@ message Operation {
 }
 
 message Issue {
+  optional string organization = 29;
   optional string key = 1;
   optional string rule = 2;
   optional sonarqube.ws.commons.Severity severity = 3;
@@ -170,6 +171,7 @@ message Languages {
 }
 
 message Component {
+  optional string organization = 11;
   optional int64 id = 1;
   optional string key = 2;
   optional string uuid = 3;