diff options
author | Pierre <pierre.guillot@sonarsource.com> | 2020-09-24 14:21:10 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2020-10-05 20:07:42 +0000 |
commit | 13d76f2a2c2e5b42b3d74bf1ad0c4dbbeca14608 (patch) | |
tree | ce8c16540053ae25ed9ad8b31072ba204a4a34fc /server/sonar-server-common | |
parent | 68c364f416ced3893457300257c1c5df1eef8ce7 (diff) | |
download | sonarqube-13d76f2a2c2e5b42b3d74bf1ad0c4dbbeca14608.tar.gz sonarqube-13d76f2a2c2e5b42b3d74bf1ad0c4dbbeca14608.zip |
SONAR-13903 Remove use of organizations in Quality Profiles and Active Rules
Diffstat (limited to 'server/sonar-server-common')
17 files changed, 91 insertions, 494 deletions
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/es/BulkIndexer.java b/server/sonar-server-common/src/main/java/org/sonar/server/es/BulkIndexer.java index 66afd4feda8..115887d2a7e 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/es/BulkIndexer.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/es/BulkIndexer.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; @@ -288,21 +289,12 @@ public class BulkIndexer { return false; } BulkRequestKey that = (BulkRequestKey) o; - if (!docType.equals(that.docType)) { - return false; - } - if (!index.equals(that.index)) { - return false; - } - return requestType.equals(that.requestType); + return Objects.equals(docType, that.docType) && Objects.equals(index, that.index) && Objects.equals(requestType, that.requestType); } @Override public int hashCode() { - int result = requestType.hashCode(); - result = 31 * result + index.hashCode(); - result = 31 * result + docType.hashCode(); - return result; + return Objects.hash(requestType, index, docType); } @Override diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/es/EsClient.java b/server/sonar-server-common/src/main/java/org/sonar/server/es/EsClient.java index 903f8f4dca8..87d32d64f5a 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/es/EsClient.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/es/EsClient.java @@ -126,7 +126,8 @@ public class EsClient implements Closeable { return new ProxySearchRequestBuilder(nativeClient()).setIndices(index.getName()); } - public SearchRequestBuilder prepareSearch(IndexMainType indexType) { + public SearchRequestBuilder + prepareSearch(IndexMainType indexType) { return new ProxySearchRequestBuilder(nativeClient()) .setIndices(indexType.getIndex().getName()) .setTypes(indexType.getType()); diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/organization/DefaultOrganizationProviderImpl.java b/server/sonar-server-common/src/main/java/org/sonar/server/organization/DefaultOrganizationProviderImpl.java index 3b958ef838b..207913fe827 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/organization/DefaultOrganizationProviderImpl.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/organization/DefaultOrganizationProviderImpl.java @@ -44,7 +44,7 @@ public class DefaultOrganizationProviderImpl implements DefaultOrganizationProvi return cache; } - private static DefaultOrganization getDefaultOrganization(DbClient dbClient) { + public static DefaultOrganization getDefaultOrganization(DbClient dbClient) { try (DbSession dbSession = dbClient.openSession(false)) { Optional<String> uuid = dbClient.internalPropertiesDao().selectByKey(dbSession, InternalProperties.DEFAULT_ORGANIZATION); checkState(uuid.isPresent() && !uuid.get().isEmpty(), "No Default organization uuid configured"); diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java index 1b4752ab9c4..ab64116df6a 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java @@ -54,12 +54,10 @@ public class DefaultRuleFinder implements ServerRuleFinder { private final DbClient dbClient; private final RuleDao ruleDao; - private final DefaultOrganizationProvider defaultOrganizationProvider; - public DefaultRuleFinder(DbClient dbClient, DefaultOrganizationProvider defaultOrganizationProvider) { + public DefaultRuleFinder(DbClient dbClient) { this.dbClient = dbClient; this.ruleDao = dbClient.ruleDao(); - this.defaultOrganizationProvider = defaultOrganizationProvider; } @Override @@ -78,10 +76,7 @@ public class DefaultRuleFinder implements ServerRuleFinder { @CheckForNull public org.sonar.api.rules.Rule findByKey(RuleKey key) { try (DbSession dbSession = dbClient.openSession(false)) { - String defaultOrganizationUuid = defaultOrganizationProvider.get().getUuid(); - OrganizationDto defaultOrganization = dbClient.organizationDao().selectByUuid(dbSession, defaultOrganizationUuid) - .orElseThrow(() -> new IllegalStateException(String.format("Cannot find default organization '%s'", defaultOrganizationUuid))); - Optional<RuleDto> rule = ruleDao.selectByKey(dbSession, defaultOrganization.getUuid(), key); + Optional<RuleDto> rule = ruleDao.selectByKey(dbSession, key); if (rule.isPresent() && rule.get().getStatus() != RuleStatus.REMOVED) { return toRule(rule.get(), ruleDao.selectRuleParamsByRuleKey(dbSession, rule.get().getKey())); } else { @@ -99,7 +94,7 @@ public class DefaultRuleFinder implements ServerRuleFinder { @Override public final org.sonar.api.rules.Rule find(org.sonar.api.rules.RuleQuery query) { try (DbSession dbSession = dbClient.openSession(false)) { - List<RuleDto> rules = ruleDao.selectByQuery(dbSession, defaultOrganizationProvider.get().getUuid(), query); + List<RuleDto> rules = ruleDao.selectByQuery(dbSession, query); if (!rules.isEmpty()) { RuleDto rule = rules.get(0); return toRule(rule, ruleDao.selectRuleParamsByRuleKey(dbSession, rule.getKey())); @@ -111,7 +106,7 @@ public class DefaultRuleFinder implements ServerRuleFinder { @Override public final Collection<org.sonar.api.rules.Rule> findAll(org.sonar.api.rules.RuleQuery query) { try (DbSession dbSession = dbClient.openSession(false)) { - List<RuleDto> rules = ruleDao.selectByQuery(dbSession, defaultOrganizationProvider.get().getUuid(), query); + List<RuleDto> rules = ruleDao.selectByQuery(dbSession, query); if (rules.isEmpty()) { return Collections.emptyList(); } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java index ab65bcb66b8..970f42b73c8 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java @@ -21,10 +21,12 @@ package org.sonar.server.rule.index; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.Set; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.apache.commons.lang.builder.ReflectionToStringBuilder; @@ -196,6 +198,15 @@ public class RuleDoc extends BaseDoc { return this; } + public Set<String> getTags() { + return getField(RuleIndexDefinition.FIELD_RULE_TAGS); + } + + public RuleDoc setTags(Set<String> tags) { + setField(RuleIndexDefinition.FIELD_RULE_TAGS, tags); + return this; + } + @CheckForNull public RuleStatus status() { return RuleStatus.valueOf(getField(RuleIndexDefinition.FIELD_RULE_STATUS)); @@ -287,6 +298,7 @@ public class RuleDoc extends BaseDoc { .setStatus(dto.getStatus().toString()) .setType(dto.getTypeAsRuleType()) .setCreatedAt(dto.getCreatedAt()) + .setTags(Sets.union(dto.getTags(), dto.getSystemTags())) .setUpdatedAt(dto.getUpdatedAt()); if (dto.getTemplateRuleKey() != null && dto.getTemplateRepository() != null) { diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java deleted file mode 100644 index 361f9120c5c..00000000000 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleExtensionDoc.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2020 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.rule.index; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.sonar.db.rule.RuleExtensionForIndexingDto; -import org.sonar.db.rule.RuleForIndexingDto; -import org.sonar.server.es.BaseDoc; - -import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE_EXTENSION; - -public class RuleExtensionDoc extends BaseDoc { - - public RuleExtensionDoc(Map<String, Object> fields) { - super(TYPE_RULE_EXTENSION, fields); - } - - public RuleExtensionDoc() { - super(TYPE_RULE_EXTENSION, new HashMap<>(4)); - } - - @Override - public String getId() { - return idOf(getRuleUuid(), getScope()); - } - - public String getRuleUuid() { - return ruleUuidAsString(); - } - - private String ruleUuidAsString() { - return getField(RuleIndexDefinition.FIELD_RULE_UUID); - } - - public RuleExtensionDoc setRuleUuid(String ruleUuid) { - String parent = ruleUuid; - setField(RuleIndexDefinition.FIELD_RULE_UUID, parent); - setParent(parent); - return this; - } - - public RuleExtensionScope getScope() { - return RuleExtensionScope.parse(getField(RuleIndexDefinition.FIELD_RULE_EXTENSION_SCOPE)); - } - - public RuleExtensionDoc setScope(RuleExtensionScope scope) { - setField(RuleIndexDefinition.FIELD_RULE_EXTENSION_SCOPE, scope.getScope()); - return this; - } - - public Set<String> getTags() { - return getField(RuleIndexDefinition.FIELD_RULE_EXTENSION_TAGS); - } - - public RuleExtensionDoc setTags(Set<String> tags) { - setField(RuleIndexDefinition.FIELD_RULE_EXTENSION_TAGS, tags); - return this; - } - - public static RuleExtensionDoc of(RuleForIndexingDto rule) { - return new RuleExtensionDoc() - .setRuleUuid(rule.getUuid()) - .setScope(RuleExtensionScope.system()) - .setTags(rule.getSystemTags()); - } - - public static RuleExtensionDoc of(RuleExtensionForIndexingDto rule) { - return new RuleExtensionDoc() - .setRuleUuid(rule.getRuleUuid()) - .setScope(RuleExtensionScope.organization(rule.getOrganizationUuid())) - .setTags(rule.getTagsAsSet()); - } - - public static String idOf(String ruleUuid, RuleExtensionScope scope) { - return ruleUuid + "|" + scope.getScope(); - } - - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this); - } -} diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleExtensionScope.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleExtensionScope.java deleted file mode 100644 index 919046bdf02..00000000000 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleExtensionScope.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2020 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.rule.index; - -import java.util.Optional; -import javax.annotation.Nullable; -import org.sonar.db.organization.OrganizationDto; - -import static com.google.common.base.Preconditions.checkArgument; - -public class RuleExtensionScope { - - private static final String FAKE_UUID_FOR_SYSTEM = "system"; - - private final Optional<String> organizationUuid; - - private RuleExtensionScope(@Nullable String organizationUuid) { - this.organizationUuid = Optional.ofNullable(organizationUuid); - } - - public static RuleExtensionScope system() { - return new RuleExtensionScope(null); - } - - public static RuleExtensionScope organization(OrganizationDto organization) { - return organization(organization.getUuid()); - } - - public static RuleExtensionScope organization(String organizationUuid) { - checkArgument(!FAKE_UUID_FOR_SYSTEM.equals(organizationUuid), "The organization uuid '%s' is reserved for to store system tags in the rules index.", FAKE_UUID_FOR_SYSTEM); - return new RuleExtensionScope(organizationUuid); - } - - public String getScope() { - return organizationUuid.orElse(FAKE_UUID_FOR_SYSTEM); - } - - public static RuleExtensionScope parse(String scope) { - if (FAKE_UUID_FOR_SYSTEM.equals(scope)) { - return system(); - } - return new RuleExtensionScope(scope); - } -} diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java index fa61b365c6b..e30b69aed3c 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java @@ -20,7 +20,6 @@ package org.sonar.server.rule.index; import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -39,14 +38,12 @@ import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.Operator; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.TermsQueryBuilder; import org.elasticsearch.join.aggregations.JoinAggregationBuilders; import org.elasticsearch.join.query.HasParentQueryBuilder; import org.elasticsearch.join.query.JoinQueryBuilders; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.terms.IncludeExclude; import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import org.elasticsearch.search.sort.FieldSortBuilder; @@ -57,7 +54,6 @@ import org.sonar.api.rule.Severity; import org.sonar.api.rules.RuleType; import org.sonar.api.utils.System2; import org.sonar.core.util.stream.MoreCollectors; -import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.server.es.EsClient; import org.sonar.server.es.EsUtils; @@ -93,8 +89,6 @@ import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_ACTIVE_RULE_ import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_ACTIVE_RULE_SEVERITY; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_CREATED_AT; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_CWE; -import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_EXTENSION_SCOPE; -import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_EXTENSION_TAGS; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_HTML_DESCRIPTION; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_INTERNAL_KEY; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_IS_EXTERNAL; @@ -109,12 +103,12 @@ import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_SANS_TO import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_SEVERITY; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_SONARSOURCE_SECURITY; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_STATUS; +import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_TAGS; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_TEMPLATE_KEY; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_TYPE; import static org.sonar.server.rule.index.RuleIndexDefinition.FIELD_RULE_UPDATED_AT; import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_ACTIVE_RULE; import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE; -import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE_EXTENSION; /** * The unique entry-point to interact with Elasticsearch index "rules". @@ -153,8 +147,7 @@ public class RuleIndex { } public SearchIdResult<String> search(RuleQuery query, SearchOptions options) { - SearchRequestBuilder esSearch = client - .prepareSearch(TYPE_RULE); + SearchRequestBuilder esSearch = client.prepareSearch(TYPE_RULE); QueryBuilder qb = buildQuery(query); Map<String, QueryBuilder> filters = buildFilters(query); @@ -216,13 +209,13 @@ public class RuleIndex { BoolQueryBuilder textQuery = boolQuery(); JavaTokenizer.split(queryString) .stream().map(token -> boolQuery().should( - matchQuery( - SEARCH_GRAMS_ANALYZER.subField(FIELD_RULE_NAME), - StringUtils.left(token, DefaultIndexSettings.MAXIMUM_NGRAM_LENGTH)).boost(20f)) - .should( - matchPhraseQuery( - ENGLISH_HTML_ANALYZER.subField(FIELD_RULE_HTML_DESCRIPTION), - token).boost(3f))) + matchQuery( + SEARCH_GRAMS_ANALYZER.subField(FIELD_RULE_NAME), + StringUtils.left(token, DefaultIndexSettings.MAXIMUM_NGRAM_LENGTH)).boost(20f)) + .should( + matchPhraseQuery( + ENGLISH_HTML_ANALYZER.subField(FIELD_RULE_HTML_DESCRIPTION), + token).boost(3f))) .forEach(textQuery::must); qb.should(textQuery.boost(20f)); } @@ -316,8 +309,7 @@ public class RuleIndex { } if (isNotEmpty(query.getTags())) { - filters.put(FIELD_RULE_EXTENSION_TAGS, - buildTagsFilter(query.getTags(), query.getOrganization())); + filters.put(FIELD_RULE_TAGS, buildTagsFilter(query.getTags())); } Collection<RuleType> types = query.getTypes(); @@ -387,14 +379,11 @@ public class RuleIndex { return filters; } - private static BoolQueryBuilder buildTagsFilter(Collection<String> tags, OrganizationDto organization) { + private static BoolQueryBuilder buildTagsFilter(Collection<String> tags) { BoolQueryBuilder q = boolQuery(); - tags.stream() - .map(tag -> boolQuery() - .filter(QueryBuilders.termQuery(FIELD_RULE_EXTENSION_TAGS, tag)) - .filter(termsQuery(FIELD_RULE_EXTENSION_SCOPE, RuleExtensionScope.system().getScope(), RuleExtensionScope.organization(organization).getScope()))) - .map(childQuery -> JoinQueryBuilders.hasChildQuery(TYPE_RULE_EXTENSION.getName(), childQuery, ScoreMode.None)) - .forEach(q::should); + for (String tag : tags) { + q.should(boolQuery().filter(QueryBuilders.termQuery(FIELD_RULE_TAGS, tag))); + } return q; } @@ -460,23 +449,8 @@ public class RuleIndex { } if (options.getFacets().contains(FACET_TAGS) || options.getFacets().contains(FACET_OLD_DEFAULT)) { Collection<String> tags = query.getTags(); - checkArgument(query.getOrganization() != null, "Cannot use tags facet, if no organization is specified.", query.getTags()); - - Function<TermsAggregationBuilder, AggregationBuilder> childFeature = termsAggregation -> { - - FilterAggregationBuilder scopeAggregation = AggregationBuilders.filter( - "scope_filter_for_" + FACET_TAGS, - termsQuery(FIELD_RULE_EXTENSION_SCOPE, - RuleExtensionScope.system().getScope(), - RuleExtensionScope.organization(query.getOrganization()).getScope())) - .subAggregation(termsAggregation); - - return JoinAggregationBuilders.children("children_for_" + termsAggregation.getName(), TYPE_RULE_EXTENSION.getName()) - .subAggregation(scopeAggregation); - }; - aggregations.put(FACET_TAGS, - stickyFacetBuilder.buildStickyFacet(FIELD_RULE_EXTENSION_TAGS, FACET_TAGS, MAX_FACET_SIZE, childFeature, + stickyFacetBuilder.buildStickyFacet(FIELD_RULE_TAGS, FACET_TAGS, MAX_FACET_SIZE, (tags == null) ? (new String[0]) : tags.toArray())); } if (options.getFacets().contains(FACET_TYPES)) { @@ -619,24 +593,15 @@ public class RuleIndex { esSearch.setSize(options.getLimit()); } - public List<String> listTags(@Nullable OrganizationDto organization, @Nullable String query, int size) { + public List<String> listTags(@Nullable String query, int size) { int maxPageSize = 500; checkArgument(size <= maxPageSize, "Page size must be lower than or equals to " + maxPageSize); if (size <= 0) { return emptyList(); } - ImmutableList.Builder<String> scopes = ImmutableList.<String>builder() - .add(RuleExtensionScope.system().getScope()); - if (organization != null) { - scopes.add(RuleExtensionScope.organization(organization).getScope()); - } - TermsQueryBuilder scopeFilter = QueryBuilders.termsQuery( - FIELD_RULE_EXTENSION_SCOPE, - scopes.build().toArray(new String[0])); - TermsAggregationBuilder termsAggregation = AggregationBuilders.terms(AGGREGATION_NAME_FOR_TAGS) - .field(FIELD_RULE_EXTENSION_TAGS) + .field(FIELD_RULE_TAGS) .size(size) .order(BucketOrder.key(true)) .minDocCount(1); @@ -647,8 +612,8 @@ public class RuleIndex { .ifPresent(termsAggregation::includeExclude); SearchRequestBuilder request = client - .prepareSearch(TYPE_RULE_EXTENSION.getMainType()) - .setQuery(boolQuery().filter(scopeFilter)) + .prepareSearch(TYPE_RULE.getMainType()) + .setQuery(matchAllQuery()) .setSize(0) .addAggregation(termsAggregation); @@ -656,7 +621,7 @@ public class RuleIndex { return EsUtils.termsKeys(esResponse.getAggregations().get(AGGREGATION_NAME_FOR_TAGS)); } - private static boolean isNotEmpty(@Nullable Collection list) { + private static boolean isNotEmpty(@Nullable Collection<?> list) { return list != null && !list.isEmpty(); } } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java index daf8a1a1cd0..e6893a77ca0 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java @@ -64,6 +64,7 @@ public class RuleIndexDefinition implements IndexDefinition { public static final String FIELD_RULE_OWASP_TOP_10 = "owaspTop10"; public static final String FIELD_RULE_SANS_TOP_25 = "sansTop25"; public static final String FIELD_RULE_SONARSOURCE_SECURITY = "sonarsourceSecurity"; + public static final String FIELD_RULE_TAGS = "tags"; public static final Set<String> SORT_FIELDS = ImmutableSet.of( FIELD_RULE_NAME, @@ -71,14 +72,6 @@ public class RuleIndexDefinition implements IndexDefinition { FIELD_RULE_CREATED_AT, FIELD_RULE_KEY); - // Rule extension fields - public static final IndexRelationType TYPE_RULE_EXTENSION = IndexType.relation(TYPE_RULE, "ruleExtension"); - /** - * The uuid of a {@link RuleExtensionScope} - */ - public static final String FIELD_RULE_EXTENSION_SCOPE = "ruleExt_scope"; - public static final String FIELD_RULE_EXTENSION_TAGS = "ruleExt_tags"; - // Active rule fields public static final IndexRelationType TYPE_ACTIVE_RULE = IndexType.relation(TYPE_RULE, "activeRule"); public static final String FIELD_ACTIVE_RULE_UUID = "activeRule_uuid"; @@ -137,6 +130,7 @@ public class RuleIndexDefinition implements IndexDefinition { ruleMapping.keywordFieldBuilder(FIELD_RULE_SEVERITY).disableNorms().build(); ruleMapping.keywordFieldBuilder(FIELD_RULE_STATUS).disableNorms().build(); ruleMapping.keywordFieldBuilder(FIELD_RULE_LANGUAGE).disableNorms().build(); + ruleMapping.keywordFieldBuilder(FIELD_RULE_TAGS).build(); ruleMapping.createBooleanField(FIELD_RULE_IS_TEMPLATE); ruleMapping.createBooleanField(FIELD_RULE_IS_EXTERNAL); @@ -158,10 +152,5 @@ public class RuleIndexDefinition implements IndexDefinition { .keywordFieldBuilder(FIELD_ACTIVE_RULE_PROFILE_UUID).disableNorms().build() .keywordFieldBuilder(FIELD_ACTIVE_RULE_INHERITANCE).disableNorms().build() .keywordFieldBuilder(FIELD_ACTIVE_RULE_SEVERITY).disableNorms().build(); - - // Rule extension - index.createTypeMapping(TYPE_RULE_EXTENSION) - .keywordFieldBuilder(FIELD_RULE_EXTENSION_SCOPE).disableNorms().build() - .keywordFieldBuilder(FIELD_RULE_EXTENSION_TAGS).build(); } } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexer.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexer.java index e7447d060f8..3ac59206b3c 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexer.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndexer.java @@ -33,8 +33,6 @@ import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.es.EsQueueDto; -import org.sonar.db.es.RuleExtensionId; -import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleForIndexingDto; import org.sonar.server.es.BulkIndexer; import org.sonar.server.es.BulkIndexer.Size; @@ -47,14 +45,11 @@ import org.sonar.server.es.ResilientIndexer; import org.sonar.server.rule.HotspotRuleDescription; import org.sonar.server.security.SecurityStandards; -import static com.google.common.base.Preconditions.checkArgument; import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; import static java.util.stream.Collectors.joining; import static java.util.stream.Stream.concat; import static org.sonar.core.util.stream.MoreCollectors.toHashSet; import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE; -import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE_EXTENSION; import static org.sonar.server.security.SecurityStandards.SQ_CATEGORY_KEYS_ORDERING; public class RuleIndexer implements ResilientIndexer { @@ -70,7 +65,7 @@ public class RuleIndexer implements ResilientIndexer { @Override public Set<IndexType> getIndexTypes() { - return ImmutableSet.of(TYPE_RULE, TYPE_RULE_EXTENSION); + return ImmutableSet.of(TYPE_RULE); } @Override @@ -79,27 +74,15 @@ public class RuleIndexer implements ResilientIndexer { BulkIndexer bulk = createBulkIndexer(Size.LARGE, IndexingListener.FAIL_ON_ERROR); bulk.start(); - // index all definitions and system extensions + // index all definitions if (uninitializedIndexTypes.contains(TYPE_RULE)) { - dbClient.ruleDao().scrollIndexingRules(dbSession, dto -> { - bulk.add(ruleDocOf(dto).toIndexRequest()); - bulk.add(RuleExtensionDoc.of(dto).toIndexRequest()); - }); - } - - // index all organization extensions - if (uninitializedIndexTypes.contains(TYPE_RULE_EXTENSION)) { - dbClient.ruleDao().scrollIndexingRuleExtensions(dbSession, dto -> bulk.add(RuleExtensionDoc.of(dto).toIndexRequest())); + dbClient.ruleDao().scrollIndexingRules(dbSession, dto -> bulk.add(ruleDocOf(dto).toIndexRequest())); } bulk.stop(); } } - public void commitAndIndex(DbSession dbSession, String ruleUuid) { - commitAndIndex(dbSession, singletonList(ruleUuid)); - } - public void commitAndIndex(DbSession dbSession, Collection<String> ruleUuids) { List<EsQueueDto> items = ruleUuids.stream() .map(RuleIndexer::createQueueDtoForRule) @@ -113,8 +96,8 @@ public class RuleIndexer implements ResilientIndexer { /** * Commit a change on a rule and its extension on the given organization */ - public void commitAndIndex(DbSession dbSession, String ruleUuid, OrganizationDto organization) { - List<EsQueueDto> items = asList(createQueueDtoForRule(ruleUuid), createQueueDtoForRuleExtension(ruleUuid, organization)); + public void commitAndIndex(DbSession dbSession, String ruleUuid) { + List<EsQueueDto> items = asList(createQueueDtoForRule(ruleUuid)); dbClient.esQueueDao().insert(dbSession, items); dbSession.commit(); postCommit(dbSession, items); @@ -133,7 +116,6 @@ public class RuleIndexer implements ResilientIndexer { if (!items.isEmpty()) { ListMultimap<String, EsQueueDto> itemsByType = groupItemsByIndexTypeFormat(items); doIndexRules(dbSession, itemsByType.get(TYPE_RULE.format())).ifPresent(result::add); - doIndexRuleExtensions(dbSession, itemsByType.get(TYPE_RULE_EXTENSION.format())).ifPresent(result::add); } return result; } @@ -154,49 +136,17 @@ public class RuleIndexer implements ResilientIndexer { dbClient.ruleDao().scrollIndexingRulesByKeys(dbSession, ruleUuids, r -> { bulkIndexer.add(ruleDocOf(r).toIndexRequest()); - bulkIndexer.add(RuleExtensionDoc.of(r).toIndexRequest()); ruleUuids.remove(r.getUuid()); }); - // the remaining items reference rows that don't exist in db. They must - // be deleted from index. + // the remaining items reference rows that don't exist in db. They must be deleted from index. ruleUuids.forEach(ruleUuid -> { bulkIndexer.addDeletion(TYPE_RULE, ruleUuid, ruleUuid); - bulkIndexer.addDeletion(TYPE_RULE_EXTENSION, RuleExtensionDoc.idOf(ruleUuid, RuleExtensionScope.system()), ruleUuid); }); return Optional.of(bulkIndexer.stop()); } - private Optional<IndexingResult> doIndexRuleExtensions(DbSession dbSession, List<EsQueueDto> items) { - if (items.isEmpty()) { - return Optional.empty(); - } - - BulkIndexer bulkIndexer = createBulkIndexer(Size.REGULAR, new OneToOneResilientIndexingListener(dbClient, dbSession, items)); - bulkIndexer.start(); - - Set<RuleExtensionId> docIds = items - .stream() - .map(RuleIndexer::explodeRuleExtensionDocId) - .collect(toHashSet(items.size())); - - dbClient.ruleDao().scrollIndexingRuleExtensionsByIds(dbSession, docIds, - // only index requests, no deletion requests. - // Deactivated users are not deleted but updated. - r -> { - RuleExtensionId docId = new RuleExtensionId(r.getOrganizationUuid(), r.getRuleUuid()); - docIds.remove(docId); - bulkIndexer.add(RuleExtensionDoc.of(r).toIndexRequest()); - }); - - // the remaining items reference rows that don't exist in db. They must - // be deleted from index. - docIds.forEach(docId -> bulkIndexer.addDeletion(TYPE_RULE_EXTENSION, docId.getId(), docId.getRuleUuid())); - - return Optional.of(bulkIndexer.stop()); - } - private static RuleDoc ruleDocOf(RuleForIndexingDto dto) { SecurityStandards securityStandards = SecurityStandards.fromSecurityStandards(dto.getSecurityStandards()); if (!securityStandards.getIgnoredSQCategories().isEmpty()) { @@ -234,19 +184,8 @@ public class RuleIndexer implements ResilientIndexer { return items.stream().collect(MoreCollectors.index(EsQueueDto::getDocType)); } - private static RuleExtensionId explodeRuleExtensionDocId(EsQueueDto esQueueDto) { - checkArgument(TYPE_RULE_EXTENSION.format().equals(esQueueDto.getDocType())); - return new RuleExtensionId(esQueueDto.getDocId()); - } - private static EsQueueDto createQueueDtoForRule(String ruleUuid) { String docId = ruleUuid; return EsQueueDto.create(TYPE_RULE.format(), docId, null, docId); } - - private static EsQueueDto createQueueDtoForRuleExtension(String ruleUuid, OrganizationDto organization) { - String docId = RuleExtensionDoc.idOf(ruleUuid, RuleExtensionScope.organization(organization)); - return EsQueueDto.create(TYPE_RULE_EXTENSION.format(), docId, null, ruleUuid); - } - } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java index 57f42918eec..fc5fefcfeab 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java @@ -53,7 +53,6 @@ public class RuleQuery { private boolean ascendingSort = true; private String internalKey; private String ruleKey; - private OrganizationDto organization; private boolean includeExternal; private Collection<String> owaspTop10; private Collection<String> sansTop25; @@ -279,15 +278,6 @@ public class RuleQuery { return ruleKey; } - public OrganizationDto getOrganization() { - return organization; - } - - public RuleQuery setOrganization(OrganizationDto o) { - this.organization = o; - return this; - } - @CheckForNull public QProfileDto getCompareToQProfile() { return compareToQProfile; diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java index 58ae6cc54e2..a3e706a2308 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java @@ -30,7 +30,6 @@ import org.junit.Test; import org.sonar.api.utils.System2; import org.sonar.db.DbTester; import org.sonar.db.es.EsQueueDto; -import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualityprofile.ActiveRuleDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.rule.RuleDefinitionDto; @@ -63,9 +62,8 @@ public class ActiveRuleIndexerTest { public void before() { rule1 = db.rules().insert(); rule2 = db.rules().insert(); - OrganizationDto org = db.organizations().insert(); - profile1 = db.qualityProfiles().insert(org); - profile2 = db.qualityProfiles().insert(org); + profile1 = db.qualityProfiles().insert(); + profile2 = db.qualityProfiles().insert(); } @Test diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/rule/DefaultRuleFinderTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/rule/DefaultRuleFinderTest.java index b1d8498dee0..5769006c1f6 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/rule/DefaultRuleFinderTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/rule/DefaultRuleFinderTest.java @@ -29,7 +29,6 @@ import org.sonar.api.utils.System2; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto.Scope; @@ -46,7 +45,6 @@ public class DefaultRuleFinderTest { private DbClient dbClient = dbTester.getDbClient(); private DbSession session = dbTester.getSession(); - private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); private RuleDto rule1 = new RuleDto() .setName("Check Header") @@ -84,7 +82,7 @@ public class DefaultRuleFinderTest { .setScope(Scope.MAIN) .setStatus(RuleStatus.READY); - private DefaultRuleFinder underTest = new DefaultRuleFinder(dbClient, defaultOrganizationProvider); + private DefaultRuleFinder underTest = new DefaultRuleFinder(dbClient); @Before public void setup() { @@ -131,8 +129,7 @@ public class DefaultRuleFinderTest { public void findByKey_populates_system_tags_but_not_tags() { RuleDefinitionDto ruleDefinition = dbTester.rules() .insert(t -> t.setSystemTags(ImmutableSet.of(randomAlphanumeric(5), randomAlphanumeric(6)))); - OrganizationDto organization = dbTester.organizations().insert(); - dbTester.rules().insertRule(organization); + dbTester.rules().insertRule(); Rule rule = underTest.findByKey(ruleDefinition.getKey()); assertThat(rule.getSystemTags()) diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexDefinitionTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexDefinitionTest.java index e123607d8e3..33cc879982a 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexDefinitionTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexDefinitionTest.java @@ -61,7 +61,7 @@ public class RuleIndexDefinitionTest { .isEqualTo(IndexType.main(Index.withRelations("rules"), "rule")); assertThat(ruleIndex.getRelationsStream()) .extracting(IndexType.IndexRelationType::getName) - .containsOnly("activeRule", "ruleExtension"); + .containsOnly("activeRule"); // no cluster by default assertThat(ruleIndex.getSetting("index.number_of_shards")).isEqualTo("2"); diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java index 2dc3371373c..be13bf85728 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java @@ -31,10 +31,8 @@ import org.junit.rules.ExpectedException; import org.sonar.api.impl.utils.AlwaysIncreasingSystem2; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; -import org.sonar.api.rules.RuleType; import org.sonar.api.utils.System2; import org.sonar.db.DbTester; -import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleMetadataDto; @@ -67,7 +65,6 @@ import static org.sonar.db.rule.RuleTesting.setIsExternal; import static org.sonar.db.rule.RuleTesting.setIsTemplate; import static org.sonar.db.rule.RuleTesting.setLanguage; import static org.sonar.db.rule.RuleTesting.setName; -import static org.sonar.db.rule.RuleTesting.setOrganization; import static org.sonar.db.rule.RuleTesting.setRepositoryKey; import static org.sonar.db.rule.RuleTesting.setRuleKey; import static org.sonar.db.rule.RuleTesting.setSecurityStandards; @@ -86,7 +83,6 @@ import static org.sonar.server.rule.index.RuleIndex.FACET_TAGS; import static org.sonar.server.rule.index.RuleIndex.FACET_TYPES; import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_ACTIVE_RULE; import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE; -import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE_EXTENSION; import static org.sonar.server.security.SecurityStandards.SANS_TOP_25_INSECURE_INTERACTION; import static org.sonar.server.security.SecurityStandards.SANS_TOP_25_RISKY_RESOURCE; @@ -293,21 +289,19 @@ public class RuleIndexTest { @Test public void filter_by_tags() { - OrganizationDto organization = db.organizations().insert(); - RuleDefinitionDto rule1 = createRule(setSystemTags("tag1s")); - createRuleMetadata(rule1, organization, setTags("tag1")); + createRuleMetadata(rule1, setTags("tag1")); RuleDefinitionDto rule2 = createRule(setSystemTags("tag2s")); - createRuleMetadata(rule2, organization, setTags("tag2")); + createRuleMetadata(rule2, setTags("tag2")); index(); - assertThat(es.countDocuments(TYPE_RULE_EXTENSION)).isEqualTo(4); + assertThat(es.countDocuments(TYPE_RULE)).isEqualTo(2); // tag2s in filter - RuleQuery query = new RuleQuery().setOrganization(organization).setTags(of("tag2s")); + RuleQuery query = new RuleQuery().setTags(of("tag2s")); verifySearch(query, rule2); // tag2 in filter - query = new RuleQuery().setOrganization(organization).setTags(of("tag2")); + query = new RuleQuery().setTags(of("tag2")); verifySearch(query, rule2); // empty list => no filter @@ -321,14 +315,11 @@ public class RuleIndexTest { @Test public void tags_facet_supports_selected_value_with_regexp_special_characters() { - OrganizationDto organization = db.organizations().insert(); - RuleDefinitionDto rule = createRule(); - createRuleMetadata(rule, organization, setTags("misra++")); + createRuleMetadata(rule, setTags("misra++")); index(); RuleQuery query = new RuleQuery() - .setOrganization(organization) .setTags(singletonList("misra[")); SearchOptions options = new SearchOptions().addFacets(FACET_TAGS); @@ -507,8 +498,8 @@ public class RuleIndexTest { @Test public void compare_to_another_profile() { String xoo = "xoo"; - QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(xoo)); - QProfileDto anotherProfile = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(xoo)); + QProfileDto profile = db.qualityProfiles().insert(p -> p.setLanguage(xoo)); + QProfileDto anotherProfile = db.qualityProfiles().insert(p -> p.setLanguage(xoo)); RuleDefinitionDto commonRule = db.rules().insertRule(r -> r.setLanguage(xoo)).getDefinition(); RuleDefinitionDto profileRule1 = db.rules().insertRule(r -> r.setLanguage(xoo)).getDefinition(); RuleDefinitionDto profileRule2 = db.rules().insertRule(r -> r.setLanguage(xoo)).getDefinition(); @@ -544,8 +535,8 @@ public class RuleIndexTest { } @SafeVarargs - private final RuleMetadataDto createRuleMetadata(RuleDefinitionDto rule, OrganizationDto organization, Consumer<RuleMetadataDto>... populaters) { - return db.rules().insertOrUpdateMetadata(rule, organization, populaters); + private final RuleMetadataDto createRuleMetadata(RuleDefinitionDto rule, Consumer<RuleMetadataDto>... populaters) { + return db.rules().insertOrUpdateMetadata(rule, populaters); } @Test @@ -641,16 +632,16 @@ public class RuleIndexTest { } private void index() { - ruleIndexer.indexOnStartup(Sets.newHashSet(TYPE_RULE, TYPE_RULE_EXTENSION)); + ruleIndexer.indexOnStartup(Sets.newHashSet(TYPE_RULE)); activeRuleIndexer.indexOnStartup(Sets.newHashSet(TYPE_ACTIVE_RULE)); } private RuleQuery newRuleQuery() { - return new RuleQuery().setOrganization(db.getDefaultOrganization()); + return new RuleQuery(); } private QProfileDto createJavaProfile() { - return db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage("java")); + return db.qualityProfiles().insert(p -> p.setLanguage("java")); } @Test @@ -733,46 +724,24 @@ public class RuleIndexTest { } @Test - public void listTags_should_return_both_system_tags_and_organization_specific_tags() { - OrganizationDto organization = db.organizations().insert(); - + public void listTags_should_return_tags() { RuleDefinitionDto rule1 = createRule(setSystemTags("sys1", "sys2")); - createRuleMetadata(rule1, organization, setOrganization(organization), setTags("tag1")); + createRuleMetadata(rule1, setTags("tag1")); RuleDefinitionDto rule2 = createRule(setSystemTags()); - createRuleMetadata(rule2, organization, setOrganization(organization), setTags("tag2")); - - index(); - - assertThat(underTest.listTags(organization, null, 10)).containsOnly("tag1", "tag2", "sys1", "sys2"); - } - - @Test - public void listTags_must_not_return_tags_of_other_organizations() { - OrganizationDto organization1 = db.organizations().insert(); - RuleDefinitionDto rule1 = createRule(setSystemTags("sys1")); - createRuleMetadata(rule1, organization1, setOrganization(organization1), setTags("tag1")); + createRuleMetadata(rule2, setTags("tag2")); - OrganizationDto organization2 = db.organizations().insert(); - RuleDefinitionDto rule2 = createRule(setSystemTags("sys2")); - createRuleMetadata(rule2, organization2, setOrganization(organization2), setTags("tag2")); - - OrganizationDto organization3 = db.organizations().insert(); index(); - assertThat(underTest.listTags(organization1, null, 10)).containsOnly("tag1", "sys1", "sys2"); - assertThat(underTest.listTags(organization2, null, 10)).containsOnly("tag2", "sys1", "sys2"); - assertThat(underTest.listTags(organization3, null, 10)).containsOnly("sys1", "sys2"); + assertThat(underTest.listTags(null, 10)).containsOnly("tag1", "tag2", "sys1", "sys2"); } @Test public void fail_to_list_tags_when_size_greater_than_500() { - OrganizationDto organization = db.organizations().insert(); - expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Page size must be lower than or equals to 500"); - underTest.listTags(organization, null, 501); + underTest.listTags(null, 501); } @Test @@ -795,17 +764,15 @@ public class RuleIndexTest { @Test public void global_facet_on_repositories_and_tags() { - OrganizationDto organization = db.organizations().insert(); - createRule(setRepositoryKey("php"), setSystemTags("sysTag")); RuleDefinitionDto rule1 = createRule(setRepositoryKey("php"), setSystemTags()); - createRuleMetadata(rule1, organization, setTags("tag1")); + createRuleMetadata(rule1, setTags("tag1")); RuleDefinitionDto rule2 = createRule(setRepositoryKey("javascript"), setSystemTags()); - createRuleMetadata(rule2, organization, setTags("tag1", "tag2")); + createRuleMetadata(rule2, setTags("tag1", "tag2")); index(); // should not have any facet! - RuleQuery query = new RuleQuery().setOrganization(organization); + RuleQuery query = new RuleQuery(); SearchIdResult result1 = underTest.search(query, new SearchOptions()); assertThat(result1.getFacets().getAll()).isEmpty(); @@ -859,9 +826,7 @@ public class RuleIndexTest { @Test public void sticky_facets_no_filters() { setupStickyFacets(); - OrganizationDto organization = db.organizations().insert(); - - RuleQuery query = new RuleQuery().setOrganization(organization); + RuleQuery query = new RuleQuery(); SearchIdResult<String> result = underTest.search(query, new SearchOptions().addFacets(asList(FACET_LANGUAGES, FACET_REPOSITORIES, FACET_TAGS, FACET_TYPES))); @@ -880,12 +845,9 @@ public class RuleIndexTest { @Test public void sticky_facets_with_1_filter() { setupStickyFacets(); - OrganizationDto organization = db.organizations().insert(); - - RuleQuery query = new RuleQuery().setOrganization(organization).setLanguages(ImmutableList.of("cpp")); + RuleQuery query = new RuleQuery().setLanguages(ImmutableList.of("cpp")); - SearchIdResult<String> result = underTest.search(query, new SearchOptions().addFacets(asList(FACET_LANGUAGES, - FACET_REPOSITORIES, FACET_TAGS))); + SearchIdResult<String> result = underTest.search(query, new SearchOptions().addFacets(asList(FACET_LANGUAGES, FACET_REPOSITORIES, FACET_TAGS))); assertThat(result.getUuids()).hasSize(3); assertThat(result.getFacets().getAll()).hasSize(3); assertThat(result.getFacets().get(FACET_LANGUAGES).keySet()).containsOnly("cpp", "java", "cobol"); @@ -915,12 +877,11 @@ public class RuleIndexTest { @Test public void tags_facet_should_find_tags_of_specified_organization() { - OrganizationDto organization = db.organizations().insert(); RuleDefinitionDto rule = createRule(setSystemTags()); - createRuleMetadata(rule, organization, setTags("bla")); + createRuleMetadata(rule, setTags("bla")); index(); - RuleQuery query = new RuleQuery().setOrganization(organization); + RuleQuery query = new RuleQuery(); SearchOptions options = new SearchOptions().addFacets(singletonList(FACET_TAGS)); SearchIdResult<String> result = underTest.search(query, options); @@ -934,8 +895,7 @@ public class RuleIndexTest { createRule(setSystemTags(tags)); index(); - RuleQuery query = new RuleQuery() - .setOrganization(db.getDefaultOrganization()); + RuleQuery query = new RuleQuery(); SearchOptions options = new SearchOptions().addFacets(singletonList(FACET_TAGS)); SearchIdResult<String> result = underTest.search(query, options); assertThat(result.getFacets().get(FACET_TAGS).size()).isEqualTo(100); @@ -951,7 +911,6 @@ public class RuleIndexTest { index(); RuleQuery query = new RuleQuery() - .setOrganization(db.getDefaultOrganization()) .setTags(singletonList("tagA")); SearchOptions options = new SearchOptions().addFacets(singletonList(FACET_TAGS)); SearchIdResult<String> result = underTest.search(query, options); @@ -965,41 +924,14 @@ public class RuleIndexTest { } @Test - public void tags_facet_should_not_find_tags_of_any_other_organization() { - OrganizationDto organization1 = db.organizations().insert(); - OrganizationDto organization2 = db.organizations().insert(); - RuleDefinitionDto rule = createRule(setSystemTags()); - createRuleMetadata(rule, organization1, setTags("bla1")); - createRuleMetadata(rule, organization2, setTags("bla2")); - index(); - - RuleQuery query = new RuleQuery().setOrganization(organization2); - SearchOptions options = new SearchOptions().addFacets(singletonList(FACET_TAGS)); - - SearchIdResult<String> result = underTest.search(query, options); - assertThat(result.getFacets().get(FACET_TAGS).entrySet()).extracting(e -> entry(e.getKey(), e.getValue())).containsExactly( - entry("bla2", 1L)); - } - - @Test public void tags_facet_should_be_available_if_organization_is_specified() { - OrganizationDto organization = db.organizations().insert(); - RuleQuery query = new RuleQuery().setOrganization(organization); + RuleQuery query = new RuleQuery(); SearchOptions options = new SearchOptions().addFacets(singletonList(FACET_TAGS)); SearchIdResult<String> result = underTest.search(query, options); assertThat(result.getFacets().get(FACET_TAGS)).isNotNull(); } - @Test - public void tags_facet_should_be_unavailable_if_no_organization_is_specfified() { - RuleQuery query = new RuleQuery(); - SearchOptions options = new SearchOptions().addFacets(singletonList(FACET_TAGS)); - - expectedException.expectMessage("Cannot use tags facet, if no organization is specified."); - underTest.search(query, options); - } - /** * Facet with 2 filters * -- lang facet for tag T2 @@ -1011,7 +943,6 @@ public class RuleIndexTest { setupStickyFacets(); RuleQuery query = new RuleQuery() - .setOrganization(db.getDefaultOrganization()) .setLanguages(ImmutableList.of("cpp")) .setTags(ImmutableList.of("T2")); @@ -1037,7 +968,6 @@ public class RuleIndexTest { setupStickyFacets(); RuleQuery query = new RuleQuery() - .setOrganization(db.getDefaultOrganization()) .setLanguages(ImmutableList.of("cpp", "java")) .setTags(ImmutableList.of("T2")) .setTypes(asList(BUG, CODE_SMELL)); diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java index 9b9d1915615..21205f37cdf 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java @@ -44,7 +44,6 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto.Scope; -import org.sonar.db.rule.RuleMetadataDto; import org.sonar.db.rule.RuleTesting; import org.sonar.server.es.EsTester; import org.sonar.server.security.SecurityStandards; @@ -53,14 +52,11 @@ import org.sonar.server.security.SecurityStandards.SQCategory; import static com.google.common.collect.Sets.newHashSet; import static java.lang.String.format; import static java.util.Collections.emptyList; -import static java.util.Collections.emptySet; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toSet; import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; -import static org.elasticsearch.index.query.QueryBuilders.termQuery; import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE; -import static org.sonar.server.rule.index.RuleIndexDefinition.TYPE_RULE_EXTENSION; import static org.sonar.server.security.SecurityStandards.CWES_BY_SQ_CATEGORY; import static org.sonar.server.security.SecurityStandards.SQ_CATEGORY_KEYS_ORDERING; @@ -130,50 +126,6 @@ public class RuleIndexerTest { } @Test - public void index_rule_extension_with_long_id() { - RuleDefinitionDto rule = dbTester.rules().insert(r -> r.setRuleKey(RuleTesting.randomRuleKeyOfMaximumLength())); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); - OrganizationDto organization = dbTester.organizations().insert(); - RuleMetadataDto metadata = RuleTesting.newRuleMetadata(rule, organization).setTags(ImmutableSet.of("bla")); - dbTester.getDbClient().ruleDao().insertOrUpdate(dbTester.getSession(), metadata); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); - - RuleExtensionDoc doc = new RuleExtensionDoc() - .setRuleUuid(rule.getUuid()) - .setScope(RuleExtensionScope.organization(organization.getUuid())); - assertThat( - es.client() - .prepareSearch(TYPE_RULE_EXTENSION.getMainType()) - .setQuery(termQuery("_id", doc.getId())) - .get() - .getHits() - .getHits()[0] - .getId()).isEqualTo(doc.getId()); - } - - @Test - public void delete_rule_extension_from_index_when_setting_rule_tags_to_empty() { - RuleDefinitionDto rule = dbTester.rules().insert(r -> r.setRuleKey(RuleTesting.randomRuleKeyOfMaximumLength())); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); - OrganizationDto organization = dbTester.organizations().insert(); - RuleMetadataDto metadata = RuleTesting.newRuleMetadata(rule, organization).setTags(ImmutableSet.of("bla")); - dbTester.getDbClient().ruleDao().insertOrUpdate(dbTester.getSession(), metadata); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); - - // index tags - RuleExtensionDoc doc = new RuleExtensionDoc() - .setRuleUuid(rule.getUuid()) - .setScope(RuleExtensionScope.organization(organization.getUuid())); - assertThat(es.getIds(TYPE_RULE_EXTENSION)).contains(doc.getId()); - - // update db table "rules_metadata" with empty tags and delete tags from index - metadata = RuleTesting.newRuleMetadata(rule, organization).setTags(emptySet()); - dbTester.getDbClient().ruleDao().insertOrUpdate(dbTester.getSession(), metadata); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); - assertThat(es.getIds(TYPE_RULE_EXTENSION)).doesNotContain(doc.getId()); - } - - @Test public void index_long_rule_description() { String description = IntStream.range(0, 100000).map(i -> i % 100).mapToObj(Integer::toString).collect(joining(" ")); RuleDefinitionDto rule = dbTester.rules().insert(r -> r.setDescription(description)); @@ -194,7 +146,7 @@ public class RuleIndexerTest { .setSecurityStandards(standards) .setDescription(VALID_HOTSPOT_RULE_DESCRIPTION)); OrganizationDto organization = dbTester.organizations().insert(); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); + underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); assertThat(logTester.getLogs()).hasSize(1); assertThat(logTester.logs(LoggerLevel.WARN).get(0)) @@ -230,7 +182,7 @@ public class RuleIndexerTest { .setType(RuleType.SECURITY_HOTSPOT) .setDescription(description)); OrganizationDto organization = dbTester.organizations().insert(); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); + underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); assertThat(logTester.getLogs()).hasSize(1); assertThat(logTester.logs(LoggerLevel.WARN).get(0)) @@ -253,7 +205,7 @@ public class RuleIndexerTest { .setType(RuleType.SECURITY_HOTSPOT) .setDescription(randomAlphabetic(30))); OrganizationDto organization = dbTester.organizations().insert(); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); + underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); assertThat(logTester.getLogs()).hasSize(1); assertThat(logTester.logs(LoggerLevel.WARN).get(0)) @@ -270,7 +222,7 @@ public class RuleIndexerTest { "<h2>Ask Yourself Whether</h2>\n" + "foo")); OrganizationDto organization = dbTester.organizations().insert(); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); + underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); assertThat(logTester.getLogs()).hasSize(1); assertThat(logTester.logs(LoggerLevel.WARN).get(0)) @@ -288,7 +240,7 @@ public class RuleIndexerTest { "<h2>Recommended Secure Coding Practices</h2>\n" + "foo")); OrganizationDto organization = dbTester.organizations().insert(); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); + underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); assertThat(logTester.getLogs()).hasSize(1); assertThat(logTester.logs(LoggerLevel.WARN).get(0)) @@ -305,7 +257,7 @@ public class RuleIndexerTest { "<h2>Recommended Secure Coding Practices</h2>\n" + "foo")); OrganizationDto organization = dbTester.organizations().insert(); - underTest.commitAndIndex(dbTester.getSession(), rule.getUuid(), organization); + underTest.commitAndIndex(dbTester.getSession(), rule.getUuid()); assertThat(logTester.getLogs()).hasSize(1); assertThat(logTester.logs(LoggerLevel.WARN).get(0)) diff --git a/server/sonar-server-common/src/testFixtures/java/org/sonar/server/organization/TestDefaultOrganizationProvider.java b/server/sonar-server-common/src/testFixtures/java/org/sonar/server/organization/TestDefaultOrganizationProvider.java index 22bdbf30e74..4c27c0e59cd 100644 --- a/server/sonar-server-common/src/testFixtures/java/org/sonar/server/organization/TestDefaultOrganizationProvider.java +++ b/server/sonar-server-common/src/testFixtures/java/org/sonar/server/organization/TestDefaultOrganizationProvider.java @@ -66,11 +66,11 @@ public class TestDefaultOrganizationProvider implements DefaultOrganizationProvi } } - private static final class DbTesterDefaultOrganizationProvider implements DefaultOrganizationProvider { + public static final class DbTesterDefaultOrganizationProvider implements DefaultOrganizationProvider { private final DbTester dbTester; private DefaultOrganization defaultOrganization = null; - private DbTesterDefaultOrganizationProvider(DbTester dbTester) { + public DbTesterDefaultOrganizationProvider(DbTester dbTester) { this.dbTester = dbTester; } |