]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5007 move api/rules2 to api/rules
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 19 May 2014 12:05:48 +0000 (14:05 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 19 May 2014 12:05:56 +0000 (14:05 +0200)
29 files changed:
sonar-server/src/main/hbs/issues/rule.hbs
sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
sonar-server/src/main/java/org/sonar/server/rule/RubyRuleService.java
sonar-server/src/main/java/org/sonar/server/rule/ws/RuleSearchWsHandler.java [deleted file]
sonar-server/src/main/java/org/sonar/server/rule/ws/RuleShowWsHandler.java [deleted file]
sonar-server/src/main/java/org/sonar/server/rule/ws/RulesWs.java [deleted file]
sonar-server/src/main/java/org/sonar/server/rule/ws/package-info.java [deleted file]
sonar-server/src/main/java/org/sonar/server/rule2/Rule.java
sonar-server/src/main/java/org/sonar/server/rule2/RuleService.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleDoc.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java
sonar-server/src/main/java/org/sonar/server/rule2/ws/RulesWebService.java
sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java
sonar-server/src/main/webapp/WEB-INF/app/controllers/api/rules_controller.rb [deleted file]
sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb
sonar-server/src/main/webapp/WEB-INF/app/controllers/rules_configuration_controller.rb
sonar-server/src/main/webapp/WEB-INF/app/models/internal.rb
sonar-server/src/main/webapp/WEB-INF/app/models/rule.rb
sonar-server/src/main/webapp/WEB-INF/app/views/issue/_rule.html.erb
sonar-server/src/test/java/org/sonar/server/rule/RubyRuleServiceTest.java
sonar-server/src/test/java/org/sonar/server/rule/ws/RuleSearchWsHandlerTest.java [deleted file]
sonar-server/src/test/java/org/sonar/server/rule/ws/RuleShowWsHandlerTest.java [deleted file]
sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWsTest.java [deleted file]
sonar-server/src/test/java/org/sonar/server/rule2/RegisterRulesTest.java
sonar-server/src/test/java/org/sonar/server/rule2/index/RuleFieldTest.java [new file with mode: 0644]
sonar-server/src/test/java/org/sonar/server/rule2/index/RuleIndexMediumTest.java
sonar-server/src/test/java/org/sonar/server/rule2/ws/AppActionTest.java
sonar-server/src/test/java/org/sonar/server/rule2/ws/RulesWebServiceTest.java

index 7fcea0888f3cd9d835048cfbec421c3098fe08e3..f21908ab6621a8fb89dc580024c1f93e16f7f700 100644 (file)
@@ -1,6 +1,6 @@
 <div class="rule-desc">
   <h1 class="marginbottom10">{{name}}</h1>
-  <div class="marginbottom10">{{{description}}}</div>
+  <div class="marginbottom10">{{{htmlDesc}}}</div>
 </div>
 
 <ul class="note code-issue-bar">
@@ -8,4 +8,4 @@
   {{#all characteristic subCharacteristic}}
     <li>{{characteristic}} > {{subCharacteristic}}{{else}}{{t 'issue.technical_debt_deleted'}}</li>
   {{/all}}
-</ul>
\ No newline at end of file
+</ul>
index b339f752715f2bbda0a67d8774b3737c3f489273..9013b1a447c4cd184b70e9ae2240bc8dfde7f29b 100644 (file)
@@ -124,7 +124,6 @@ import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer;
 import org.sonar.server.qualityprofile.persistence.ActiveRuleDao;
 import org.sonar.server.qualityprofile.ws.*;
 import org.sonar.server.rule.*;
-import org.sonar.server.rule.ws.*;
 import org.sonar.server.rule2.RegisterRules;
 import org.sonar.server.rule2.RuleService;
 import org.sonar.server.rule2.index.RuleIndex;
@@ -326,9 +325,6 @@ class ServerComponents {
     pico.addSingleton(RuleRepositories.class);
     pico.addSingleton(DeprecatedRulesDefinition.class);
     pico.addSingleton(RuleDefinitionsLoader.class);
-    pico.addSingleton(RulesWs.class);
-    pico.addSingleton(RuleShowWsHandler.class);
-    pico.addSingleton(RuleSearchWsHandler.class);
     pico.addSingleton(RulesDefinitionXmlLoader.class);
 
     // experimental rules
index e33c061605edb33a0a5ec12494e66a5f251bb410..a614efd3a316a0ca3ab1c2dae3293f51ef93a92c 100644 (file)
@@ -93,10 +93,6 @@ public class RubyRuleService implements ServerComponent, Startable {
       .setDebtRemediationOffset(Strings.emptyToNull((String) params.get("debtRemediationOffset"))));
   }
 
-  public void updateRuleNote(int ruleId, String note) {
-    rules.updateRuleNote(ruleId, note);
-  }
-
   public Integer createCustomRule(int ruleId, @Nullable String name, @Nullable String severity, @Nullable String description, Map<String, String> paramsByKey) {
     return rules.createCustomRule(ruleId, name, severity, description, paramsByKey);
   }
diff --git a/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleSearchWsHandler.java b/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleSearchWsHandler.java
deleted file mode 100644 (file)
index 9aea4cb..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.sonar.api.resources.Language;
-import org.sonar.api.resources.Languages;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.server.debt.DebtRemediationFunction;
-import org.sonar.api.server.ws.Request;
-import org.sonar.api.server.ws.RequestHandler;
-import org.sonar.api.server.ws.Response;
-import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.server.paging.PagedResult;
-import org.sonar.server.rule.Rule;
-import org.sonar.server.rule.RuleQuery;
-import org.sonar.server.rule.Rules;
-import org.sonar.server.util.RubyUtils;
-
-import javax.annotation.CheckForNull;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * @deprecated to be dropped in 4.4
- */
-@Deprecated
-public class RuleSearchWsHandler implements RequestHandler {
-
-  private final Rules rules;
-  private final Languages languages;
-
-  public RuleSearchWsHandler(Rules rules, Languages languages) {
-    this.rules = rules;
-    this.languages = languages;
-  }
-
-  @Override
-  public void handle(Request request, Response response) {
-    final String ruleKeyParam = request.param("k");
-    Collection<Rule> foundRules = Collections.emptyList();
-    boolean hasMore = false;
-    long total = 0L;
-    if (ruleKeyParam == null) {
-      PagedResult<Rule> searchResult = rules.find(RuleQuery.builder()
-        .searchQuery(request.param("s"))
-        .languages(RubyUtils.toStrings(request.param("languages")))
-        .repositories(RubyUtils.toStrings(request.param("repositories")))
-        .severities(RubyUtils.toStrings(request.param("severities")))
-        .statuses(RubyUtils.toStrings(request.param("statuses")))
-        .tags(RubyUtils.toStrings(request.param("tags")))
-        .debtCharacteristics(RubyUtils.toStrings(request.param("debtCharacteristics")))
-        .hasDebtCharacteristic(request.paramAsBoolean("hasDebtCharacteristic"))
-        .pageSize(request.paramAsInt("ps"))
-        .pageIndex(request.paramAsInt("p"))
-        .build());
-      foundRules = searchResult.results();
-      hasMore = searchResult.paging().hasNextPage();
-      total = searchResult.paging().total();
-    } else {
-      RuleKey ruleKey = RuleKey.parse(ruleKeyParam);
-      Rule rule = findRule(ruleKey);
-      if (rule != null) {
-        foundRules = Collections.singleton(rule);
-        total = 1L;
-      }
-      hasMore = false;
-    }
-
-    JsonWriter json = response.newJsonWriter();
-    json.beginObject().name("results").beginArray();
-    for (Rule rule : foundRules) {
-      json.beginObject();
-      writeRule(rule, json);
-      json.endObject();
-    }
-    json.endArray().prop("more", hasMore).prop("total", total).endObject().close();
-  }
-
-  @CheckForNull
-  private Rule findRule(RuleKey ruleKey) {
-    return rules.findByKey(ruleKey);
-  }
-
-  private void writeRule(Rule rule, JsonWriter json) {
-    String languageName = null;
-    String languageKey = rule.language();
-    if (languageKey != null) {
-      Language language = languages.get(languageKey);
-      if (language != null) {
-        languageName = language.getName();
-      } else {
-        languageName = languageKey;
-      }
-    }
-    json
-      .prop("key", rule.ruleKey().toString())
-      .prop("repository", rule.ruleKey().repository())
-      .prop("name", rule.name())
-      .prop("language", languageName)
-      .prop("status", rule.status())
-    ;
-    DebtRemediationFunction function = rule.debtRemediationFunction();
-    if (function != null) {
-      json
-        .prop("debtCharacteristic", rule.debtCharacteristicKey())
-        .prop("debtSubCharacteristic", rule.debtSubCharacteristicKey())
-        .prop("debtRemediationFunction", function.type().name())
-        .prop("debtRemediationCoefficient", function.coefficient())
-        .prop("debtRemediationOffset", function.offset())
-      ;
-    }
-  }
-}
diff --git a/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleShowWsHandler.java b/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleShowWsHandler.java
deleted file mode 100644 (file)
index c250950..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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 com.google.common.base.Strings;
-import org.sonar.api.i18n.I18n;
-import org.sonar.api.resources.Language;
-import org.sonar.api.resources.Languages;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.rules.RulePriority;
-import org.sonar.api.server.ws.Request;
-import org.sonar.api.server.ws.RequestHandler;
-import org.sonar.api.server.ws.Response;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.markdown.Markdown;
-import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.rule.Rule;
-import org.sonar.server.rule.RuleNote;
-import org.sonar.server.rule.Rules;
-import org.sonar.server.user.UserSession;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Date;
-
-/**
- * @deprecated to be dropped in 4.4
- */
-@Deprecated
-public class RuleShowWsHandler implements RequestHandler {
-
-  private final Rules rules;
-  private final Languages languages;
-
-  // Only used to get manual rules
-  private final RuleFinder ruleFinder;
-  private final I18n i18n;
-
-  public RuleShowWsHandler(Rules rules, RuleFinder ruleFinder, I18n i18n, Languages languages) {
-    this.rules = rules;
-    this.ruleFinder = ruleFinder;
-    this.i18n = i18n;
-    this.languages = languages;
-  }
-
-  @Override
-  public void handle(Request request, Response response) {
-    final String ruleKeyParam = request.mandatoryParam("key");
-    RuleKey ruleKey = RuleKey.parse(ruleKeyParam);
-    Rule rule = findRule(ruleKey);
-    if (rule == null) {
-      throw new NotFoundException("Rule not found: " + ruleKey);
-    }
-
-    JsonWriter json = response.newJsonWriter();
-    json.beginObject().name("rule").beginObject();
-    writeRule(rule, json);
-    writeTags(rule, json);
-    json.endObject().endObject().close();
-  }
-
-  @CheckForNull
-  private Rule findRule(RuleKey ruleKey) {
-    // TODO remove this when manual rules are indexed in E/S
-    if (ruleKey.repository().equals(Rule.MANUAL_REPOSITORY_KEY)) {
-      org.sonar.api.rules.Rule rule = ruleFinder.findByKey(ruleKey);
-      if (rule != null) {
-        RulePriority severity = rule.getSeverity();
-        return new Rule.Builder()
-          .setKey(rule.getKey())
-          .setRepositoryKey(rule.getRepositoryKey())
-          .setName(rule.getName())
-          .setDescription(rule.getDescription())
-          .setSeverity(severity != null ? severity.name() : null)
-          .setStatus(rule.getStatus())
-          .setCreatedAt(rule.getCreatedAt())
-          .setUpdatedAt(rule.getUpdatedAt()).build();
-      }
-      return null;
-    } else {
-      return rules.findByKey(ruleKey);
-    }
-  }
-
-  private void writeRule(Rule rule, JsonWriter json) {
-    json
-      .prop("key", rule.ruleKey().toString())
-      .prop("name", rule.name())
-      .prop("description", rule.description());
-    addLanguage(rule, json);
-    addNote(rule, json);
-    addDate(rule.createdAt(), "createdAt", json);
-    addFormattedDate(rule.createdAt(), "fCreatedAt", json);
-    addDate(rule.updatedAt(), "updatedAt", json);
-    addFormattedDate(rule.updatedAt(), "fUpdatedAt", json);
-  }
-
-  private void addLanguage(Rule rule, JsonWriter json) {
-    String languageKey = rule.language();
-    if (languageKey != null) {
-      Language language = languages.get(languageKey);
-      json.prop("language", language == null ? languageKey : language.getName());
-    }
-  }
-
-  private void addNote(Rule rule, JsonWriter json) {
-    RuleNote ruleNote = rule.ruleNote();
-    if (ruleNote != null && !Strings.isNullOrEmpty(ruleNote.data())) {
-      json.prop("noteRaw", ruleNote.data())
-        .prop("noteHtml", Markdown.convertToHtml(ruleNote.data()));
-    }
-  }
-
-  private void writeTags(Rule rule, JsonWriter json) {
-    json.name("tags").beginArray();
-    for (String adminTag : rule.adminTags()) {
-      json.value(adminTag);
-    }
-    json.endArray();
-
-    json.name("sysTags").beginArray();
-    for (String systemTag : rule.systemTags()) {
-      json.value(systemTag);
-    }
-    json.endArray();
-  }
-
-  private void addDate(@Nullable Date date, String dateKey, JsonWriter json) {
-    if (date != null) {
-      json.prop(dateKey, DateUtils.formatDateTime(date));
-    }
-  }
-
-  private void addFormattedDate(@Nullable Date date, String dateKey, JsonWriter json) {
-    if (date != null) {
-      json.prop(dateKey, i18n.formatDateTime(UserSession.get().locale(), date));
-    }
-  }
-
-
-}
diff --git a/sonar-server/src/main/java/org/sonar/server/rule/ws/RulesWs.java b/sonar-server/src/main/java/org/sonar/server/rule/ws/RulesWs.java
deleted file mode 100644 (file)
index 74c52e9..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.sonar.api.server.ws.WebService;
-
-/**
- * @deprecated to be dropped in 4.4
- */
-@Deprecated
-public class RulesWs implements WebService {
-
-  private final RuleSearchWsHandler searchHandler;
-  private final RuleShowWsHandler showHandler;
-
-  public RulesWs(RuleSearchWsHandler searchHandler, RuleShowWsHandler showHandler) {
-    this.searchHandler = searchHandler;
-    this.showHandler = showHandler;
-  }
-
-  @Override
-  public void define(Context context) {
-    NewController controller = context.createController("api/rules")
-      .setDescription("Coding rules");
-
-    controller.createAction("list")
-      .setDescription("List rules that match the given criteria")
-      .setSince("4.3")
-      .setInternal(true)
-      .setHandler(searchHandler)
-      .createParam("s", "To return rules whose title contains this string.")
-      .createParam("k", "Key of the rule, for example : 'findbugs:DMI_USELESS_SUBSTRING'.")
-      .createParam("languages", "Comma-separated list of language keys")
-      .createParam("repositories", "Comma-separated list of repositories")
-      .createParam("severities", "Comma-separated list of severities. Possible values: INFO | MINOR | MAJOR | CRITICAL | BLOCKER.")
-      .createParam("statuses", "Comma-separated list of statuses. Possible values: READY | BETA | DEPRECATED.")
-      .createParam("tags", "Comma-separated list of tags. The rule is returned if it matches all the tags.")
-      .createParam("debtCharacteristics", "Comma-separated list of characteristics / sub-characteristics.")
-      .createParam("hasDebtCharacteristic", "Determine if returned rules should be linked to a debt characteristic or not. Possible values: true | false")
-      .createParam("ps", "Page size (default is 25).")
-      .createParam("p", "Page number (default is 1).");
-
-    controller.createAction("show")
-      .setDescription("Detail of rule")
-      .setSince("4.2")
-      .setHandler(showHandler)
-      .createParam("key", "Mandatory key of rule");
-
-    controller.done();
-  }
-}
diff --git a/sonar-server/src/main/java/org/sonar/server/rule/ws/package-info.java b/sonar-server/src/main/java/org/sonar/server/rule/ws/package-info.java
deleted file mode 100644 (file)
index 432ce93..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.rule.ws;
-
-import javax.annotation.ParametersAreNonnullByDefault;
index 3278441635dfd1a555c1ba72bef2d8c0ccb95853..f12863dcbed67319f0caaf85c67372ca3ad00d1b 100644 (file)
@@ -81,4 +81,10 @@ public interface Rule {
 
   @CheckForNull
   String internalKey();
+
+  @CheckForNull
+  String noteAsMarkdown();
+
+  @CheckForNull
+  String noteLogin();
 }
index 48c55f912364081078a49077e1a49c3cd7eef85a..977314c7915bc8b472f4c69693cdce40bcaafc53 100644 (file)
@@ -67,7 +67,6 @@ public class RuleService implements ServerComponent {
   public RuleResult search(RuleQuery query, QueryOptions options) {
     // keep only supported fields and add the fields to always return
     options.filterFieldsToReturn(RuleIndex.PUBLIC_FIELDS);
-    options.addFieldsToReturn(RuleNormalizer.RuleField.REPOSITORY.key(), RuleNormalizer.RuleField.KEY.key());
 
     RuleResult result =  index.search(query, options);
     for(Rule rule:result.getHits()){
index 7f2ba41279f24d46ec3e5a97cfe28c80eaeca1ac..770c1a022f87d457a23819fb9f5fdb4fb97ad1e9 100644 (file)
@@ -153,7 +153,8 @@ class RuleDoc implements Rule {
   @Override
   @CheckForNull
   public String debtCharacteristicKey() {
-    throw new UnsupportedOperationException("TODO");
+    // TO BE IMPLEMENTED
+    return null;
   }
 
   @Override
@@ -188,6 +189,20 @@ class RuleDoc implements Rule {
     }
   }
 
+  @Override
+  @CheckForNull
+  public String noteAsMarkdown() {
+    // TODO
+    return null;
+  }
+
+  @Override
+  @CheckForNull
+  public String noteLogin() {
+    // TODO
+    return null;
+  }
+
   @Override
   @CheckForNull
   public Date createdAt() {
index 3cb41566c71340b9ee7aa472b4c08434f14eeb8d..c8a31b78294819a5413d8ea31fa1d43a3d94889b 100644 (file)
@@ -220,23 +220,19 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
 
     /* integrate Option's Fields */
     Set<String> fields = new HashSet<String>();
-    if (options.getFieldsToReturn() != null &&
-      !options.getFieldsToReturn().isEmpty()) {
-      for (String field : options.getFieldsToReturn()) {
-        fields.add(field);
-      }
+    if (options.getFieldsToReturn() != null && !options.getFieldsToReturn().isEmpty()) {
+      fields.addAll(options.getFieldsToReturn());
+      // required fields
+      // TODO remove REPOSITORY ? Move this list to RuleField constant ?
+      fields.add(RuleNormalizer.RuleField.KEY.key());
+      fields.add(RuleNormalizer.RuleField.REPOSITORY.key());
     } else {
-      for (RuleNormalizer.RuleField field : RuleNormalizer.RuleField.values()) {
-          fields.add(field.key());
-      }
+      fields = RuleNormalizer.RuleField.ALL_KEYS;
     }
-    //Add required fields:
-    fields.add(RuleNormalizer.RuleField.KEY.key());
-    fields.add(RuleNormalizer.RuleField.REPOSITORY.key());
 
     //TODO limit source for available fields.
     //esSearch.addFields(fields.toArray(new String[fields.size()]));
-    //esSearch.setSource(StringUtils.join(fields,','));
+    //esSearch.setSource(StringUtils.join(fields, ','));
 
     return esSearch;
   }
index b0d1639ae01f8530e3dabadb3398264bb94a40c5..60136da024d3f11a4149b57a6f5234c0bf756851 100644 (file)
  */
 package org.sonar.server.rule2.index;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import org.elasticsearch.action.update.UpdateRequest;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.check.Cardinality;
@@ -28,9 +32,11 @@ import org.sonar.core.rule.RuleParamDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.search.BaseNormalizer;
 
+import javax.annotation.Nullable;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
 
@@ -68,6 +74,13 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
     public String toString() {
       return key;
     }
+
+    public static final Set<String> ALL_KEYS = ImmutableSet.copyOf(Collections2.transform(Lists.newArrayList(RuleField.values()), new Function<RuleField, String>() {
+      @Override
+      public String apply(@Nullable RuleField input) {
+        return input != null ? input.key : null;
+      }
+    }));
   }
 
   public static enum RuleParamField {
index 9969e4d625e106c355d37d122bbd1f8fee279a48..577804438690561c2cc08f1e7104f483295f9a01 100644 (file)
@@ -43,7 +43,7 @@ public class RulesWebService implements WebService {
   @Override
   public void define(Context context) {
     NewController controller = context
-      .createController("api/rules2")
+      .createController("api/rules")
       .setDescription("Coding rules");
 
     search.define(controller);
index fa67533102f073d9f91eb4c234493561a96a6188..1aa166b059e712d22d985af010eab89cc02a4165 100644 (file)
@@ -149,12 +149,16 @@ public abstract class BaseIndex<D, E extends Dto<K>, K extends Serializable>
   public abstract D toDoc(GetResponse response);
 
   public D getByKey(K key) {
-    return toDoc(getClient().prepareGet()
+    GetResponse response = getClient().prepareGet()
       .setType(this.getIndexType())
       .setIndex(this.getIndexName())
       .setId(this.getKeyValue(key))
       .setRouting(this.getKeyValue(key))
-      .get());
+      .get();
+    if (response.isExists()) {
+      return toDoc(response);
+    }
+    return null;
   }
 
   private void insertDocument(UpdateRequest request, K key) throws Exception {
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/rules_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/rules_controller.rb
deleted file mode 100644 (file)
index 5d0230d..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#
-# 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.
-#
-require 'fastercsv'
-require "json"
-
-class Api::RulesController < Api::RestController
-
-  def rest_call
-    set_backward_compatibility_params
-    language = params[:language] || ''
-    options= {}
-
-    options[:repositories]=params[:plugins].split(',') if params[:plugins]
-    options[:language]=language
-    options[:priorities]=params[:priorities].split(',') if params[:priorities]
-    options[:activation]=params[:status]
-    options[:searchtext]=params[:searchtext]
-    options[:include_parameters_and_notes]=true
-    options[:inheritance]=params[:inheritance]
-
-
-    if params[:profile]
-      profile = Profile.find_by_name_and_language(params[:profile], language)
-      if profile.nil?
-        rest_render([])
-      else
-        options[:profile]=profile
-        rules = Rule.search(java_facade, options)
-        rest_render(rules, profile)
-      end
-    else
-      rules = Rule.search(java_facade, options)
-      rest_render(rules)
-    end
-  end
-
-  def set_backward_compatibility_params
-    params[:plugins]=params[:plugin] if params[:plugin]
-    params[:priorities]=params[:levels] if params[:levels]
-  end
-
-
-  private
-
-  def rest_render(rules=[], profile=nil)
-    respond_to do |format|
-      format.json{ render :json => rest_to_json(rules, profile) }
-      format.xml { render :xml => rest_to_xml(rules, profile) }
-      format.csv {
-        send_data(rest_to_csv(rules, profile),
-          :type => 'text/csv; charset=utf-8; header=present',
-          :disposition => 'attachment; filename=rules.csv')
-      }
-    end
-  end
-
-  def rest_to_json(rules, profile)
-    JSON(rules.collect{|rule| rule.to_hash_json(profile)})
-  end
-
-  def rest_to_xml(rules, profile)
-    xml = Builder::XmlMarkup.new(:indent => 0)
-    xml.instruct!
-    xml.rules do
-      rules.each do |rule|
-        rule.to_xml(profile, xml)
-      end
-    end
-  end
-
-  def rest_to_csv(rules, profile)
-    FasterCSV.generate do |csv|
-      header = ["title", "key", "plugin"]
-      header.concat(["priority","status"]) if profile
-      csv << header
-      rules.each do |rule|
-        csv << rule.to_csv(profile)
-      end
-    end
-  end
-
-end
index 9d37e5ac83e059ea7c748e6081518cda68e2adca..147e75619b7a9a9f9f1da7aa9f4d72c24fe2f755 100644 (file)
@@ -186,7 +186,7 @@ class IssueController < ApplicationController
     verify_ajax_request
     require_parameters :id
 
-    @rule = Internal.rules.findByKey(params[:id])
+    @rule = Internal.rules.getByKey(Java::OrgSonarApiRule::RuleKey.parse(params[:id]))
     if @rule.debtCharacteristicKey()
       @characteristic = Internal.debt.characteristicByKey(@rule.debtCharacteristicKey())
       @sub_characteristic = Internal.debt.characteristicByKey(@rule.debtSubCharacteristicKey())
index ddfb9f2df5a70857d4e3daf387e0b2fe64365589..d4f6ddeb7c5f8f4a8f3bc1d82fb41b181af47062 100644 (file)
@@ -102,30 +102,6 @@ class RulesConfigurationController < ApplicationController
     @rule = Internal.quality_profiles.findByRule(params[:rule_id].to_i)
   end
 
-  #
-  #
-  # POST /rules_configuration/create/<profile id>?rule_id=<rule id>&rule[name]=<new name>&...
-  #
-  #
-  def create
-    verify_post_request
-    require_parameters :id, :rule_id
-
-    profile_id = params[:id].to_i
-    rule_id = params[:rule_id].to_i
-    new_rule = nil
-    call_backend do
-      new_rule_id = Internal.rules.createCustomRule(rule_id, params[:rule][:name], params[:rule][:priority], params[:rule][:description], params[:rule_param])
-      new_rule = Internal.quality_profiles.findByRule(new_rule_id)
-    end
-
-    if new_rule
-      redirect_to :action => 'index', :id => profile_id, :searchtext => "\"#{new_rule.name()}\"", :rule_activation => 'INACTIVE', "plugins[]" => new_rule.repositoryKey()
-    else
-      redirect_to :action => 'new', :id => profile_id, :rule_id => rule_id
-    end
-  end
-
 
   # deprecated since 2.3
   def export
@@ -154,46 +130,6 @@ class RulesConfigurationController < ApplicationController
     end
   end
 
-  #
-  #
-  # POST /rules_configuration/update/<profile id>?rule_id=<rule id>&rule[name]=<new name>&...
-  #
-  #
-  def update
-    verify_post_request
-    require_parameters :id, :rule_id
-
-    profile_id = params[:id].to_i
-    rule_id = params[:rule_id].to_i
-    rule = nil
-    call_backend do
-      Internal.rules.updateCustomRule(rule_id, params[:rule][:name], params[:rule][:priority], params[:rule][:description], params[:rule_param])
-      rule = Internal.quality_profiles.findByRule(rule_id)
-    end
-
-    if rule
-      redirect_to :action => 'index', :id => profile_id, :searchtext => "\"#{rule.name()}\"", :rule_activation => '', "plugins[]" => rule.repositoryKey()
-    else
-      redirect_to :action => 'new', :id => profile_id, :rule_id => rule_id
-    end
-  end
-
-
-  #
-  #
-  # POST /rules_configuration/delete/<profile id>?rule_id=<rule id>
-  #
-  #
-  def delete
-    verify_post_request
-    require_parameters :id, :rule_id
-
-    call_backend do
-      Internal.rules.deleteCustomRule(params[:rule_id].to_i)
-      flash[:notice]=message('rules_configuration.rule_deleted')
-    end
-    redirect_to :action => 'index', :id => params[:id]
-  end
 
   #
   #
@@ -236,59 +172,6 @@ class RulesConfigurationController < ApplicationController
     redirect_to url_parameters
   end
 
-
-  def update_param
-    verify_post_request
-
-    access_denied unless has_role?(:profileadmin)
-    require_parameters :param_id, :active_rule_id, :profile_id
-
-    rule = nil
-    profile_id = params[:profile_id].to_i
-    active_rule_id = params[:active_rule_id].to_i
-    call_backend do
-      Internal.quality_profiles.updateActiveRuleParam(active_rule_id, params[:param_id], params[:value])
-      rule = Internal.quality_profiles.findByActiveRuleId(active_rule_id)
-    end
-
-    profile = Internal.quality_profiles.profile(profile_id)
-    parent_profile = Internal.quality_profiles.parent(profile)
-    render :partial => 'rule', :locals => {:rule => rule, :profile => profile, :parent_profile => parent_profile}
-  end
-
-
-  def update_rule_note
-    verify_post_request
-    require_parameters :rule_id, :active_rule_id
-
-    rule = nil
-    call_backend do
-      Internal.rules.updateRuleNote(params[:rule_id].to_i, params[:text])
-      rule = Internal.quality_profiles.findByActiveRuleId(params[:active_rule_id].to_i)
-    end
-    render :partial => 'rule_note', :locals => {:rule => rule}
-  end
-
-  def show_select_tags
-    rule = Internal.quality_profiles.findByRule(params[:rule_id].to_i)
-    tags = tag_selection_for_rule(rule)
-    render :partial => 'select_tags', :locals => { :rule => rule, :tags => tags, :profile_id => params[:profile_id] }
-  end
-
-  def select_tags
-    Internal.rules.updateRuleTags(params[:rule_id].to_i, params[:tags])
-    rule = Internal.quality_profiles.findByRule(params[:rule_id].to_i)
-    render :partial => 'rule_tags', :locals => {:rule => rule}
-  end
-
-  def create_tag
-    Internal.rule_tags.create(params[:new_tag])
-    rule = Internal.quality_profiles.findByRule(params[:rule_id].to_i)
-    tags = tag_selection_for_rule(rule)
-
-    render :partial => 'select_tags_list', :locals => {:tags => tags}
-  end
-
   private
 
   def init_params
index c4091a7798bf881fdda2219b0de34e11b7321687..94edbdbfc5d0994233b08d77ae66a607f5671f69 100644 (file)
@@ -79,7 +79,7 @@ class Internal
   end
 
   def self.rules
-    component(Java::OrgSonarServerRule::RubyRuleService.java_class)
+    component(Java::OrgSonarServerRule2::RuleService.java_class)
   end
 
   def self.durations
index e84dd3ff84725b81ab41d5805a9f7d5cb10943a2..55cfc0549a14558deac3056bad322c4397ac8fca 100644 (file)
@@ -256,34 +256,6 @@ class Rule < ActiveRecord::Base
     csv
   end
 
-
-  # 'unused' parameter used to be available to inject java_facade, kept for compatibility w/ plugins (e.g sqale)
-  # options :language => nil, :repositories => [], :searchtext => '', :profile => nil, :priorities => [], :activation => '', :status => [], :sort_by => nil
-  def self.search(unused, options={})
-    # First, perform search with rule-specific criteria
-    java_hash = {}
-    options.each do |key, value|
-      java_hash[key.to_s] = Array(value).join("|")
-    end
-    params = java.util.HashMap.new(java_hash)
-
-    # SONAR-5048 Group results by 1000 due to fix issue on Oracle db
-    rules = []
-    matching_rule_ids = Array(Internal.rules.findIds(params))
-    unless matching_rule_ids.empty?
-      ids_grouped = matching_rule_ids.each_slice(1000).to_a
-      ids_condition = []
-      ids_grouped.each do |group|
-        ids_condition << 'id in (' + group.join(',') + ')'
-      end
-
-      includes=(options[:include_parameters_and_notes] ? [:rules_parameters] : nil)
-      rules = Rule.all(:include => includes, :conditions => [ids_condition.join(' or ')])
-      rules = Rule.sort_by(rules, options[:sort_by])
-    end
-    filter(rules, options)
-  end
-
   def self.remove_blank(array)
     if array
       array = array - ['']
index 81135a4e4371272b6f33ff5af499a7400c075096..360b2c7afd46b53931b655c0aa90586337cb067c 100644 (file)
@@ -1,21 +1,21 @@
-<h1 class="marginbottom10"><%= h @rule.name %></h1>
+<h1 class="marginbottom10"><%= h @rule.name() -%></h1>
 
 <div class="marginbottom10">
-  <% if @rule.description.strip.start_with?('<p>') %>
-    <%= Internal.text.interpretMacros(@rule.description) %>
+  <% if @rule.htmlDescription.strip.start_with?('<p>') %>
+    <%= Internal.text.interpretMacros(@rule.htmlDescription) %>
   <% else %>
-    <p><%= Internal.text.interpretMacros(@rule.description) %></p>
+    <p><%= Internal.text.interpretMacros(@rule.htmlDescription) %></p>
   <% end %>
 </div>
 
-<% if @rule.ruleNote() %>
+<% if @rule.noteAsMarkdown() %>
   <div class="marginbottom10">
-    <%= Api::Utils.markdown_to_html(@rule.ruleNote().data()) -%>
+    <%= Api::Utils.markdown_to_html(@rule.noteAsMarkdown()) -%>
   </div>
 <% end %>
 
 <p class="note">
-  <span class="spacer-right"><%= h @rule.ruleKey() -%></span>
+  <span class="spacer-right"><%= h @rule.key() -%></span>
   <%= image_tag 'sep12.png', :class => 'spacer-right' -%>
   <% if @characteristic && @sub_characteristic %>
     <%= @characteristic.name -%>&nbsp;&gt;&nbsp;<%= @sub_characteristic.name -%>
index 23ec6119db4ee4ad8f6a7951ef30fb8bc1ff790c..084b7c544d6a11fd20f36603075cf5f05ac8a73b 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.rule;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import org.junit.Before;
@@ -33,7 +32,6 @@ import org.sonar.api.rule.Severity;
 
 import java.util.Map;
 
-import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.fest.assertions.Assertions.assertThat;
 import static org.mockito.Mockito.verify;
@@ -99,12 +97,6 @@ public class RubyRuleServiceTest {
     assertThat(ruleChange.debtRemediationOffset()).isEqualTo("10min");
   }
 
-  @Test
-  public void update_rule_note() {
-    facade.updateRuleNote(10, "My note");
-    verify(rules).updateRuleNote(10, "My note");
-  }
-
   @Test
   public void create_custom_rule() {
     facade.createCustomRule(10, "Rule name", Severity.MAJOR, "My note", ImmutableMap.of("max", "20"));
@@ -129,40 +121,6 @@ public class RubyRuleServiceTest {
     verify(rules).findByKey(RuleKey.of("repo", "key"));
   }
 
-  @Test
-  public void find_by_params() {
-    Map<String, Object> params = newHashMap();
-    params.put("searchQuery", "NPE");
-    params.put("key", "rule");
-    params.put("languages", newArrayList("java", "xoo"));
-    params.put("repositories", newArrayList("pmd", "checkstyle"));
-    params.put("severities", newArrayList("MINOR", "MAJOR"));
-    params.put("statuses", newArrayList("READY", "BETA"));
-    params.put("tags", newArrayList("has-params", "keep-enabled"));
-    params.put("debtCharacteristics", newArrayList("MODULARITY", "REUSABILITY"));
-    params.put("hasDebtCharacteristic", "true");
-
-    params.put("pageSize", 10l);
-    params.put("pageIndex", 50);
-
-    facade.find(params);
-    ArgumentCaptor<RuleQuery> ruleQueryCaptor = ArgumentCaptor.forClass(RuleQuery.class);
-    verify(rules).find(ruleQueryCaptor.capture());
-
-    RuleQuery query = ruleQueryCaptor.getValue();
-    assertThat(query.searchQuery()).isEqualTo("NPE");
-    assertThat(query.key()).isEqualTo("rule");
-    assertThat(query.languages()).containsOnly("java", "xoo");
-    assertThat(query.repositories()).containsOnly("pmd", "checkstyle");
-    assertThat(query.severities()).containsOnly("MINOR", "MAJOR");
-    assertThat(query.statuses()).containsOnly("READY", "BETA");
-    assertThat(query.tags()).containsOnly("has-params", "keep-enabled");
-    assertThat(query.debtCharacteristics()).containsOnly("MODULARITY", "REUSABILITY");
-    assertThat(query.hasDebtCharacteristic()).isTrue();
-    assertThat(query.pageSize()).isEqualTo(10);
-    assertThat(query.pageIndex()).isEqualTo(50);
-  }
-
   @Test
   public void just_for_fun_and_coverage() throws Exception {
     facade.start();
diff --git a/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleSearchWsHandlerTest.java b/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleSearchWsHandlerTest.java
deleted file mode 100644 (file)
index f9022f5..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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 com.google.common.collect.ImmutableList;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.resources.Language;
-import org.sonar.api.resources.Languages;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.server.debt.DebtRemediationFunction;
-import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
-import org.sonar.server.ws.WsTester;
-import org.sonar.server.paging.PagedResult;
-import org.sonar.server.paging.PagingResult;
-import org.sonar.server.rule.Rule;
-import org.sonar.server.rule.RuleQuery;
-import org.sonar.server.rule.Rules;
-import org.sonar.server.user.MockUserSession;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class RuleSearchWsHandlerTest {
-
-  @Mock
-  Rules rules;
-
-  @Mock
-  Languages languages;
-
-  Rule.Builder ruleBuilder = new Rule.Builder()
-    .setKey("AvoidCycle")
-    .setRepositoryKey("squid")
-    .setName("Avoid cycle")
-    .setDescription("Avoid cycle between packages")
-    .setLanguage("java")
-    .setStatus("READY")
-    .setDebtCharacteristicKey("REUSABILITY")
-    .setDebtSubCharacteristicKey("MODULARITY")
-    .setDebtRemediationFunction(new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET, "1h", "15min"));
-
-  WsTester tester;
-
-  @Before
-  public void setUp() throws Exception {
-    tester = new WsTester(new RulesWs(new RuleSearchWsHandler(rules, languages), mock(RuleShowWsHandler.class)));
-  }
-
-  @Test
-  public void search_rules() throws Exception {
-    final int pageSize = 10;
-    final int pageIndex = 2;
-    Rule rule = ruleBuilder.build();
-
-    when(rules.find(any(RuleQuery.class))).thenReturn(
-      new PagedResult<Rule>(ImmutableList.of(rule), PagingResult.create(pageSize, pageIndex, 1)));
-    Language lang = mock(Language.class);
-    when(lang.getName()).thenReturn("Java");
-    when(languages.get("java")).thenReturn(lang);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "list").setParam("ps", "10").setParam("p", "2");
-    request.execute().assertJson(getClass(), "search_rules.json");
-  }
-
-  @Test
-  public void search_rule_by_key() throws Exception {
-    String ruleKey = "squid:AvoidCycle";
-    Rule rule = ruleBuilder.build();
-
-    when(rules.findByKey(RuleKey.parse(ruleKey))).thenReturn(rule);
-    Language lang = mock(Language.class);
-    when(lang.getName()).thenReturn("Java");
-    when(languages.get("java")).thenReturn(lang);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "list").setParam("k", ruleKey);
-    request.execute().assertJson(getClass(), "search_rules.json");
-  }
-
-  @Test
-  public void verify_rule_query_filters() throws Exception {
-    Rule rule = ruleBuilder.build();
-
-    when(rules.find(any(RuleQuery.class))).thenReturn(
-      new PagedResult<Rule>(ImmutableList.of(rule), PagingResult.create(10, 1, 1)));
-
-    MockUserSession.set();
-    tester.newGetRequest("api/rules", "list")
-      .setParam("languages", "java,js")
-      .setParam("repositories", "squid,pmd")
-      .setParam("severities", "MAJOR,MINOR")
-      .setParam("statuses", "READY,BETA")
-      .setParam("tags", "has-params,integration-tests")
-      .setParam("debtCharacteristics", "MODULARITY,REUSABILITY")
-      .setParam("hasDebtCharacteristic", "true")
-      .execute();
-
-    ArgumentCaptor<RuleQuery> ruleQueryCaptor = ArgumentCaptor.forClass(RuleQuery.class);
-    verify(rules).find(ruleQueryCaptor.capture());
-
-    assertThat(ruleQueryCaptor.getValue().languages()).containsOnly("java", "js");
-    assertThat(ruleQueryCaptor.getValue().repositories()).containsOnly("squid", "pmd");
-    assertThat(ruleQueryCaptor.getValue().severities()).containsOnly("MAJOR", "MINOR");
-    assertThat(ruleQueryCaptor.getValue().statuses()).containsOnly("READY", "BETA");
-    assertThat(ruleQueryCaptor.getValue().tags()).containsOnly("has-params", "integration-tests");
-    assertThat(ruleQueryCaptor.getValue().debtCharacteristics()).containsOnly("MODULARITY", "REUSABILITY");
-    assertThat(ruleQueryCaptor.getValue().hasDebtCharacteristic()).isTrue();
-  }
-
-}
diff --git a/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleShowWsHandlerTest.java b/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleShowWsHandlerTest.java
deleted file mode 100644 (file)
index e426dd9..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * 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 com.google.common.collect.ImmutableList;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.i18n.I18n;
-import org.sonar.api.resources.Language;
-import org.sonar.api.resources.Languages;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.server.ws.WsTester;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.rule.Rule;
-import org.sonar.server.rule.RuleNote;
-import org.sonar.server.rule.Rules;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Date;
-import java.util.Locale;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.fest.assertions.Fail.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class RuleShowWsHandlerTest {
-
-  @Mock
-  Rules rules;
-
-  @Mock
-  Languages languages;
-
-  @Mock
-  RuleFinder ruleFinder;
-
-  @Mock
-  I18n i18n;
-
-  Rule.Builder ruleBuilder = new Rule.Builder()
-    .setKey("AvoidCycle")
-    .setRepositoryKey("squid")
-    .setName("Avoid cycle")
-    .setLanguage("xoo")
-    .setDescription("Avoid cycle between packages");
-
-  WsTester tester;
-
-  @Before
-  public void setUp() throws Exception {
-    tester = new WsTester(new RulesWs(mock(RuleSearchWsHandler.class), new RuleShowWsHandler(rules, ruleFinder, i18n, languages)));
-  }
-
-  @Test
-  public void show_rule() throws Exception {
-    String ruleKey = "squid:AvoidCycle";
-    Rule rule = ruleBuilder.build();
-
-    when(rules.findByKey(RuleKey.of("squid", "AvoidCycle"))).thenReturn(rule);
-    Language language = mock(Language.class);
-    when(language.getName()).thenReturn("Xoo");
-    when(languages.get("xoo")).thenReturn(language);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", ruleKey);
-    request.execute().assertJson(getClass(), "show_rule.json");
-  }
-
-  @Test
-  public void return_not_found_on_unknown_rule() throws Exception {
-    String ruleKey = "squid:AvoidCycle";
-
-    when(rules.findByKey(RuleKey.of("squid", "AvoidCycle"))).thenReturn(null);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", ruleKey);
-
-    try {
-      request.execute();
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(NotFoundException.class);
-    }
-  }
-
-  @Test
-  public void show_rule_with_dates() throws Exception {
-    Date date1 = DateUtils.parseDateTime("2014-01-22T19:10:03+0100");
-    Date date2 = DateUtils.parseDateTime("2014-01-23T19:10:03+0100");
-    Rule rule = ruleBuilder
-      .setCreatedAt(date1)
-      .setUpdatedAt(date2)
-      .build();
-
-    when(rules.findByKey(RuleKey.of("squid", "AvoidCycle"))).thenReturn(rule);
-    when(i18n.formatDateTime(any(Locale.class), eq(date1))).thenReturn("Jan 22, 2014 10:03 AM");
-    when(i18n.formatDateTime(any(Locale.class), eq(date2))).thenReturn("Jan 23, 2014 10:03 AM");
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", rule.ruleKey().toString());
-    request.execute().assertJson(getClass(), "show_rule_with_dates.json");
-  }
-
-  @Test
-  public void show_rule_with_note() throws Exception {
-    RuleNote note = mock(RuleNote.class);
-    when(note.data()).thenReturn("*Extended rule description*");
-    Rule rule = ruleBuilder
-      .setRuleNote(note)
-      .build();
-
-    when(rules.findByKey(RuleKey.of("squid", "AvoidCycle"))).thenReturn(rule);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", rule.ruleKey().toString());
-    request.execute().assertJson(getClass(), "show_rule_with_note.json");
-  }
-
-  @Test
-  public void show_rule_with_tags() throws Exception {
-    Rule rule = ruleBuilder
-      .setAdminTags(ImmutableList.of("complexity"))
-      .setSystemTags(ImmutableList.of("security"))
-      .build();
-
-    when(rules.findByKey(RuleKey.of("squid", "AvoidCycle"))).thenReturn(rule);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", rule.ruleKey().toString());
-    request.execute().assertJson(getClass(), "show_rule_with_tags.json");
-  }
-
-  @Test
-  public void show_manual_rule() throws Exception {
-    String ruleKey = "manual:api";
-    when(ruleFinder.findByKey(RuleKey.of("manual", "api"))).thenReturn(
-      org.sonar.api.rules.Rule.create("manual", "api", "API").setDescription("API rule description"));
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", ruleKey);
-    request.execute();
-    request.execute().assertJson(getClass(), "show_manuel_rule.json");
-  }
-
-  @Test
-  public void show_manual_rule_without_severity() throws Exception {
-    String ruleKey = "manual:api";
-    org.sonar.api.rules.Rule rule = mock(org.sonar.api.rules.Rule.class);
-    when(rule.getKey()).thenReturn("api");
-    when(rule.getRepositoryKey()).thenReturn("manual");
-    when(rule.getName()).thenReturn("API");
-    when(rule.getDescription()).thenReturn("API rule description");
-    when(rule.getSeverity()).thenReturn(null);
-    when(ruleFinder.findByKey(RuleKey.of("manual", "api"))).thenReturn(rule);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", ruleKey);
-    request.execute();
-    request.execute().assertJson(getClass(), "show_manuel_rule.json");
-  }
-
-  @Test
-  public void return_not_found_on_unknown_manual_rule() throws Exception {
-    String ruleKey = "manual:api";
-
-    when(rules.findByKey(RuleKey.of("squid", "AvoidCycle"))).thenReturn(null);
-
-    MockUserSession.set();
-    WsTester.TestRequest request = tester.newGetRequest("api/rules", "show").setParam("key", ruleKey);
-
-    try {
-      request.execute();
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(NotFoundException.class);
-    }
-  }
-
-}
diff --git a/sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWsTest.java b/sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWsTest.java
deleted file mode 100644 (file)
index 45cbb6b..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.server.ws.WebService;
-import org.sonar.server.ws.WsTester;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-@RunWith(MockitoJUnitRunner.class)
-public class RulesWsTest {
-
-  @Mock
-  RuleSearchWsHandler searchHandler;
-
-  @Mock
-  RuleShowWsHandler showHandler;
-
-  WsTester tester;
-
-  @Before
-  public void setUp() {
-    tester = new WsTester(new RulesWs(searchHandler, showHandler));
-  }
-
-  @Test
-  public void define_ws() throws Exception {
-    WebService.Controller controller = tester.controller("api/rules");
-    assertThat(controller).isNotNull();
-    assertThat(controller.path()).isEqualTo("api/rules");
-    assertThat(controller.description()).isNotEmpty();
-    assertThat(controller.actions()).hasSize(2);
-
-    WebService.Action list = controller.action("list");
-    assertThat(list).isNotNull();
-    assertThat(list.handler()).isNotNull();
-    assertThat(list.since()).isEqualTo("4.3");
-    assertThat(list.isPost()).isFalse();
-    assertThat(list.isInternal()).isTrue();
-    assertThat(list.params()).hasSize(11);
-
-    WebService.Action show = controller.action("show");
-    assertThat(show).isNotNull();
-    assertThat(show.handler()).isNotNull();
-    assertThat(show.since()).isEqualTo("4.2");
-    assertThat(show.isPost()).isFalse();
-    assertThat(show.isInternal()).isFalse();
-  }
-}
index 0c723c6862de2c1d58e0f0bcf9adb892e75195f4..51e87308a4747f699477b7e5257d9f2bb55eaf99 100644 (file)
@@ -123,10 +123,12 @@ public class RegisterRulesTest extends AbstractDaoTestCase {
     execute(new FakeRepositoryV1());
     assertThat(dbClient.ruleDao().findAll(dbSession)).hasSize(2);
 
-    // user adds tags
+    // user adds tags and sets markdown note
     RuleKey ruleKey1 = RuleKey.of("fake", "rule1");
     RuleDto rule1 = dbClient.ruleDao().getByKey(ruleKey1, dbSession);
     rule1.setTags(Sets.newHashSet("usertag1", "usertag2"));
+    rule1.setNoteData("user *note*");
+    rule1.setNoteUserLogin("marius");
     dbClient.ruleDao().update(rule1, dbSession);
     dbSession.commit();
 
@@ -141,6 +143,8 @@ public class RegisterRulesTest extends AbstractDaoTestCase {
     assertThat(rule1.getTags()).containsOnly("usertag1", "usertag2");
     assertThat(rule1.getSystemTags()).containsOnly("tag1", "tag4");
     assertThat(rule1.getConfigKey()).isEqualTo("config1 v2");
+    assertThat(rule1.getNoteData()).isEqualTo("user *note*");
+    assertThat(rule1.getNoteUserLogin()).isEqualTo("marius");
     assertThat(rule1.getStatus()).isEqualTo(RuleStatus.READY.toString());
     assertThat(rule1.getCreatedAt()).isEqualTo(DATE1);
     assertThat(rule1.getUpdatedAt()).isEqualTo(DATE2);
diff --git a/sonar-server/src/test/java/org/sonar/server/rule2/index/RuleFieldTest.java b/sonar-server/src/test/java/org/sonar/server/rule2/index/RuleFieldTest.java
new file mode 100644 (file)
index 0000000..529364c
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * 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.rule2.index;
+
+import org.junit.Test;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class RuleFieldTest {
+
+  @Test
+  public void all_rule_fields() throws Exception {
+    assertThat(RuleNormalizer.RuleField.ALL_KEYS).contains(
+      RuleNormalizer.RuleField.KEY.key(), RuleNormalizer.RuleField.REPOSITORY.key(), RuleNormalizer.RuleField.TAGS.key(),
+      RuleNormalizer.RuleField.CREATED_AT.key());
+  }
+
+  @Test
+  public void key_of_rule_field() throws Exception {
+    assertThat(RuleNormalizer.RuleField.INTERNAL_KEY.key()).isEqualTo("internalKey");
+  }
+}
index dbfcbade6a1b3845acb7ccf6f73537468a5895e1..8f2756062474a73772804c37c90b55d5215e5f25 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.server.rule2.index;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -66,7 +67,7 @@ public class RuleIndexMediumTest {
   }
 
   @Test
-  public void insert_rule() throws InterruptedException {
+  public void getByKey() throws InterruptedException {
     RuleDto ruleDto = newRuleDto(RuleKey.of("javascript", "S001"));
     dao.insert(ruleDto, dbSession);
     dbSession.commit();
@@ -78,21 +79,23 @@ public class RuleIndexMediumTest {
 
     assertThat(rule.htmlDescription()).isEqualTo(ruleDto.getDescription());
     assertThat(rule.key()).isEqualTo(ruleDto.getKey());
-//
+
 //    assertThat(rule.debtSubCharacteristicKey())
 //      .isEqualTo(ruleDto.getDefaultSubCharacteristicId().toString());
     assertThat(rule.debtRemediationFunction().type().name())
       .isEqualTo(ruleDto.getRemediationFunction());
 
+    assertThat(Sets.newHashSet(rule.tags())).isEqualTo(ruleDto.getTags());
+    assertThat(Sets.newHashSet(rule.systemTags())).isEqualTo(ruleDto.getSystemTags());
+  }
 
-//
-//    assertThat(rule.tags()).containsExactly(ruleDto.getTags());
-//    assertThat(rule.systemTags()).containsExactly(ruleDto.getSystemTags());
-
+  @Test
+  public void getByKey_null_if_not_found() throws InterruptedException {
+    Rule rule = index.getByKey(RuleKey.of("javascript", "unknown"));
 
+    assertThat(rule).isNull();
   }
 
-
   @Test
   public void facet_test_with_repository() {
     dao.insert(newRuleDto(RuleKey.of("javascript", "S001")).setRuleKey("X001"), dbSession);
@@ -135,7 +138,6 @@ public class RuleIndexMediumTest {
 
   @Test
   @Ignore
-  //TODO discuss if enforced in WS only.
   public void select_doc_fields_to_return() {
     dao.insert(newRuleDto(RuleKey.of("javascript", "S001")), dbSession);
     dbSession.commit();
@@ -367,7 +369,7 @@ public class RuleIndexMediumTest {
     // tag1 in query
     query = new RuleQuery().setQueryText("tag1");
     assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
-    assertThat(Iterables.getFirst(index.search(query, new QueryOptions()).getHits(),null).tags()).containsExactly("tag1");
+    assertThat(Iterables.getFirst(index.search(query, new QueryOptions()).getHits(), null).tags()).containsExactly("tag1");
 
     // tag1 and tag2 in query
     query = new RuleQuery().setQueryText("tag1 tag2");
@@ -376,7 +378,7 @@ public class RuleIndexMediumTest {
     // tag2 in filter
     query = new RuleQuery().setTags(ImmutableSet.of("tag2"));
     assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
-    assertThat(Iterables.getFirst(index.search(query, new QueryOptions()).getHits(),null).tags()).containsExactly("tag2");
+    assertThat(Iterables.getFirst(index.search(query, new QueryOptions()).getHits(), null).tags()).containsExactly("tag2");
 
     // tag2 in filter and tag1 tag2 in query
     query = new RuleQuery().setTags(ImmutableSet.of("tag2")).setQueryText("tag1");
@@ -385,7 +387,7 @@ public class RuleIndexMediumTest {
     // tag2 in filter and tag1 in query
     query = new RuleQuery().setTags(ImmutableSet.of("tag2")).setQueryText("tag1 tag2");
     assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
-    assertThat(Iterables.getFirst(index.search(query, new QueryOptions()).getHits(),null).tags()).containsExactly("tag2");
+    assertThat(Iterables.getFirst(index.search(query, new QueryOptions()).getHits(), null).tags()).containsExactly("tag2");
 
     // null list => no filter
     query = new RuleQuery().setTags(Collections.<String>emptySet());
index 253cf78f04562a4ae0d6c4f460164eb2afd636ac..3a40f2b2a62f7db4117fed8094b8a0f0e9ac3b82 100644 (file)
@@ -105,6 +105,6 @@ public class AppActionTest {
     char2.setId(24).setParentId(parentId).setKey("MODULARITY").setName("Modularity");
     when(debtModel.allCharacteristics()).thenReturn(ImmutableList.<DebtCharacteristic>of(char1, char2));
 
-    tester.newGetRequest("api/rules2", "app").execute().assertJson(this.getClass(), "app.json");
+    tester.newGetRequest("api/rules", "app").execute().assertJson(this.getClass(), "app.json");
   }
 }
index dda30b9df463e075ca53965849393993c7c91e2a..d456a9bd443d8354f71649ac4bf7a13ff45eda5a 100644 (file)
@@ -83,7 +83,7 @@ public class RulesWebServiceTest {
     WebService.Context context = new WebService.Context();
     ws.define(context);
 
-    WebService.Controller controller = context.controller("api/rules2");
+    WebService.Controller controller = context.controller("api/rules");
 
     assertThat(controller).isNotNull();
     assertThat(controller.actions()).hasSize(6);
@@ -99,7 +99,7 @@ public class RulesWebServiceTest {
   public void search_no_rules() throws Exception {
 
     MockUserSession.set();
-    WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
+    WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "search");
 
     WsTester.Result result = request.execute();
 
@@ -115,7 +115,7 @@ public class RulesWebServiceTest {
     tester.get(RuleService.class).refresh();
 
     MockUserSession.set();
-    WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
+    WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "search");
     WsTester.Result result = request.execute();
 
     String json = result.outputAsString();
@@ -137,7 +137,7 @@ public class RulesWebServiceTest {
     tester.get(RuleService.class).refresh();
 
     MockUserSession.set();
-    WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
+    WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "search");
     WsTester.Result result = request.execute();
 
     result.assertJson(this.getClass(),"search_debt_rule.json");
@@ -161,7 +161,7 @@ public class RulesWebServiceTest {
 
 
     MockUserSession.set();
-    WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
+    WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "search");
     request.setParam("q","S001");
     WsTester.Result result = request.execute();
 
@@ -208,7 +208,7 @@ public class RulesWebServiceTest {
     tester.get(RuleService.class).refresh();
 
     MockUserSession.set();
-    WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
+    WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "search");
     request.setParam("q", "S001");
     WsTester.Result result = request.execute();
 
@@ -236,7 +236,7 @@ public class RulesWebServiceTest {
 
 
     MockUserSession.set();
-    WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "tags");
+    WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "tags");
     WsTester.Result result = request.execute();
 
     result.assertJson(this.getClass(),"get_tags.json");