diff options
author | Jean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com> | 2015-01-21 15:44:45 +0100 |
---|---|---|
committer | Jean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com> | 2015-01-21 16:50:42 +0100 |
commit | e4650f9201d22744f353e7ca54059db40d4dd0a5 (patch) | |
tree | 6435f76e308d48f565b241e368df859211525887 | |
parent | d4c4d4ddc60769dca4d5ad2ab95b538cfc505056 (diff) | |
download | sonarqube-e4650f9201d22744f353e7ca54059db40d4dd0a5.tar.gz sonarqube-e4650f9201d22744f353e7ca54059db40d4dd0a5.zip |
Fix quality flaws
4 files changed, 57 insertions, 33 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java index f3779a75ec9..a137d9a95da 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java @@ -80,6 +80,7 @@ import static com.google.common.collect.Lists.newArrayList; public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { + private static final String FILTER_DEBT_CHARACTERISTICS = "debtCharacteristics"; public static final String FACET_LANGUAGES = "languages"; public static final String FACET_TAGS = "tags"; public static final String FACET_REPOSITORIES = "repositories"; @@ -273,7 +274,7 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { // Construct the debt filter on effective char and subChar Collection<String> debtCharacteristics = query.getDebtCharacteristics(); if (debtCharacteristics != null && !debtCharacteristics.isEmpty()) { - filters.put("debtCharacteristics", + filters.put(FILTER_DEBT_CHARACTERISTICS, FilterBuilders.boolFilter().must( FilterBuilders.orFilter( // Match only when NONE (overridden) @@ -376,8 +377,6 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { private void addStatusFacetIfNeeded(RuleQuery query, QueryContext options, Map<String, AggregationBuilder> aggregations, StickyFacetBuilder stickyFacetBuilder) { if (options.facets().contains(FACET_STATUSES)) { - Collection<RuleStatus> statusesFromQuery = query.getStatuses(); - BoolFilterBuilder facetFilter = stickyFacetBuilder.getStickyFacetFilter(RuleNormalizer.RuleField.STATUS.field()); AggregationBuilder statuses = AggregationBuilders.filter(FACET_STATUSES + "_filter") .filter(facetFilter) @@ -400,7 +399,7 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { Collection<String> characsFromQuery = query.getDebtCharacteristics(); Object[] selectedChars = characsFromQuery == null ? new Object[0] : characsFromQuery.toArray(); AggregationBuilder debtChar = AggregationBuilders.filter(FACET_DEBT_CHARACTERISTICS + "__chars") - .filter(stickyFacetBuilder.getStickyFacetFilter("debtCharacteristics")) + .filter(stickyFacetBuilder.getStickyFacetFilter(FILTER_DEBT_CHARACTERISTICS)) .subAggregation( AggregationBuilders.terms(FACET_DEBT_CHARACTERISTICS + "__chars_top").field(RuleNormalizer.RuleField.CHARACTERISTIC.field()) .size(characsSize)) @@ -409,7 +408,7 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { .include(Joiner.on('|').join(selectedChars)) .size(characsSize)); AggregationBuilder debtSubChar = AggregationBuilders.filter(FACET_DEBT_CHARACTERISTICS + "__subchars") - .filter(stickyFacetBuilder.getStickyFacetFilter("debtCharacteristics")) + .filter(stickyFacetBuilder.getStickyFacetFilter(FILTER_DEBT_CHARACTERISTICS)) .subAggregation( AggregationBuilders.terms(FACET_DEBT_CHARACTERISTICS + "__subchars_top").field(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field()) .size(subCharacsSize)) diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java index 7180176a1c4..8191bc11429 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java @@ -21,6 +21,8 @@ package org.sonar.server.rule.ws; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.sonar.api.ServerComponent; import org.sonar.api.resources.Language; import org.sonar.api.resources.Languages; @@ -42,6 +44,9 @@ import java.util.Map; * web services. */ public class ActiveRuleCompleter implements ServerComponent { + + private static final Logger LOG = LoggerFactory.getLogger(ActiveRuleCompleter.class); + private final QProfileLoader loader; private final Languages languages; @@ -51,10 +56,15 @@ public class ActiveRuleCompleter implements ServerComponent { } void completeSearch(RuleQuery query, Collection<Rule> rules, JsonWriter json) { - json.name("actives").beginObject(); + Collection<String> harvestedProfileKeys = writeActiveRules(json, query, rules); + + writeProfiles(json, harvestedProfileKeys); + } + private Collection<String> writeActiveRules(JsonWriter json, RuleQuery query, Collection<Rule> rules) { Collection<String> qProfileKeys = Sets.newHashSet(); + json.name("actives").beginObject(); String profileKey = query.getQProfileKey(); if (profileKey != null) { // Load details of active rules on the selected profile @@ -72,29 +82,7 @@ public class ActiveRuleCompleter implements ServerComponent { } json.endObject(); - - Map<String, QualityProfileDto> qProfilesByKey = Maps.newHashMap(); - for (String qProfileKey: qProfileKeys) { - if (!qProfilesByKey.containsKey(qProfileKey)) { - QualityProfileDto profile = loader.getByKey(qProfileKey); - qProfilesByKey.put(qProfileKey, profile); - if (profile.getParentKee() != null && !qProfilesByKey.containsKey(profile.getParentKee())) { - qProfilesByKey.put(profile.getParentKee(), loader.getByKey(profile.getParentKee())); - } - } - } - json.name("qProfiles").beginObject(); - for (QualityProfileDto profile: qProfilesByKey.values()) { - Language language = languages.get(profile.getLanguage()); - String langName = language == null ? profile.getLanguage() : language.getName(); - json.name(profile.getKey()).beginObject() - .prop("name", profile.getName()) - .prop("lang", profile.getLanguage()) - .prop("langName", langName) - .prop("parent", profile.getParentKee()) - .endObject(); - } - json.endObject(); + return qProfileKeys; } void completeShow(Rule rule, JsonWriter json) { @@ -139,4 +127,39 @@ public class ActiveRuleCompleter implements ServerComponent { json.endArray().endObject(); return activeRule.key().qProfile(); } + + private void writeProfiles(JsonWriter json, Collection<String> harvestedProfileKeys) { + Map<String, QualityProfileDto> qProfilesByKey = Maps.newHashMap(); + for (String qProfileKey : harvestedProfileKeys) { + if (!qProfilesByKey.containsKey(qProfileKey)) { + QualityProfileDto profile = loader.getByKey(qProfileKey); + if (profile == null) { + LOG.warn("Could not find quality profile with key " + qProfileKey); + continue; + } + qProfilesByKey.put(qProfileKey, profile); + String parentKee = profile.getParentKee(); + if (parentKee != null && !qProfilesByKey.containsKey(parentKee)) { + qProfilesByKey.put(parentKee, loader.getByKey(parentKee)); + } + } + } + json.name("qProfiles").beginObject(); + for (QualityProfileDto profile : qProfilesByKey.values()) { + writeProfile(json, profile); + } + json.endObject(); + } + + private void writeProfile(JsonWriter json, QualityProfileDto profile) { + Language language = languages.get(profile.getLanguage()); + String langName = language == null ? profile.getLanguage() : language.getName(); + json.name(profile.getKey()).beginObject() + .prop("name", profile.getName()) + .prop("lang", profile.getLanguage()) + .prop("langName", langName) + .prop("parent", profile.getParentKee()) + .endObject(); + } + } diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java index 36351a152ae..307f1c30b6d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java @@ -22,6 +22,7 @@ package org.sonar.server.rule.ws; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; +import org.apache.commons.collections.ComparatorUtils; import org.sonar.api.i18n.I18n; import org.sonar.api.resources.Language; import org.sonar.api.resources.Languages; @@ -160,7 +161,7 @@ public class AppAction implements RulesAction { Collections.sort(rootCharacs, new Comparator<DebtCharacteristic>() { @Override public int compare(DebtCharacteristic o1, DebtCharacteristic o2) { - return o1.order().compareTo(o2.order()); + return ComparatorUtils.nullHighComparator(ComparatorUtils.naturalComparator()).compare(o1.order(), o2.order()); } }); return rootCharacs; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RepositoriesAction.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RepositoriesAction.java index 55ff2345c37..db05d1ef7dc 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RepositoriesAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/RepositoriesAction.java @@ -42,6 +42,7 @@ import java.util.regex.Pattern; */ public class RepositoriesAction implements RulesAction { + private static final String LANGUAGE = "language"; private static final String MATCH_ALL = ".*"; private final RuleRepositories repositories; @@ -52,12 +53,12 @@ public class RepositoriesAction implements RulesAction { @Override public void handle(Request request, Response response) throws Exception { String query = request.param("q"); - String languageKey = request.param("language"); + String languageKey = request.param(LANGUAGE); int pageSize = request.mandatoryParamAsInt("ps"); JsonWriter json = response.newJsonWriter().beginObject().name("repositories").beginArray(); for (Repository repo : listMatchingRepositories(query, languageKey, pageSize)) { - json.beginObject().prop("key", repo.key()).prop("name", repo.name()).prop("language", repo.language()).endObject(); + json.beginObject().prop("key", repo.key()).prop("name", repo.name()).prop(LANGUAGE, repo.language()).endObject(); } json.endArray().endObject().close(); } @@ -90,7 +91,7 @@ public class RepositoriesAction implements RulesAction { action.createParam("q") .setDescription("A pattern to match repository keys/names against") .setExampleValue("squid"); - action.createParam("language") + action.createParam(LANGUAGE) .setDescription("A language key; if provided, only repositories for the given language will be returned") .setExampleValue("java"); action.createParam("ps") |