]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9038 make api/issues/tags organization aware
authorDaniel Schwarz <daniel.schwarz@sonarsource.com>
Mon, 3 Apr 2017 16:00:56 +0000 (18:00 +0200)
committerDaniel Schwarz <bartfastiel@users.noreply.github.com>
Fri, 14 Apr 2017 06:57:18 +0000 (08:57 +0200)
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/TagsAction.java
server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/TagsAction.java
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java

index 4706d06a49e992df10c748e10dc8ff32a3adf759..2fce4dcafc5451fb10fe7da581a130b20a11ddd2 100644 (file)
@@ -62,6 +62,7 @@ import org.sonar.api.utils.System2;
 import org.sonar.core.util.NonNullInputFunction;
 import org.sonar.core.util.stream.MoreCollectors;
 import org.sonar.db.component.ComponentDto;
+import org.sonar.db.organization.OrganizationDto;
 import org.sonar.server.es.EsClient;
 import org.sonar.server.es.EsUtils;
 import org.sonar.server.es.SearchOptions;
@@ -590,11 +591,11 @@ public class IssueIndex {
     return value == null ? null : termQuery(field, value);
   }
 
-  public List<String> listTags(String organizationUuid, @Nullable String textQuery, int maxNumberOfTags) {
+  public List<String> listTags(OrganizationDto organization, @Nullable String textQuery, int maxNumberOfTags) {
     SearchRequestBuilder requestBuilder = client
       .prepareSearch(INDEX_TYPE_ISSUE)
       .setQuery(boolQuery()
-        .filter(termQuery(FIELD_ISSUE_ORGANIZATION_UUID, organizationUuid)))
+        .filter(termQuery(FIELD_ISSUE_ORGANIZATION_UUID, organization.getUuid())))
       .setSize(0);
 
     TermsBuilder termsAggregation = AggregationBuilders.terms(AGGREGATION_NAME_FOR_TAGS)
index 9003d4c9c7f76bae8bad1b4a0bacf7eb1266bc38..8bcb6e79ad05756ec0b75778c5c65fd8fc8f8814 100644 (file)
@@ -24,6 +24,7 @@ import com.google.common.collect.Sets;
 import com.google.common.io.Resources;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.SortedSet;
 import javax.annotation.Nullable;
 import org.sonar.api.server.ws.Request;
@@ -32,11 +33,16 @@ import org.sonar.api.server.ws.WebService;
 import org.sonar.api.server.ws.WebService.NewAction;
 import org.sonar.api.server.ws.WebService.Param;
 import org.sonar.api.utils.text.JsonWriter;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+import org.sonar.db.organization.OrganizationDto;
 import org.sonar.server.issue.index.IssueIndex;
 import org.sonar.server.organization.DefaultOrganizationProvider;
 import org.sonar.server.rule.index.RuleIndex;
+import org.sonar.server.ws.WsUtils;
 
 import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
+import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_ORGANIZATION;
 
 /**
  * List issue tags matching a given query.
@@ -46,11 +52,13 @@ public class TagsAction implements IssuesWsAction {
 
   private final IssueIndex issueIndex;
   private final RuleIndex ruleIndex;
+  private final DbClient dbClient;
   private final DefaultOrganizationProvider defaultOrganizationProvider;
 
-  public TagsAction(IssueIndex issueIndex, RuleIndex ruleIndex, DefaultOrganizationProvider defaultOrganizationProvider) {
+  public TagsAction(IssueIndex issueIndex, RuleIndex ruleIndex, DbClient dbClient, DefaultOrganizationProvider defaultOrganizationProvider) {
     this.issueIndex = issueIndex;
     this.ruleIndex = ruleIndex;
+    this.dbClient = dbClient;
     this.defaultOrganizationProvider = defaultOrganizationProvider;
   }
 
@@ -68,19 +76,26 @@ public class TagsAction implements IssuesWsAction {
       .setDescription("The size of the list to return")
       .setExampleValue("25")
       .setDefaultValue("10");
+    action.createParam(PARAM_ORGANIZATION)
+      .setDescription("Organization key")
+      .setRequired(false)
+      .setInternal(true)
+      .setExampleValue("my-org")
+      .setSince("6.4");
   }
 
   @Override
   public void handle(Request request, Response response) throws Exception {
     String query = request.param(Param.TEXT_QUERY);
     int pageSize = request.mandatoryParamAsInt("ps");
-    List<String> tags = listTags(query, pageSize == 0 ? Integer.MAX_VALUE : pageSize);
-    writeTags(response, tags);
+    OrganizationDto organization = getOrganization(request.param(PARAM_ORGANIZATION));
+    List<String> tags = listTags(organization, query, pageSize == 0 ? Integer.MAX_VALUE : pageSize);
+    writeResponse(response, tags);
   }
 
-  private List<String> listTags(@Nullable String textQuery, int pageSize) {
-    Collection<String> issueTags = issueIndex.listTags(defaultOrganizationProvider.get().getUuid(), textQuery, pageSize);
-    Collection<String> ruleTags = ruleIndex.listTags(defaultOrganizationProvider.get().getUuid(), textQuery, pageSize);
+  private List<String> listTags(OrganizationDto organization, @Nullable String textQuery, int pageSize) {
+    Collection<String> issueTags = issueIndex.listTags(organization, textQuery, pageSize);
+    Collection<String> ruleTags = ruleIndex.listTags(organization, textQuery, pageSize);
 
     SortedSet<String> result = Sets.newTreeSet();
     result.addAll(issueTags);
@@ -89,7 +104,17 @@ public class TagsAction implements IssuesWsAction {
     return resultAsList.size() > pageSize && pageSize > 0 ? resultAsList.subList(0, pageSize) : resultAsList;
   }
 
-  private static void writeTags(Response response, List<String> tags) {
+  private OrganizationDto getOrganization(@Nullable String organizationKey) {
+    try (DbSession dbSession = dbClient.openSession(false)) {
+      String organizationOrDefaultKey = Optional.ofNullable(organizationKey)
+        .orElseGet(defaultOrganizationProvider.get()::getKey);
+      return WsUtils.checkFoundWithOptional(
+        dbClient.organizationDao().selectByKey(dbSession, organizationOrDefaultKey),
+        "No organization with key '%s'", organizationOrDefaultKey);
+    }
+  }
+
+  private static void writeResponse(Response response, List<String> tags) {
     try (JsonWriter json = response.newJsonWriter()) {
       json.beginObject().name("tags").beginArray();
       tags.forEach(json::value);
index b05bcecfa25c0c79384c1a71642d24cd43889ef3..d129e0ec639d2f2bccbb52306faf4442f1e49941 100644 (file)
@@ -59,6 +59,7 @@ import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.rule.Severity;
 import org.sonar.api.rules.RuleType;
+import org.sonar.db.organization.OrganizationDto;
 import org.sonar.server.es.EsClient;
 import org.sonar.server.es.EsUtils;
 import org.sonar.server.es.SearchIdResult;
@@ -524,11 +525,11 @@ public class RuleIndex {
     return terms;
   }
 
-  public Set<String> listTags(String organizationUuid, @Nullable String query, int size) {
+  public Set<String> listTags(OrganizationDto organization, @Nullable String query, int size) {
     TermsQueryBuilder scopeFilter = QueryBuilders.termsQuery(
       FIELD_RULE_EXTENSION_SCOPE,
       RuleExtensionScope.system().getScope(),
-      RuleExtensionScope.organization(organizationUuid).getScope());
+      RuleExtensionScope.organization(organization).getScope());
 
     TermsBuilder termsAggregation = AggregationBuilders.terms(AGGREGATION_NAME_FOR_TAGS)
       .field(FIELD_RULE_EXTENSION_TAGS)
index 1d9fe56726600cc1b4305b9c2eb5f593593574a7..9ec9b53e8788ef56105b4160b8f479bec1a3c908 100644 (file)
@@ -66,14 +66,12 @@ public class TagsAction implements RulesWsAction {
       .setDescription("The size of the list to return, 0 for all tags")
       .setExampleValue("25")
       .setDefaultValue("0");
-    action
-      .createParam(PARAM_ORGANIZATION)
+    action.createParam(PARAM_ORGANIZATION)
       .setDescription("Organization key")
       .setRequired(false)
       .setInternal(true)
       .setExampleValue("my-org")
       .setSince("6.4");
-
   }
 
   @Override
@@ -82,7 +80,7 @@ public class TagsAction implements RulesWsAction {
     String query = request.param(Param.TEXT_QUERY);
     int pageSize = request.mandatoryParamAsInt("ps");
 
-    Set<String> tags = ruleIndex.listTags(organization.getUuid(), query, pageSize == 0 ? Integer.MAX_VALUE : pageSize);
+    Set<String> tags = ruleIndex.listTags(organization, query, pageSize == 0 ? Integer.MAX_VALUE : pageSize);
 
     writeResponse(response, tags);
   }
@@ -91,7 +89,7 @@ public class TagsAction implements RulesWsAction {
     try (DbSession dbSession = dbClient.openSession(false)) {
       String organizationOrDefaultKey = Optional.ofNullable(organizationKey)
         .orElseGet(defaultOrganizationProvider.get()::getKey);
-      return  WsUtils.checkFoundWithOptional(
+      return WsUtils.checkFoundWithOptional(
         dbClient.organizationDao().selectByKey(dbSession, organizationOrDefaultKey),
         "No organization with key '%s'", organizationOrDefaultKey);
     }
index 9791f02b614bb5d3378038ef5ee3f0c7e280fb40..2e1525e956d8fc341367b22b9d188e16ff85c42c 100644 (file)
@@ -1342,12 +1342,12 @@ public class IssueIndexTest {
       newDoc("ISSUE3", file).setOrganizationUuid(org.getUuid()).setRuleKey(r2.getKey().toString()),
       newDoc("ISSUE4", file).setOrganizationUuid(org.getUuid()).setRuleKey(r1.getKey().toString()).setTags(of("convention")));
 
-    assertThat(underTest.listTags(org.getUuid(), null, Integer.MAX_VALUE)).containsOnly("convention", "java8", "bug");
-    assertThat(underTest.listTags(org.getUuid(), null, 2)).containsOnly("bug", "convention");
-    assertThat(underTest.listTags(org.getUuid(), "vent", Integer.MAX_VALUE)).containsOnly("convention");
-    assertThat(underTest.listTags(org.getUuid(), null, 1)).containsOnly("bug");
-    assertThat(underTest.listTags(org.getUuid(), null, Integer.MAX_VALUE)).containsOnly("convention", "java8", "bug");
-    assertThat(underTest.listTags(org.getUuid(), "invalidRegexp[", Integer.MAX_VALUE)).isEmpty();
+    assertThat(underTest.listTags(org, null, Integer.MAX_VALUE)).containsOnly("convention", "java8", "bug");
+    assertThat(underTest.listTags(org, null, 2)).containsOnly("bug", "convention");
+    assertThat(underTest.listTags(org, "vent", Integer.MAX_VALUE)).containsOnly("convention");
+    assertThat(underTest.listTags(org, null, 1)).containsOnly("bug");
+    assertThat(underTest.listTags(org, null, Integer.MAX_VALUE)).containsOnly("convention", "java8", "bug");
+    assertThat(underTest.listTags(org, "invalidRegexp[", Integer.MAX_VALUE)).isEmpty();
   }
 
   @Test
index 194ced26a8b8bdeb91d9d1d0e3ab4742c70a4a84..2a3d61a577f1661914c494e786675d4e1cde51b4 100644 (file)
@@ -67,12 +67,12 @@ public class TagsActionTest {
   private IssueIndex issueIndex = new IssueIndex(es.client(), System2.INSTANCE, userSession, new AuthorizationTypeSupport(userSession));
   private RuleIndex ruleIndex = new RuleIndex(es.client());
 
-  private WsActionTester tester = new WsActionTester(new TagsAction(issueIndex, ruleIndex, TestDefaultOrganizationProvider.from(db)));
+  private WsActionTester tester = new WsActionTester(new TagsAction(issueIndex, ruleIndex, db.getDbClient(), TestDefaultOrganizationProvider.from(db)));
   private OrganizationDto organization;
 
   @Before
   public void before() {
-    organization = db.getDefaultOrganization();
+    organization = db.organizations().insert();
   }
 
   @Test
@@ -81,7 +81,9 @@ public class TagsActionTest {
     insertIssueWithBrowsePermission(insertRuleWithoutTags(), "tag3", "tag4", "tag5");
     issueIndexer.indexOnStartup(null);
 
-    String result = tester.newRequest().execute().getInput();
+    String result = tester.newRequest()
+      .setParam("organization", organization.getKey())
+      .execute().getInput();
     assertJson(result).isSimilarTo("{\"tags\":[\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]}");
   }
 
@@ -97,7 +99,9 @@ public class TagsActionTest {
     db.rules().insertOrUpdateMetadata(r2, organization, setTags("tag4", "tag5"));
     ruleIndexer.indexRuleExtension(organization, r2.getKey());
 
-    String result = tester.newRequest().execute().getInput();
+    String result = tester.newRequest()
+      .setParam("organization", organization.getKey())
+      .execute().getInput();
     assertJson(result).isSimilarTo("{\"tags\":[\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]}");
   }
 
@@ -112,7 +116,9 @@ public class TagsActionTest {
     db.rules().insertOrUpdateMetadata(r, organization, setTags("tag7"));
     ruleIndexer.indexRuleExtension(organization, r.getKey());
 
-    String result = tester.newRequest().execute().getInput();
+    String result = tester.newRequest()
+      .setParam("organization", organization.getKey())
+      .execute().getInput();
     assertJson(result).isSimilarTo("{\"tags\":[\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\", \"tag6\", \"tag7\"]}");
   }
 
@@ -122,7 +128,10 @@ public class TagsActionTest {
     insertIssueWithBrowsePermission(insertRuleWithoutTags(), "tag3", "tag4", "tag5");
     issueIndexer.indexOnStartup(null);
 
-    String result = tester.newRequest().setParam("ps", "2").execute().getInput();
+    String result = tester.newRequest()
+      .setParam("ps", "2")
+      .setParam("organization", organization.getKey())
+      .execute().getInput();
     assertJson(result).isSimilarTo("{\"tags\":[\"tag1\", \"tag2\"]}");
   }
 
@@ -132,7 +141,10 @@ public class TagsActionTest {
     insertIssueWithBrowsePermission(insertRuleWithoutTags(), "tag12", "tag4", "tag5");
     issueIndexer.indexOnStartup(null);
 
-    String result = tester.newRequest().setParam("q", "ag1").execute().getInput();
+    String result = tester.newRequest()
+      .setParam("q", "ag1")
+      .setParam("organization", organization.getKey())
+      .execute().getInput();
     assertJson(result).isSimilarTo("{\"tags\":[\"tag1\", \"tag12\"]}");
   }
 
@@ -152,7 +164,9 @@ public class TagsActionTest {
     db.rules().insertOrUpdateMetadata(r, organization, setTags("security"));
     ruleIndexer.indexRuleExtension(organization, r.getKey());
 
-    String result = tester.newRequest().execute().getInput();
+    String result = tester.newRequest()
+      .setParam("organization", organization.getKey())
+      .execute().getInput();
     assertJson(result).isSimilarTo(tester.getDef().responseExampleAsString());
   }
 
@@ -163,7 +177,7 @@ public class TagsActionTest {
     assertThat(action.responseExampleAsString()).isNotEmpty();
     assertThat(action.isPost()).isFalse();
     assertThat(action.isInternal()).isFalse();
-    assertThat(action.params()).hasSize(2);
+    assertThat(action.params()).extracting(Param::key).containsExactlyInAnyOrder("q", "ps", "organization");
 
     Param query = action.param("q");
     assertThat(query).isNotNull();
@@ -177,6 +191,14 @@ public class TagsActionTest {
     assertThat(pageSize.defaultValue()).isEqualTo("10");
     assertThat(pageSize.description()).isNotEmpty();
     assertThat(pageSize.exampleValue()).isNotEmpty();
+
+    Param organization = action.param("organization");
+    assertThat(organization).isNotNull();
+    assertThat(organization.isRequired()).isFalse();
+    assertThat(organization.description()).isNotEmpty();
+    assertThat(organization.exampleValue()).isNotEmpty();
+    assertThat(organization.isInternal()).isTrue();
+    assertThat(organization.since()).isEqualTo("6.4");
   }
 
   private RuleDefinitionDto insertRuleWithoutTags() {
index 54fd2cb50f48e72d2833b79846ec7cdad8b79084..9232edb82695d24af9d7e789508aaff672047393 100644 (file)
@@ -208,7 +208,7 @@ public class RuleUpdaterMediumTest {
     assertThat(rule.getSystemTags()).containsOnly("java8", "javadoc");
 
     // verify that tags are indexed in index
-    Set<String> tags = ruleIndex.listTags(defaultOrganization.getUuid(), null, 10);
+    Set<String> tags = ruleIndex.listTags(defaultOrganization, null, 10);
     assertThat(tags).containsOnly("bug", "java8", "javadoc");
   }
 
@@ -230,7 +230,7 @@ public class RuleUpdaterMediumTest {
     assertThat(rule.getSystemTags()).containsOnly("java8", "javadoc");
 
     // verify that tags are indexed in index
-    Set<String> tags = ruleIndex.listTags(defaultOrganization.getUuid(), null, 10);
+    Set<String> tags = ruleIndex.listTags(defaultOrganization, null, 10);
     assertThat(tags).containsOnly("java8", "javadoc");
   }
 
index e92e08a4e152093b106cd9b3cd631b8b96525f7e..80d91df94250bc564e54e0004f5803e990eb952a 100644 (file)
@@ -582,7 +582,7 @@ public class RuleIndexTest {
       setOrganizationUuid(organization.getUuid()),
       setTags("tag2"));
 
-    assertThat(index.listTags(organization.getUuid(), null, 10)).containsOnly("tag1", "tag2", "sys1", "sys2");
+    assertThat(index.listTags(organization, null, 10)).containsOnly("tag1", "tag2", "sys1", "sys2");
   }
 
   @Test
@@ -599,8 +599,8 @@ public class RuleIndexTest {
       setOrganizationUuid(organization2.getUuid()),
       setTags("tag2"));
 
-    assertThat(index.listTags(organization1.getUuid(), null, 10)).containsOnly("tag1", "sys1", "sys2");
-    assertThat(index.listTags(organization2.getUuid(), null, 10)).containsOnly("tag2", "sys1", "sys2");
+    assertThat(index.listTags(organization1, null, 10)).containsOnly("tag1", "sys1", "sys2");
+    assertThat(index.listTags(organization2, null, 10)).containsOnly("tag2", "sys1", "sys2");
   }
 
   @Test