aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>2015-01-21 15:44:45 +0100
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>2015-01-21 16:50:42 +0100
commite4650f9201d22744f353e7ca54059db40d4dd0a5 (patch)
tree6435f76e308d48f565b241e368df859211525887
parentd4c4d4ddc60769dca4d5ad2ab95b538cfc505056 (diff)
downloadsonarqube-e4650f9201d22744f353e7ca54059db40d4dd0a5.tar.gz
sonarqube-e4650f9201d22744f353e7ca54059db40d4dd0a5.zip
Fix quality flaws
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java9
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java71
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java3
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/rule/ws/RepositoriesAction.java7
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")