*/
package org.sonar.server.rule;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
-import java.util.List;
-import static com.google.common.collect.Lists.newArrayList;
+import java.util.Map;
public class NewRule {
private RuleKey templateKey;
private String name, htmlDescription, severity;
private RuleStatus status;
- private List<NewRuleParam> params = newArrayList();
+ private final Map<String, String> params = Maps.newHashMap();
public boolean isTemplate() {
return isTemplate;
return templateKey;
}
+ /**
+ * For the creation a custom rule
+ */
public NewRule setTemplateKey(@Nullable RuleKey templateKey) {
this.templateKey = templateKey;
return this;
return this;
}
- public List<NewRuleParam> params() {
+ public Map<String, String> params() {
return params;
}
@CheckForNull
- public NewRuleParam param(final String paramKey) {
- return Iterables.find(params, new Predicate<NewRuleParam>() {
- @Override
- public boolean apply(@Nullable NewRuleParam input) {
- return input != null && input.key().equals(paramKey);
- }
- }, null);
+ public String param(final String paramKey) {
+ return params.get(paramKey);
}
- public NewRule setParams(List<NewRuleParam> params) {
- this.params = params;
+ public NewRule setParams(Map<String, String> params) {
+ this.params.clear();
+ this.params.putAll(params);
return this;
}
}
+++ /dev/null
-/*
- * 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.server.rule;
-
-public class NewRuleParam {
-
- String key, defaultValue;
-
- public NewRuleParam(String key) {
- this.key = key;
- }
-
- public String key() {
- return key;
- }
-
-
- public String defaultValue() {
- return defaultValue;
- }
-
- public NewRuleParam setDefaultValue(String defaultValue) {
- this.defaultValue = defaultValue;
- return this;
- }
-
-}
dbClient.ruleDao().insert(dbSession, ruleDto);
for (RuleParamDto templateRuleParamDto : dbClient.ruleDao().findRuleParamsByRuleKey(dbSession, templateRuleDto.getKey())) {
- NewRuleParam newRuleParam = newRule.param(templateRuleParamDto.getName());
+ String newRuleParam = newRule.param(templateRuleParamDto.getName());
if (newRuleParam == null) {
throw new IllegalArgumentException(String.format("The parameter '%s' has not been set", templateRuleParamDto.getName()));
}
return ruleKey;
}
- private void createCustomRuleParams(NewRuleParam param, RuleDto ruleDto, RuleParamDto templateRuleParam, DbSession dbSession){
+ private void createCustomRuleParams(String param, RuleDto ruleDto, RuleParamDto templateRuleParam, DbSession dbSession){
RuleParamDto ruleParamDto = RuleParamDto.createFor(ruleDto)
- .setName(param.key())
+ .setName(templateRuleParam.getName())
.setType(templateRuleParam.getType())
.setDescription(templateRuleParam.getDescription())
- .setDefaultValue(param.defaultValue());
+ .setDefaultValue(param);
dbClient.ruleDao().addRuleParam(dbSession, ruleDto, ruleParamDto);
}
import org.sonar.api.server.ws.RequestHandler;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
+import org.sonar.api.utils.KeyValueFormat;
import org.sonar.server.rule.NewRule;
import org.sonar.server.rule.RuleService;
public class CreateAction implements RequestHandler {
public static final String PARAM_NAME = "name";
- public static final String PARAM_DESCRIPTION = "description";
+ public static final String PARAM_DESCRIPTION = "html_description";
public static final String PARAM_SEVERITY = "severity";
public static final String PARAM_STATUS = "status";
public static final String PARAM_TEMPLATE_KEY = "template_key";
+ public static final String PARAMS = "params";
private final RuleService service;
- private final RuleMapping mapping;
- public CreateAction(RuleService service, RuleMapping mapping) {
+ public CreateAction(RuleService service) {
this.service = service;
- this.mapping = mapping;
}
void define(WebService.NewController controller) {
.setRequired(true)
.setDefaultValue(RuleStatus.READY)
.setPossibleValues(RuleStatus.values());
+
+ action.createParam(PARAMS)
+ .setDescription("Parameters as semi-colon list of <key>=<value>, for example 'params=key1=v1;key2=v2'.");
}
@Override
.setHtmlDescription(request.mandatoryParam(PARAM_DESCRIPTION))
.setSeverity(request.mandatoryParam(PARAM_SEVERITY))
.setStatus(RuleStatus.valueOf(request.mandatoryParam(PARAM_STATUS)));
-
+ String params = request.param(PARAMS);
+ if (params != null) {
+ newRule.setParams(KeyValueFormat.parse(params));
+ }
service.create(newRule);
}
}
private final SearchAction search;
private final ShowAction show;
private final TagsAction tags;
+ private final CreateAction create;
private final AppAction app;
private final UpdateAction update;
- public RulesWebService(SearchAction search, ShowAction show, TagsAction tags,
+ public RulesWebService(SearchAction search, ShowAction show, TagsAction tags, CreateAction create,
AppAction app, UpdateAction update) {
this.search = search;
this.show = show;
this.tags = tags;
+ this.create = create;
this.app = app;
this.update = update;
}
tags.define(controller);
app.define(controller);
update.define(controller);
+ create.define(controller);
controller.done();
}
package org.sonar.server.rule;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import org.junit.After;
import org.junit.Before;
import java.util.List;
-import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
.setHtmlDescription("Some description")
.setSeverity(Severity.MAJOR)
.setStatus(RuleStatus.READY)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
RuleKey customRuleKey = creator.create(newRule);
dbSession.clearCache();
.setHtmlDescription("Some description")
.setSeverity(Severity.MAJOR)
.setStatus(RuleStatus.READY)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
try {
creator.create(newRule);
.setName("My custom")
.setSeverity(Severity.MAJOR)
.setStatus(RuleStatus.READY)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
try {
creator.create(newRule);
.setName("My custom")
.setHtmlDescription("Some description")
.setStatus(RuleStatus.READY)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
try {
creator.create(newRule);
.setHtmlDescription("Some description")
.setSeverity("INVALID")
.setStatus(RuleStatus.READY)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
try {
creator.create(newRule);
.setName("My custom")
.setHtmlDescription("Some description")
.setSeverity(Severity.MAJOR)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
try {
creator.create(newRule);
.setHtmlDescription("Some description")
.setSeverity(Severity.MAJOR)
.setStatus(RuleStatus.READY)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
try {
creator.create(newRule);
*/
package org.sonar.server.rule;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import org.junit.After;
import org.junit.Before;
import java.util.Collections;
import java.util.Set;
-import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
.setHtmlDescription("Some description")
.setSeverity(Severity.MAJOR)
.setStatus(RuleStatus.READY)
- .setParams(newArrayList(new NewRuleParam("regex").setDefaultValue("a.*")));
+ .setParams(ImmutableMap.of("regex", "a.*"));
RuleKey customRuleKey = service.create(newRule);
dbSession.clearCache();
public void should_generate_app_init_info() throws Exception {
AppAction app = new AppAction(languages, ruleRepositories, i18n, debtModel, qualityProfileService);
WsTester tester = new WsTester(new RulesWebService(
- mock(SearchAction.class), mock(ShowAction.class), mock(TagsAction.class),
+ mock(SearchAction.class), mock(ShowAction.class), mock(TagsAction.class), mock(CreateAction.class),
app, mock(UpdateAction.class)));
MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
--- /dev/null
+/*
+ * 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.server.rule.ws;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rule.RuleStatus;
+import org.sonar.server.rule.NewRule;
+import org.sonar.server.rule.RuleService;
+import org.sonar.server.ws.WsTester;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CreateActionTest {
+
+ @Mock
+ RuleService ruleService;
+
+ @Captor
+ ArgumentCaptor<NewRule> newRuleCaptor;
+
+ WsTester tester;
+
+ @Before
+ public void setUp() throws Exception {
+ tester = new WsTester(new RulesWebService(mock(SearchAction.class), mock(ShowAction.class), mock(TagsAction.class), new CreateAction(ruleService),
+ mock(AppAction.class), mock(UpdateAction.class)));
+ }
+
+ @Test
+ public void create_custom_rule() throws Exception {
+ WsTester.TestRequest request = tester.newGetRequest("api/rules", "create")
+ .setParam("template_key", "java:S001")
+ .setParam("name", "My custom rule")
+ .setParam("html_description", "Description")
+ .setParam("severity", "MAJOR")
+ .setParam("status", "BETA")
+ .setParam("params", "key=value");
+ request.execute();
+
+ verify(ruleService).create(newRuleCaptor.capture());
+
+ NewRule newRule = newRuleCaptor.getValue();
+ assertThat(newRule.templateKey()).isEqualTo(RuleKey.of("java", "S001"));
+ assertThat(newRule.name()).isEqualTo("My custom rule");
+ assertThat(newRule.htmlDescription()).isEqualTo("Description");
+ assertThat(newRule.severity()).isEqualTo("MAJOR");
+ assertThat(newRule.status()).isEqualTo(RuleStatus.BETA);
+ assertThat(newRule.params()).hasSize(1);
+ assertThat(newRule.params().get("key")).isEqualTo("value");
+ }
+}
WebService.Controller controller = context.controller(API_ENDPOINT);
assertThat(controller).isNotNull();
- assertThat(controller.actions()).hasSize(5);
+ assertThat(controller.actions()).hasSize(6);
assertThat(controller.action(API_SEARCH_METHOD)).isNotNull();
assertThat(controller.action(API_SHOW_METHOD)).isNotNull();
assertThat(controller.action(API_TAGS_METHOD)).isNotNull();
assertThat(controller.action("update")).isNotNull();
+ assertThat(controller.action("create")).isNotNull();
assertThat(controller.action("app")).isNotNull();
}