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;
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)
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;
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.
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;
}
.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);
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);
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;
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)
.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
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);
}
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);
}
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
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
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\"]}");
}
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\"]}");
}
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\"]}");
}
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\"]}");
}
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\"]}");
}
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());
}
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();
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() {
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");
}
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");
}
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
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