aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-batch
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2015-09-30 11:54:28 +0200
committerDuarte Meneses <duarte.meneses@sonarsource.com>2015-09-30 16:28:09 +0200
commitf7eb2f52db5155e72d81f74adfea3e2af7b41725 (patch)
tree86cfcdefa5c2d35a5c8e049ee1028e3f8fea4e41 /sonar-batch
parente0110b8cf875d491d10e3fdf71f0990e543e2dac (diff)
downloadsonarqube-f7eb2f52db5155e72d81f74adfea3e2af7b41725.tar.gz
sonarqube-f7eb2f52db5155e72d81f74adfea3e2af7b41725.zip
SONAR-6818 Split batch/project WS in several simpler WS
Diffstat (limited to 'sonar-batch')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesLoader.java3
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesProvider.java30
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/rule/DefaultActiveRulesLoader.java76
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/rule/LoadedActiveRule.java91
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/cache/NonAssociatedCacheSynchronizerTest.java20
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java5
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java42
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java58
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/rule/ActiveRulesProviderTest.java20
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/rule/DefaultActiveRulesLoaderTest.java34
-rw-r--r--sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search.protobuf105
-rw-r--r--sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search1.protobufbin0 -> 27828 bytes
-rw-r--r--sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search2.protobufbin0 -> 14446 bytes
13 files changed, 262 insertions, 222 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesLoader.java b/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesLoader.java
index 72f33bdb43c..e66d8ef7403 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesLoader.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesLoader.java
@@ -19,7 +19,6 @@
*/
package org.sonar.batch.rule;
-import org.sonarqube.ws.Rules.Rule;
import org.apache.commons.lang.mutable.MutableBoolean;
import javax.annotation.Nullable;
@@ -27,5 +26,5 @@ import javax.annotation.Nullable;
import java.util.List;
public interface ActiveRulesLoader {
- List<Rule> load(String qualityProfileKey, @Nullable MutableBoolean fromCache);
+ List<LoadedActiveRule> load(String qualityProfileKey, @Nullable MutableBoolean fromCache);
}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesProvider.java b/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesProvider.java
index 76fffd15264..da9f5211994 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesProvider.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesProvider.java
@@ -23,8 +23,6 @@ import org.sonar.api.utils.log.Profiler;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
-import org.sonarqube.ws.Rules.Rule.Param;
-import org.sonarqube.ws.Rules.Rule;
import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.batch.rule.ActiveRules;
import org.sonar.api.batch.rule.internal.ActiveRulesBuilder;
@@ -59,16 +57,16 @@ public class ActiveRulesProvider extends ProviderAdapter {
private static ActiveRules load(ActiveRulesLoader loader, ModuleQProfiles qProfiles) {
Collection<String> qProfileKeys = getKeys(qProfiles);
- Map<String, Rule> loadedRulesByKey = new HashMap<>();
+ Map<RuleKey, LoadedActiveRule> loadedRulesByKey = new HashMap<>();
try {
for (String qProfileKey : qProfileKeys) {
- Collection<Rule> qProfileRules;
+ Collection<LoadedActiveRule> qProfileRules;
qProfileRules = load(loader, qProfileKey);
- for (Rule r : qProfileRules) {
- if (!loadedRulesByKey.containsKey(r.getKey())) {
- loadedRulesByKey.put(r.getKey(), r);
+ for (LoadedActiveRule r : qProfileRules) {
+ if (!loadedRulesByKey.containsKey(r.getRuleKey())) {
+ loadedRulesByKey.put(r.getRuleKey(), r);
}
}
}
@@ -79,20 +77,22 @@ public class ActiveRulesProvider extends ProviderAdapter {
return transform(loadedRulesByKey.values());
}
- private static ActiveRules transform(Collection<Rule> loadedRules) {
+ private static ActiveRules transform(Collection<LoadedActiveRule> loadedRules) {
ActiveRulesBuilder builder = new ActiveRulesBuilder();
- for (Rule activeRule : loadedRules) {
- NewActiveRule newActiveRule = builder.create(RuleKey.parse(activeRule.getKey()));
+ for (LoadedActiveRule activeRule : loadedRules) {
+ NewActiveRule newActiveRule = builder.create(activeRule.getRuleKey());
newActiveRule.setName(activeRule.getName());
newActiveRule.setSeverity(activeRule.getSeverity());
- newActiveRule.setLanguage(activeRule.getLang());
+ newActiveRule.setLanguage(activeRule.getLanguage());
newActiveRule.setInternalKey(activeRule.getInternalKey());
- newActiveRule.setTemplateRuleKey(activeRule.getTemplateKey());
+ newActiveRule.setTemplateRuleKey(activeRule.getTemplateRuleKey());
// load parameters
- for (Param param : activeRule.getParams().getParamsList()) {
- newActiveRule.setParam(param.getKey(), param.getDefaultValue());
+ if (activeRule.getParams() != null) {
+ for (Map.Entry<String, String> params : activeRule.getParams().entrySet()) {
+ newActiveRule.setParam(params.getKey(), params.getValue());
+ }
}
newActiveRule.activate();
@@ -100,7 +100,7 @@ public class ActiveRulesProvider extends ProviderAdapter {
return builder.build();
}
- private static List<Rule> load(ActiveRulesLoader loader, String qProfileKey) throws IOException {
+ private static List<LoadedActiveRule> load(ActiveRulesLoader loader, String qProfileKey) throws IOException {
return loader.load(qProfileKey, null);
}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/rule/DefaultActiveRulesLoader.java b/sonar-batch/src/main/java/org/sonar/batch/rule/DefaultActiveRulesLoader.java
index c752b2f3871..14c37bf1745 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/rule/DefaultActiveRulesLoader.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/rule/DefaultActiveRulesLoader.java
@@ -19,8 +19,11 @@
*/
package org.sonar.batch.rule;
+import org.sonarqube.ws.Rules.Active.Param;
+import org.sonarqube.ws.Rules.Active;
+import org.sonar.api.rule.RuleKey;
+import org.sonarqube.ws.Rules.ActiveList;
import org.sonarqube.ws.Rules.SearchResponse;
-
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.mutable.MutableBoolean;
import org.sonar.batch.cache.WSLoader;
@@ -32,10 +35,13 @@ import org.sonarqube.ws.Rules.Rule;
import java.io.IOException;
import java.io.InputStream;
+import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
public class DefaultActiveRulesLoader implements ActiveRulesLoader {
- private static final String RULES_SEARCH_URL = "/api/rules/search.protobuf?ps=500&f=repo,name,severity,lang,internalKey,templateKey,params&activation=true";
+ private static final String RULES_SEARCH_URL = "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives&activation=true";
private final WSLoader wsLoader;
@@ -44,23 +50,40 @@ public class DefaultActiveRulesLoader implements ActiveRulesLoader {
}
@Override
- public List<Rule> load(String qualityProfileKey, @Nullable MutableBoolean fromCache) {
- WSLoaderResult<InputStream> result = wsLoader.loadStream(getUrl(qualityProfileKey));
- List<Rule> ruleList = loadFromStream(result.get());
- if (fromCache != null) {
- fromCache.setValue(result.isFromCache());
+ public List<LoadedActiveRule> load(String qualityProfileKey, @Nullable MutableBoolean fromCache) {
+ List<LoadedActiveRule> ruleList = new LinkedList<>();
+ int page = 1;
+ int pageSize = 500;
+ int loaded = 0;
+
+ while (true) {
+ WSLoaderResult<InputStream> result = wsLoader.loadStream(getUrl(qualityProfileKey, page, pageSize));
+ SearchResponse response = loadFromStream(result.get());
+ List<LoadedActiveRule> pageRules = readPage(response);
+ ruleList.addAll(pageRules);
+ loaded += response.getPs();
+
+ if (response.getTotal() <= loaded) {
+ break;
+ }
+ page++;
}
+
return ruleList;
}
- private static String getUrl(String qualityProfileKey) {
- return RULES_SEARCH_URL + "&qprofile=" + qualityProfileKey;
+ private static String getUrl(String qualityProfileKey, int page, int pageSize) {
+ StringBuilder builder = new StringBuilder(1024);
+ builder.append(RULES_SEARCH_URL);
+ builder.append("&qprofile=").append(qualityProfileKey);
+ builder.append("&p=").append(page);
+ builder.append("&ps=").append(pageSize);
+ return builder.toString();
}
- private static List<Rule> loadFromStream(InputStream is) {
+ private static SearchResponse loadFromStream(InputStream is) {
try {
- SearchResponse response = SearchResponse.parseFrom(is);
- return response.getRulesList();
+ return SearchResponse.parseFrom(is);
} catch (IOException e) {
throw new IllegalStateException("Failed to load quality profiles", e);
} finally {
@@ -68,4 +91,33 @@ public class DefaultActiveRulesLoader implements ActiveRulesLoader {
}
}
+ private static List<LoadedActiveRule> readPage(SearchResponse response) {
+ List<LoadedActiveRule> loadedRules = new LinkedList<>();
+
+ List<Rule> rulesList = response.getRulesList();
+ Map<String, ActiveList> actives = response.getActives().getActives();
+
+ for (Rule r : rulesList) {
+ ActiveList activeList = actives.get(r.getKey());
+ Active active = activeList.getActiveList(0);
+
+ LoadedActiveRule loadedRule = new LoadedActiveRule();
+ Map<String, String> params = new HashMap<>();
+
+ loadedRule.setRuleKey(RuleKey.parse(r.getKey()));
+ loadedRule.setName(r.getName());
+ loadedRule.setSeverity(active.getSeverity());
+ loadedRule.setLanguage(r.getLang());
+ loadedRule.setInternalKey(r.getInternalKey());
+ loadedRule.setTemplateRuleKey(r.getTemplateKey());
+
+ for (Param param : active.getParamsList()) {
+ params.put(param.getKey(), param.getValue());
+ }
+ loadedRule.setParams(params);
+ loadedRules.add(loadedRule);
+ }
+
+ return loadedRules;
+ }
}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/rule/LoadedActiveRule.java b/sonar-batch/src/main/java/org/sonar/batch/rule/LoadedActiveRule.java
new file mode 100644
index 00000000000..edd5b2c421e
--- /dev/null
+++ b/sonar-batch/src/main/java/org/sonar/batch/rule/LoadedActiveRule.java
@@ -0,0 +1,91 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.batch.rule;
+
+import java.util.Map;
+
+import org.sonar.api.rule.RuleKey;
+
+public class LoadedActiveRule {
+ private RuleKey ruleKey;
+ private String severity;
+ private String name;
+ private String language;
+ private Map<String, String> params;
+ private String templateRuleKey;
+ private String internalKey;
+
+ public RuleKey getRuleKey() {
+ return ruleKey;
+ }
+
+ public void setRuleKey(RuleKey ruleKey) {
+ this.ruleKey = ruleKey;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSeverity() {
+ return severity;
+ }
+
+ public void setSeverity(String severity) {
+ this.severity = severity;
+ }
+
+ public String getLanguage() {
+ return language;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ public Map<String, String> getParams() {
+ return params;
+ }
+
+ public void setParams(Map<String, String> params) {
+ this.params = params;
+ }
+
+ public String getTemplateRuleKey() {
+ return templateRuleKey;
+ }
+
+ public void setTemplateRuleKey(String templateRuleKey) {
+ this.templateRuleKey = templateRuleKey;
+ }
+
+ public String getInternalKey() {
+ return internalKey;
+ }
+
+ public void setInternalKey(String internalKey) {
+ this.internalKey = internalKey;
+ }
+
+}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/cache/NonAssociatedCacheSynchronizerTest.java b/sonar-batch/src/test/java/org/sonar/batch/cache/NonAssociatedCacheSynchronizerTest.java
index 4181b2f16b2..7934c0fed45 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/cache/NonAssociatedCacheSynchronizerTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/cache/NonAssociatedCacheSynchronizerTest.java
@@ -19,23 +19,21 @@
*/
package org.sonar.batch.cache;
-import static org.mockito.Mockito.when;
-
-import org.sonarqube.ws.Rules.Rule;
-
-import org.sonarqube.ws.QualityProfiles.WsSearchResponse.QualityProfile;
import com.google.common.collect.ImmutableList;
+import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.sonar.batch.repository.QualityProfileLoader;
+import org.sonar.batch.rule.ActiveRulesLoader;
+import org.sonar.batch.rule.LoadedActiveRule;
+import org.sonarqube.ws.QualityProfiles.WsSearchResponse.QualityProfile;
import java.util.Date;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
-import org.mockito.MockitoAnnotations;
-import org.junit.Before;
-import org.mockito.Mock;
-import org.sonar.batch.rule.ActiveRulesLoader;
-import org.sonar.batch.repository.QualityProfileLoader;
+import static org.mockito.Mockito.when;
public class NonAssociatedCacheSynchronizerTest {
private NonAssociatedCacheSynchronizer synchronizer;
@@ -52,7 +50,7 @@ public class NonAssociatedCacheSynchronizerTest {
MockitoAnnotations.initMocks(this);
QualityProfile pf = QualityProfile.newBuilder().setKey("profile").setName("profile").setLanguage("lang").build();
- Rule ar = Rule.newBuilder().build();
+ LoadedActiveRule ar = new LoadedActiveRule();
when(qualityProfileLoader.loadDefault(null)).thenReturn(ImmutableList.of(pf));
when(activeRulesLoader.load("profile", null)).thenReturn(ImmutableList.of(ar));
diff --git a/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java b/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java
index 0d46388d01c..548e6124313 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java
@@ -19,6 +19,8 @@
*/
package org.sonar.batch.cache;
+import org.sonar.batch.rule.LoadedActiveRule;
+
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import org.apache.commons.lang.mutable.MutableBoolean;
@@ -49,7 +51,6 @@ import java.util.Date;
import java.util.HashMap;
import static org.mockito.Matchers.anyBoolean;
-
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
@@ -97,7 +98,7 @@ public class ProjectCacheSynchronizerTest {
projectRepositoriesLoader = mock(DefaultProjectRepositoriesLoader.class);
QualityProfile pf = QualityProfile.newBuilder().setKey("profile").setName("profile").setLanguage("lang").build();
- org.sonarqube.ws.Rules.Rule ar = org.sonarqube.ws.Rules.Rule.newBuilder().build();
+ LoadedActiveRule ar = new LoadedActiveRule();
ProjectRepositories repo = mock(ProjectRepositories.class);
when(qualityProfileLoader.load(PROJECT_KEY, null, null)).thenReturn(ImmutableList.of(pf));
diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java
index f488d8bfe65..ab8ee270983 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java
@@ -19,8 +19,10 @@
*/
package org.sonar.batch.mediumtest;
-import org.sonar.batch.repository.FileData;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.batch.rule.LoadedActiveRule;
+import org.sonar.batch.repository.FileData;
import org.sonar.api.utils.DateUtils;
import com.google.common.collect.Table;
import com.google.common.collect.HashBasedTable;
@@ -217,33 +219,23 @@ public class BatchMediumTester {
return this;
}
- public BatchMediumTesterBuilder activateRule(org.sonarqube.ws.Rules.Rule activeRule) {
+ public BatchMediumTesterBuilder activateRule(LoadedActiveRule activeRule) {
activeRules.addActiveRule(activeRule);
return this;
}
public BatchMediumTesterBuilder addActiveRule(String repositoryKey, String ruleKey, @Nullable String templateRuleKey, String name, @Nullable String severity,
@Nullable String internalKey, @Nullable String languag) {
-
- org.sonarqube.ws.Rules.Rule.Builder builder = org.sonarqube.ws.Rules.Rule.newBuilder();
- builder.setRepo(repositoryKey);
- if (internalKey != null) {
- builder.setInternalKey(internalKey);
- }
- builder.setKey(repositoryKey + ":" + ruleKey);
- builder.setName(name);
-
- if (templateRuleKey != null) {
- builder.setTemplateKey(templateRuleKey);
- }
- if (languag != null) {
- builder.setLang(languag);
- }
- if (severity != null) {
- builder.setSeverity(severity);
- }
-
- activeRules.addActiveRule(builder.build());
+ LoadedActiveRule r = new LoadedActiveRule();
+
+ r.setInternalKey(internalKey);
+ r.setRuleKey(RuleKey.of(repositoryKey, ruleKey));
+ r.setName(name);
+ r.setTemplateRuleKey(templateRuleKey);
+ r.setLanguage(languag);
+ r.setSeverity(severity);
+
+ activeRules.addActiveRule(r);
return this;
}
@@ -379,14 +371,14 @@ public class BatchMediumTester {
}
private static class FakeActiveRulesLoader implements ActiveRulesLoader {
- private List<org.sonarqube.ws.Rules.Rule> activeRules = new LinkedList<>();
+ private List<LoadedActiveRule> activeRules = new LinkedList<>();
- public void addActiveRule(org.sonarqube.ws.Rules.Rule activeRule) {
+ public void addActiveRule(LoadedActiveRule activeRule) {
this.activeRules.add(activeRule);
}
@Override
- public List<org.sonarqube.ws.Rules.Rule> load(String qualityProfileKey, MutableBoolean fromCache) {
+ public List<LoadedActiveRule> load(String qualityProfileKey, MutableBoolean fromCache) {
return activeRules;
}
}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java
index 29531f3e537..4c58eb3eb68 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java
@@ -19,28 +19,28 @@
*/
package org.sonar.batch.mediumtest.issues;
-import org.sonarqube.ws.Rules.Rule.Param;
-
-import org.sonarqube.ws.Rules.Rule.Params;
-
-import javax.annotation.Nullable;
-
import com.google.common.collect.ImmutableMap;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+import org.sonar.api.rule.RuleKey;
import org.sonar.batch.mediumtest.BatchMediumTester;
import org.sonar.batch.mediumtest.TaskResult;
import org.sonar.batch.protocol.output.BatchReport.Issue;
+import org.sonar.batch.rule.LoadedActiveRule;
import org.sonar.xoo.XooPlugin;
import org.sonar.xoo.rule.XooRulesDefinition;
+
+import javax.annotation.Nullable;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import static org.assertj.core.api.Assertions.assertThat;
public class ChecksMediumTest {
@@ -109,29 +109,21 @@ public class ChecksMediumTest {
assertThat(foundIssueAtLine2).isTrue();
}
- private org.sonarqube.ws.Rules.Rule createActiveRuleWithParam(String repositoryKey, String ruleKey, @Nullable String templateRuleKey, String name, @Nullable String severity,
+ private LoadedActiveRule createActiveRuleWithParam(String repositoryKey, String ruleKey, @Nullable String templateRuleKey, String name, @Nullable String severity,
@Nullable String internalKey, @Nullable String languag, String paramKey, String paramValue) {
- org.sonarqube.ws.Rules.Rule.Builder builder = org.sonarqube.ws.Rules.Rule.newBuilder();
- builder.setRepo(repositoryKey);
- builder.setKey(repositoryKey + ":" + ruleKey);
- if (templateRuleKey != null) {
- builder.setTemplateKey(templateRuleKey);
- }
- if (languag != null) {
- builder.setLang(languag);
- }
- if (internalKey != null) {
- builder.setInternalKey(internalKey);
- }
- if (severity != null) {
- builder.setSeverity(severity);
- }
- builder.setName(name);
-
- Param param = Param.newBuilder().setKey(paramKey).setDefaultValue(paramValue).build();
- Params params = Params.newBuilder().addParams(param).build();
- builder.setParams(params);
- return builder.build();
+ LoadedActiveRule r = new LoadedActiveRule();
+
+ r.setInternalKey(internalKey);
+ r.setRuleKey(RuleKey.of(repositoryKey, ruleKey));
+ r.setName(name);
+ r.setTemplateRuleKey(templateRuleKey);
+ r.setLanguage(languag);
+ r.setSeverity(severity);
+
+ Map<String, String> params = new HashMap<>();
+ params.put(paramKey, paramValue);
+ r.setParams(params);
+ return r;
}
}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/rule/ActiveRulesProviderTest.java b/sonar-batch/src/test/java/org/sonar/batch/rule/ActiveRulesProviderTest.java
index 76a5cf1b07d..f459a341341 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/rule/ActiveRulesProviderTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/rule/ActiveRulesProviderTest.java
@@ -28,7 +28,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.sonar.api.batch.rule.ActiveRules;
import org.sonar.api.rule.RuleKey;
-import org.sonarqube.ws.Rules.Rule;
import java.util.LinkedList;
import java.util.List;
@@ -52,13 +51,13 @@ public class ActiveRulesProviderTest {
@Test
public void testCombinationOfRules() {
- Rule r1 = mockRule("rule1");
- Rule r2 = mockRule("rule2");
- Rule r3 = mockRule("rule3");
+ LoadedActiveRule r1 = mockRule("rule1");
+ LoadedActiveRule r2 = mockRule("rule2");
+ LoadedActiveRule r3 = mockRule("rule3");
- List<Rule> qp1Rules = ImmutableList.of(r1, r2);
- List<Rule> qp2Rules = ImmutableList.of(r2, r3);
- List<Rule> qp3Rules = ImmutableList.of(r1, r3);
+ List<LoadedActiveRule> qp1Rules = ImmutableList.of(r1, r2);
+ List<LoadedActiveRule> qp2Rules = ImmutableList.of(r2, r3);
+ List<LoadedActiveRule> qp3Rules = ImmutableList.of(r1, r3);
when(loader.load("qp1", null)).thenReturn(qp1Rules);
when(loader.load("qp2", null)).thenReturn(qp2Rules);
@@ -88,7 +87,10 @@ public class ActiveRulesProviderTest {
return new ModuleQProfiles(profiles);
}
- private static Rule mockRule(String name) {
- return Rule.newBuilder().setName(name).setRepo(name).setKey(name + ":" + name).build();
+ private static LoadedActiveRule mockRule(String name) {
+ LoadedActiveRule r = new LoadedActiveRule();
+ r.setName(name);
+ r.setRuleKey(RuleKey.of(name, name));
+ return r;
}
}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultActiveRulesLoaderTest.java b/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultActiveRulesLoaderTest.java
index 9e96042319f..6c63d0545dc 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultActiveRulesLoaderTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultActiveRulesLoaderTest.java
@@ -19,7 +19,8 @@
*/
package org.sonar.batch.rule;
-import org.sonarqube.ws.Rules.Rule;
+import org.sonar.api.rule.RuleKey;
+
import org.sonar.batch.cache.WSLoaderResult;
import org.sonar.batch.cache.WSLoader;
import com.google.common.io.Resources;
@@ -30,8 +31,6 @@ import java.io.InputStream;
import java.util.Collection;
import static org.mockito.Mockito.verify;
-
-import static org.mockito.Matchers.anyString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -50,14 +49,33 @@ public class DefaultActiveRulesLoaderTest {
@Test
public void feed_real_response() throws IOException {
- InputStream response = loadResource("active_rule_search.protobuf");
- when(ws.loadStream(anyString())).thenReturn(new WSLoaderResult<InputStream>(response, false));
- Collection<Rule> activeRules = loader.load("java-sonar-way-26368", null);
- assertThat(activeRules).hasSize(100);
+ InputStream response1 = loadResource("active_rule_search1.protobuf");
+ InputStream response2 = loadResource("active_rule_search2.protobuf");
+
+ String req1 = "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives&activation=true&qprofile=java-sonar-way-26368&p=1&ps=500";
+ String req2 = "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives&activation=true&qprofile=java-sonar-way-26368&p=2&ps=500";
+ when(ws.loadStream(req1)).thenReturn(new WSLoaderResult<InputStream>(response1, false));
+ when(ws.loadStream(req2)).thenReturn(new WSLoaderResult<InputStream>(response2, false));
- verify(ws).loadStream("/api/rules/search.protobuf?ps=500&f=repo,name,severity,lang,internalKey,templateKey,params&activation=true&qprofile=java-sonar-way-26368");
+ Collection<LoadedActiveRule> activeRules = loader.load("java-sonar-way-26368", null);
+ assertThat(activeRules).hasSize(226);
+ assertActiveRule(activeRules);
+
+ verify(ws).loadStream(req1);
+ verify(ws).loadStream(req2);
verifyNoMoreInteractions(ws);
+ }
+
+ private static void assertActiveRule(Collection<LoadedActiveRule> activeRules) {
+ RuleKey key = RuleKey.of("squid", "S3008");
+ for (LoadedActiveRule r : activeRules) {
+ if (!r.getRuleKey().equals(key)) {
+ continue;
+ }
+ assertThat(r.getParams().get("format")).isEqualTo("^[a-z][a-zA-Z0-9]*$");
+ assertThat(r.getSeverity()).isEqualTo("MINOR");
+ }
}
private InputStream loadResource(String name) throws IOException {
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search.protobuf b/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search.protobuf
deleted file mode 100644
index 18d0a1284a8..00000000000
--- a/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search.protobuf
+++ /dev/null
@@ -1,105 +0,0 @@
-¾d"Z
- squid:S1194squid("java.lang.Error" should not be extendedRMAJORbS1194šjava¢Java"×
-4squid:ObjectFinalizeOverridenCallsSuperFinalizeChecksquidQsuper.finalize() should be called at the end of Object.finalize() implementationsRBLOCKERb.ObjectFinalizeOverridenCallsSuperFinalizeCheckšjava¢Java"f
- squid:S2078squid1Values passed to LDAP queries should be sanitizedRCRITICALbS2078šjava¢Java"~
- squid:S1195squidLArray designators "[]" should be located after the type in method signaturesRMINORbS1195šjava¢Java"k
-
-squid:S106squid;Standard ouputs should not be used directly to log anythingRMAJORbS106šjava¢Java"Z
- squid:S1192squid(String literals should not be duplicatedRMINORbS1192šjava¢Java"P
-
-squid:S109squid Magic numbers should not be usedRMINORbS109šjava¢Java"f
- squid:S2077squid1Values passed to SQL commands should be sanitizedRCRITICALbS2077šjava¢Java"e
- squid:S2076squid0Values passed to OS commands should be sanitizedRCRITICALbS2076šjava¢Java"y
- squid:S1193squidGException types should not be tested using "instanceof" in catch blocksRMAJORbS1193šjava¢Java"]
- squid:S1190squid+Future keywords should not be used as namesRMAJORbS1190šjava¢Java"b
- squid:S1191squid0Classes from "sun.*" packages should not be usedRMAJORbS1191šjava¢Java"6
- squid:S1444squid:RCRITICALbS1444šjava¢Java"x
- squid:S2864squidF"entrySet()" should be iterated when both the key and value are neededRMAJORbS2864šjava¢Java"¢
-#squid:RightCurlyBraceStartLineChecksquid@A close curly brace should be located at the beginning of a lineRMINORbRightCurlyBraceStartLineCheckšjava¢Java"p
- squid:S2070squid;SHA-1 and Message-Digest hash algorithms should not be usedRCRITICALbS2070šjava¢Java"j
- squid:S1849squid6"Iterator.hasNext()" should not call "Iterator.next()"RBLOCKERbS1849šjava¢Java"f
- squid:S2301squid4Public methods should not contain selector argumentsRMAJORbS2301šjava¢Java"
- squid:S1848squidJObjects should not be created to be dropped immediately without being usedRCRITICALbS1848šjava¢Java"W
- squid:S1199squid%Nested code blocks should not be usedRMAJORbS1199šjava¢Java"ž
- squid:S1844squidj"Object.wait(...)" should never be called on objects that implement "java.util.concurrent.locks.Condition"RBLOCKERbS1844šjava¢Java"p
- squid:S1197squid>Array designators "[]" should be on the type, not the variableRMINORbS1197šjava¢Java"€
- squid:S2066squidK"Serializable" inner classes of non-serializable classes should be "static"RCRITICALbS2066šjava¢Java"n
- squid:S2065squid<Fields in non-serializable classes should not be "transient"RMINORbS2065šjava¢Java"R
- squid:S2970squidAssertions should be completeRCRITICALbS2970šjava¢Java"Y
- squid:S2068squid$Credentials should not be hard-codedRCRITICALbS2068šjava¢Java"i
- squid:S2974squid7Classes without "public" constructors should be "final"RMAJORbS2974šjava¢Java"s
- squid:S2976squid>"File.createTempFile" should not be used to create a directoryRCRITICALbS2976šjava¢Java"Y
- squid:S1068squid'Unused private fields should be removedRMAJORbS1068šjava¢Java"Q
- squid:S1065squidUnused labels should be removedRMAJORbS1065šjava¢Java"}
- squid:MethodCyclomaticComplexitysquid!Methods should not be too complexRMAJORbMethodCyclomaticComplexityšjava¢Java"z
-squid:EmptyStatementUsageChecksquid"Empty statements should be removedRMINORbEmptyStatementUsageCheckšjava¢Java"W
- squid:S1067squid%Expressions should not be too complexRMAJORbS1067šjava¢Java"^
- squid:S1066squid,Collapsible "if" statements should be mergedRMAJORbS1066šjava¢Java"t
- squid:S2061squid?Custom serialization method signatures should meet requirementsRCRITICALbS2061šjava¢Java"Þ
--squid:RightCurlyBraceSameLineAsNextBlockChecksquidhClose curly brace and the next "else", "catch" and "finally" keywords should be located on the same lineRMINORb'RightCurlyBraceSameLineAsNextBlockCheckšjava¢Java"V
- squid:S2063squid$Comparators should be "Serializable"RMAJORbS2063šjava¢Java"i
- squid:S2701squid7Literal boolean values should not be used in assertionsRMAJORbS2701šjava¢Java"y
- squid:S2059squidG"Serializable" inner classes of "Serializable" classes should be staticRMAJORbS2059šjava¢Java"a
- squid:S2057squid/"Serializable" classes should have a version idRMAJORbS2057šjava¢Java"®
- squid:S1596squid|Collections.emptyList(), emptyMap() and emptySet() should be used instead of Collections.EMPTY_LIST, EMPTY_MAP and EMPTY_SETRMAJORbS1596šjava¢Java"“
- squid:S2055squid^The non-serializable super class of a "Serializable" class must have a no-argument constructorRCRITICALbS2055šjava¢Java"h
- squid:S1598squid6Package declaration should match source file directoryRMAJORbS1598šjava¢Java"S
-squid:ParsingErrorsquidJava parser failureRMAJORb ParsingErroršjava¢Java"•
-
-squid:S881squideIncrement (++) and decrement (--) operators should not be mixed with other operators in an expressionRMAJORbS881šjava¢Java"v
- squid:S1724squidDDeprecated classes and interfaces should not be extended/implementedRMAJORbS1724šjava¢Java"w
- squid:S1862squidBRelated "if/else if" statements should not have the same conditionRCRITICALbS1862šjava¢Java"v
- squid:S1860squidBSynchronization should not be based on Strings or boxed primitivesRBLOCKERbS1860šjava¢Java"€
- squid:S1317squidN"StringBuilder" and "StringBuffer" should not be instantiated with a characterRMAJORbS1317šjava¢Java"Q
- squid:S1314squidOctal values should not be usedRMAJORbS1314šjava¢Java"j
- squid:S1315squid8"CHECKSTYLE:OFF" suppression comments should not be usedRMINORbS1315šjava¢Java"}
- squid:S2718squidH"DateUtils.truncate" from Apache Commons Lang library should not be usedRCRITICALbS2718šjava¢Java"s
-squid:IndentationChecksquid+Source code should be indented consistentlyRMINORbIndentationCheckšjava¢Java"c
- squid:S1451squid/Copyright and license headers should be definedRBLOCKERbS1451šjava¢Java"p
- squid:S1452squid>Generic wildcard types should not be used in return parametersRMAJORbS1452šjava¢Java"u
- squid:S1318squid@"object == null" should be used instead of "object.equals(null)"RCRITICALbS1318šjava¢Java"µ
- squid:S1319squid‚Declarations should use Java collection interfaces such as "List" rather than specific implementation classes such as "LinkedList"RMAJORbS1319šjava¢Java"
- squid:S1312squidMLoggers should be "private static final" and should share a naming conventionRMINORbS1312šjava¢Java"V
- squid:S1313squid$IP addresses should not be hardcodedRMAJORbS1313šjava¢Java"
-
-squid:S864squidOLimited dependence should be placed on operator precedence rules in expressionsRMAJORbS864šjava¢Java"a
- squid:S1310squid/"NOPMD" suppression comments should not be usedRMINORbS1310šjava¢Java"h
- squid:S2447squid3Null should not be returned from a "Boolean" methodRCRITICALbS2447šjava¢Java"
- squid:S1850squidM"instanceof" operators that always return "true" or "false" should be removedRMAJORbS1850šjava¢Java"z
- squid:S2583squidFConditions should not unconditionally evaluate to "TRUE" or to "FALSE"RBLOCKERbS2583šjava¢Java"^
- squid:S1710squid,Annotation repetitions should not be wrappedRMAJORbS1710šjava¢Java"o
- squid:S2440squid=Classes with only "static" methods should not be instantiatedRMAJORbS2440šjava¢Java"t
- squid:S2441squid?Non-serializable objects should not be stored in "HttpSessions"RCRITICALbS2441šjava¢Java"_
- squid:S2442squid+"Lock" objects should not be "synchronized"RBLOCKERbS2442šjava¢Java"—
-"squid:ObjectFinalizeOverridenChecksquid4The Object.finalize() method should not be overridenRCRITICALbObjectFinalizeOverridenCheckšjava¢Java"h
- squid:S1858squid6"toString()" should never be called on a String objectRMAJORbS1858šjava¢Java"t
- squid:S2444squid?Lazy initialization of "static" fields should be "synchronized"RCRITICALbS2444šjava¢Java"
- squid:S2445squid[Blocks synchronized on fields should not contain assignments of new objects to those fieldsRBLOCKERbS2445šjava¢Java"O
- squid:S2446squid"notifyAll" should be usedRCRITICALbS2446šjava¢Java"k
- squid:S1301squid9"switch" statements should have at least 3 "case" clausesRMINORbS1301šjava¢Java"f
- squid:S1607squid4Skipped unit tests should be either removed or fixedRMAJORbS1607šjava¢Java"d
- squid:S1309squid3The @SuppressWarnings annotation should not be usedRINFObS1309šjava¢Java"z
- squid:S1604squidHAnonymous inner classes containing only one method should become lambdasRMAJORbS1604šjava¢Java"
- squid:S1602squidOLamdbas containing only one statement should not nest this statement in a blockRMAJORbS1602šjava¢Java"{
-squid:ClassCyclomaticComplexitysquid!Classes should not be too complexRMAJORbClassCyclomaticComplexityšjava¢Java"‹
- squid:S1200squidYClasses should not be coupled to too many other classes (Single Responsibility Principle)RMAJORbS1200šjava¢Java"q
- squid:S1201squid<Methods named "equals" should override Object.equals(Object)RCRITICALbS1201šjava¢Java"f
- squid:S1701squid4Fields and methods should not have conflicting namesRMAJORbS1701šjava¢Java"w
- squid:S1206squidC"equals(Object obj)" and "hashCode()" should be overridden in pairsRBLOCKERbS1206šjava¢Java"o
- squid:S1700squid=A field should not duplicate the name of its containing classRMAJORbS1700šjava¢Java"k
- squid:S2178squid6Short-circuit logic should be used in boolean contextsRCRITICALbS2178šjava¢Java"j
- squid:S2176squid8Class names should not shadow interfaces or superclassesRMAJORbS2176šjava¢Java"Š
- squid:ForLoopCounterChangedChecksquid."for" loop stop conditions should be invariantRMAJORbForLoopCounterChangedCheckšjava¢Java"h
- squid:S2175squid3Inappropriate "Collection" calls should not be madeRCRITICALbS2175šjava¢Java"e
- squid:S2160squid3Subclasses that add fields should override "equals"RMAJORbS2160šjava¢Java"q
- squid:S2162squid<"equals" methods should be symmetric and work for subclassesRCRITICALbS2162šjava¢Java"“
-%squid:RedundantThrowsDeclarationChecksquid-Throws declarations should not be superfluousRMINORbRedundantThrowsDeclarationCheckšjava¢Java"‘
- squid:S1994squid\"for" loop incrementers should modify the variable being tested in the loop's stop conditionRCRITICALbS1994šjava¢Java"\
- squid:S2165squid*"finalize" should not set fields to "null"RMAJORbS2165šjava¢Java"[
- squid:S2164squid&Math should not be performed on floatsRCRITICALbS2164šjava¢Java"f
- squid:S2167squid1"compareTo" should not return "Integer.MIN_VALUE"RCRITICALbS2167šjava¢Java"x
- squid:S2166squidFClasses named like "Exception" should extend "Exception" or a subclassRMAJORbS2166šjava¢Java"g
- squid:S2885squid2"Calendars" and "DateFormats" should not be staticRCRITICALbS2885šjava¢Java"~
- squid:S2694squidLInner classes which do not reference their owning classes should be "static"RMAJORbS2694šjava¢Java"ƒ
- squid:S2695squidO"PreparedStatement" and "ResultSet" methods should be called with valid indicesRBLOCKERbS2695šjava¢Java"h
- squid:S2692squid3"indexOf" checks should not be for positive numbersRCRITICALbS2692šjava¢Java \ No newline at end of file
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search1.protobuf b/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search1.protobuf
new file mode 100644
index 00000000000..5544968df4b
--- /dev/null
+++ b/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search1.protobuf
Binary files differ
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search2.protobuf b/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search2.protobuf
new file mode 100644
index 00000000000..a23bd1d5d81
--- /dev/null
+++ b/sonar-batch/src/test/resources/org/sonar/batch/rule/DefaultActiveRulesLoaderTest/active_rule_search2.protobuf
Binary files differ