]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4535 Split QProfileOperations into QProfileActiveRuleOperations and QProfileRul...
authorJulien Lancelot <julien.lancelot@gmail.com>
Tue, 24 Dec 2013 11:44:12 +0000 (12:44 +0100)
committerJulien Lancelot <julien.lancelot@gmail.com>
Tue, 24 Dec 2013 11:44:12 +0000 (12:44 +0100)
sonar-server/src/main/java/org/sonar/server/platform/Platform.java
sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActiveRuleOperations.java [new file with mode: 0644]
sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileOperations.java
sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileRuleOperations.java [new file with mode: 0644]
sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfiles.java
sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileActiveRuleOperationsTest.java [new file with mode: 0644]
sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileOperationsTest.java
sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileRuleOperationsTest.java [new file with mode: 0644]
sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfilesTest.java

index 123b26fd8658e950c9ef7e9eb1b8442287a94bdd..a8937abc1255ea659cf5078a26a13a706a3884b8 100644 (file)
@@ -90,10 +90,7 @@ import org.sonar.server.permission.InternalPermissionService;
 import org.sonar.server.permission.InternalPermissionTemplateService;
 import org.sonar.server.permission.PermissionFinder;
 import org.sonar.server.plugins.*;
-import org.sonar.server.qualityprofile.QProfileOperations;
-import org.sonar.server.qualityprofile.QProfileProjectService;
-import org.sonar.server.qualityprofile.QProfileSearch;
-import org.sonar.server.qualityprofile.QProfiles;
+import org.sonar.server.qualityprofile.*;
 import org.sonar.server.rule.ProfileRules;
 import org.sonar.server.rule.RubyRuleService;
 import org.sonar.server.rule.RuleRegistry;
@@ -280,6 +277,8 @@ public final class Platform {
     servicesContainer.addSingleton(QProfiles.class);
     servicesContainer.addSingleton(QProfileSearch.class);
     servicesContainer.addSingleton(QProfileOperations.class);
+    servicesContainer.addSingleton(QProfileActiveRuleOperations.class);
+    servicesContainer.addSingleton(QProfileRuleOperations.class);
     servicesContainer.addSingleton(QProfileProjectService.class);
 
     // users
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActiveRuleOperations.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileActiveRuleOperations.java
new file mode 100644 (file)
index 0000000..1a304d0
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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.qualityprofile;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import org.apache.commons.lang.math.NumberUtils;
+import org.apache.ibatis.session.SqlSession;
+import org.sonar.api.PropertyType;
+import org.sonar.api.ServerComponent;
+import org.sonar.api.rule.Severity;
+import org.sonar.api.rules.RulePriority;
+import org.sonar.api.utils.System2;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.preview.PreviewCache;
+import org.sonar.core.qualityprofile.db.ActiveRuleDao;
+import org.sonar.core.qualityprofile.db.ActiveRuleDto;
+import org.sonar.core.qualityprofile.db.ActiveRuleParamDto;
+import org.sonar.core.qualityprofile.db.QualityProfileDto;
+import org.sonar.core.rule.RuleDao;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.core.rule.RuleParamDto;
+import org.sonar.server.configuration.ProfilesManager;
+import org.sonar.server.exceptions.BadRequestException;
+import org.sonar.server.rule.RuleRegistry;
+import org.sonar.server.user.UserSession;
+
+import java.util.Date;
+import java.util.List;
+
+public class QProfileActiveRuleOperations implements ServerComponent {
+
+  private final MyBatis myBatis;
+  private final ActiveRuleDao activeRuleDao;
+  private final RuleDao ruleDao;
+  private final PreviewCache dryRunCache;
+  private final RuleRegistry ruleRegistry;
+  private final ProfilesManager profilesManager;
+
+  private final System2 system;
+
+  public QProfileActiveRuleOperations(MyBatis myBatis, ActiveRuleDao activeRuleDao, RuleDao ruleDao, PreviewCache dryRunCache, RuleRegistry ruleRegistry, ProfilesManager profilesManager) {
+    this(myBatis, activeRuleDao, ruleDao, dryRunCache, ruleRegistry,
+      profilesManager, System2.INSTANCE);
+  }
+
+  @VisibleForTesting
+  QProfileActiveRuleOperations(MyBatis myBatis, ActiveRuleDao activeRuleDao, RuleDao ruleDao, PreviewCache dryRunCache, RuleRegistry ruleRegistry,
+                               ProfilesManager profilesManager, System2 system) {
+    this.myBatis = myBatis;
+    this.activeRuleDao = activeRuleDao;
+    this.ruleDao = ruleDao;
+    this.dryRunCache = dryRunCache;
+    this.ruleRegistry = ruleRegistry;
+    this.profilesManager = profilesManager;
+    this.system = system;
+  }
+
+  public ActiveRuleDto createActiveRule(QualityProfileDto qualityProfile, RuleDto rule, String severity, UserSession userSession) {
+    checkPermission(userSession);
+    checkSeverity(severity);
+    SqlSession session = myBatis.openSession();
+    try {
+      ActiveRuleDto activeRule = new ActiveRuleDto()
+        .setProfileId(qualityProfile.getId())
+        .setRuleId(rule.getId())
+        .setSeverity(Severity.ordinal(severity));
+      activeRuleDao.insert(activeRule, session);
+
+      List<RuleParamDto> ruleParams = ruleDao.selectParameters(rule.getId(), session);
+      List<ActiveRuleParamDto> activeRuleParams = Lists.newArrayList();
+      for (RuleParamDto ruleParam : ruleParams) {
+        ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto()
+          .setActiveRuleId(activeRule.getId())
+          .setRulesParameterId(ruleParam.getId())
+          .setKey(ruleParam.getName())
+          .setValue(ruleParam.getDefaultValue());
+        activeRuleParams.add(activeRuleParam);
+        activeRuleDao.insert(activeRuleParam, session);
+      }
+      session.commit();
+
+      RuleInheritanceActions actions = profilesManager.activated(qualityProfile.getId(), activeRule.getId(), userSession.name());
+      reindexInheritanceResult(actions, session);
+
+      return activeRule;
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void updateSeverity(ActiveRuleDto activeRule, String newSeverity, UserSession userSession) {
+    checkPermission(userSession);
+    checkSeverity(newSeverity);
+    SqlSession session = myBatis.openSession();
+    try {
+      Integer oldSeverity = activeRule.getSeverity();
+      activeRule.setSeverity(Severity.ordinal(newSeverity));
+      activeRuleDao.update(activeRule, session);
+      session.commit();
+
+      RuleInheritanceActions actions = profilesManager.ruleSeverityChanged(activeRule.getProfileId(), activeRule.getId(),
+        RulePriority.valueOfInt(oldSeverity), RulePriority.valueOf(newSeverity),
+        userSession.name());
+      reindexInheritanceResult(actions, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void deactivateRule(ActiveRuleDto activeRule, UserSession userSession) {
+    checkPermission(userSession);
+
+    SqlSession session = myBatis.openSession();
+    try {
+      RuleInheritanceActions actions = profilesManager.deactivated(activeRule.getProfileId(), activeRule.getId(), userSession.name());
+
+      activeRuleDao.deleteParameters(activeRule.getId(), session);
+      activeRuleDao.delete(activeRule.getId(), session);
+      actions.addToDelete(activeRule.getId());
+      session.commit();
+
+      reindexInheritanceResult(actions, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void createActiveRuleParam(ActiveRuleDto activeRule, String key, String value, UserSession userSession) {
+    checkPermission(userSession);
+
+    SqlSession session = myBatis.openSession();
+    try {
+      RuleParamDto ruleParam = findRuleParamNotNull(activeRule.getRulId(), key, session);
+      validateParam(ruleParam.getType(), value);
+      ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto().setActiveRuleId(activeRule.getId()).setKey(key).setValue(value).setRulesParameterId(ruleParam.getId());
+      activeRuleDao.insert(activeRuleParam, session);
+      session.commit();
+
+      RuleInheritanceActions actions = profilesManager.ruleParamChanged(activeRule.getProfileId(), activeRule.getId(), key, null, value, userSession.name());
+      reindexInheritanceResult(actions, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void deleteActiveRuleParam(ActiveRuleDto activeRule, ActiveRuleParamDto activeRuleParam, UserSession userSession) {
+    checkPermission(userSession);
+
+    SqlSession session = myBatis.openSession();
+    try {
+      activeRuleDao.deleteParameter(activeRuleParam.getId(), session);
+      session.commit();
+
+      RuleInheritanceActions actions = profilesManager.ruleParamChanged(activeRule.getProfileId(), activeRule.getId(), activeRuleParam.getKey(), activeRuleParam.getValue(),
+        null, userSession.name());
+      reindexInheritanceResult(actions, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void updateActiveRuleParam(ActiveRuleDto activeRule, ActiveRuleParamDto activeRuleParam, String value, UserSession userSession) {
+    checkPermission(userSession);
+
+    SqlSession session = myBatis.openSession();
+    try {
+      RuleParamDto ruleParam = findRuleParamNotNull(activeRule.getRulId(), activeRuleParam.getKey(), session);
+      validateParam(ruleParam.getType(), value);
+
+      String sanitizedValue = Strings.emptyToNull(value);
+      String oldValue = activeRuleParam.getValue();
+      activeRuleParam.setValue(sanitizedValue);
+      activeRuleDao.update(activeRuleParam, session);
+      session.commit();
+
+      RuleInheritanceActions actions = profilesManager.ruleParamChanged(activeRule.getProfileId(), activeRule.getId(), activeRuleParam.getKey(), oldValue,
+        sanitizedValue, getLoggedName(userSession));
+      reindexInheritanceResult(actions, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void updateActiveRuleNote(ActiveRuleDto activeRule, String note, UserSession userSession) {
+    checkPermission(userSession);
+    Date now = new Date(system.now());
+    SqlSession session = myBatis.openSession();
+    try {
+      if (activeRule.getNoteData() == null) {
+        activeRule.setNoteCreatedAt(now);
+        activeRule.setNoteUserLogin(userSession.login());
+      }
+      activeRule.setNoteUpdatedAt(now);
+      activeRule.setNoteData(note);
+      activeRuleDao.update(activeRule, session);
+      session.commit();
+
+      reindexActiveRule(activeRule, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void deleteActiveRuleNote(ActiveRuleDto activeRule, UserSession userSession) {
+    checkPermission(userSession);
+
+    SqlSession session = myBatis.openSession();
+    try {
+      activeRule.setNoteData(null);
+      activeRule.setNoteUserLogin(null);
+      activeRule.setNoteCreatedAt(null);
+      activeRule.setNoteUpdatedAt(null);
+      activeRuleDao.update(activeRule);
+      session.commit();
+
+      reindexActiveRule(activeRule, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  private void reindexInheritanceResult(RuleInheritanceActions actions, SqlSession session) {
+    ruleRegistry.deleteActiveRules(actions.idsToDelete());
+    List<ActiveRuleDto> activeRules = activeRuleDao.selectByIds(actions.idsToIndex(), session);
+    Multimap<Integer, ActiveRuleParamDto> paramsByActiveRule = ArrayListMultimap.create();
+    for (ActiveRuleParamDto param : activeRuleDao.selectParamsByActiveRuleIds(actions.idsToIndex(), session)) {
+      paramsByActiveRule.put(param.getActiveRuleId(), param);
+    }
+    ruleRegistry.bulkIndexActiveRules(activeRules, paramsByActiveRule);
+  }
+
+  private void reindexActiveRule(ActiveRuleDto activeRuleDto, SqlSession session) {
+    ruleRegistry.save(activeRuleDto, activeRuleDao.selectParamsByActiveRuleId(activeRuleDto.getId(), session));
+  }
+
+  private void checkPermission(UserSession userSession) {
+    userSession.checkLoggedIn();
+    userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  }
+
+  private String getLoggedName(UserSession userSession) {
+    String name = userSession.name();
+    if (Strings.isNullOrEmpty(name)) {
+      throw new BadRequestException("User name can't be null");
+    }
+    return name;
+  }
+
+  private void checkSeverity(String severity) {
+    if (!Severity.ALL.contains(severity)) {
+      throw new BadRequestException("The severity is not valid");
+    }
+  }
+
+  private RuleParamDto findRuleParamNotNull(Integer ruleId, String key, SqlSession session) {
+    RuleParamDto ruleParam = ruleDao.selectParamByRuleAndKey(ruleId, key, session);
+    if (ruleParam == null) {
+      throw new IllegalArgumentException("No rule param found");
+    }
+    return ruleParam;
+  }
+
+  private void validateParam(String type, String value) {
+    if (type.equals(PropertyType.INTEGER.name()) && !NumberUtils.isDigits(value)) {
+      throw new BadRequestException(String.format("Value '%s' must be an integer.", value));
+    }
+  }
+
+}
index 9f235992527db3ecb3e9885153b71ec39978efe6..474c99e1f211817604f7c0d185b711d69ab522b1 100644 (file)
 package org.sonar.server.qualityprofile;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Strings;
 import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
 import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.NumberUtils;
 import org.apache.ibatis.session.SqlSession;
-import org.sonar.api.PropertyType;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.profiles.ProfileImporter;
 import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.rule.Severity;
 import org.sonar.api.rules.ActiveRule;
 import org.sonar.api.rules.ActiveRuleParam;
-import org.sonar.api.rules.Rule;
 import org.sonar.api.rules.RulePriority;
 import org.sonar.api.utils.System2;
 import org.sonar.api.utils.ValidationMessages;
-import org.sonar.check.Cardinality;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.preview.PreviewCache;
@@ -49,15 +41,11 @@ import org.sonar.core.properties.PropertiesDao;
 import org.sonar.core.properties.PropertyDto;
 import org.sonar.core.qualityprofile.db.*;
 import org.sonar.core.rule.RuleDao;
-import org.sonar.core.rule.RuleDto;
-import org.sonar.core.rule.RuleParamDto;
-import org.sonar.server.configuration.ProfilesManager;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.rule.RuleRegistry;
 import org.sonar.server.user.UserSession;
 
 import java.io.StringReader;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -75,7 +63,6 @@ public class QProfileOperations implements ServerComponent {
   private final List<ProfileImporter> importers;
   private final PreviewCache dryRunCache;
   private final RuleRegistry ruleRegistry;
-  private final ProfilesManager profilesManager;
 
   private final System2 system;
 
@@ -83,21 +70,18 @@ public class QProfileOperations implements ServerComponent {
    * Used by pico when no plugin provide profile exporter / importer
    */
   public QProfileOperations(MyBatis myBatis, QualityProfileDao dao, ActiveRuleDao activeRuleDao, RuleDao ruleDao, PropertiesDao propertiesDao,
-                            PreviewCache dryRunCache, RuleRegistry ruleRegistry, ProfilesManager profilesManager) {
-    this(myBatis, dao, activeRuleDao, ruleDao, propertiesDao, Lists.<ProfileImporter>newArrayList(), dryRunCache, ruleRegistry,
-      profilesManager, System2.INSTANCE);
+                            PreviewCache dryRunCache, RuleRegistry ruleRegistry) {
+    this(myBatis, dao, activeRuleDao, ruleDao, propertiesDao, Lists.<ProfileImporter>newArrayList(), dryRunCache, ruleRegistry, System2.INSTANCE);
   }
 
   public QProfileOperations(MyBatis myBatis, QualityProfileDao dao, ActiveRuleDao activeRuleDao, RuleDao ruleDao, PropertiesDao propertiesDao,
-                            List<ProfileImporter> importers, PreviewCache dryRunCache, RuleRegistry ruleRegistry, ProfilesManager profilesManager) {
-    this(myBatis, dao, activeRuleDao, ruleDao, propertiesDao, importers, dryRunCache, ruleRegistry,
-      profilesManager, System2.INSTANCE);
+                            List<ProfileImporter> importers, PreviewCache dryRunCache, RuleRegistry ruleRegistry) {
+    this(myBatis, dao, activeRuleDao, ruleDao, propertiesDao, importers, dryRunCache, ruleRegistry, System2.INSTANCE);
   }
 
   @VisibleForTesting
   QProfileOperations(MyBatis myBatis, QualityProfileDao dao, ActiveRuleDao activeRuleDao, RuleDao ruleDao, PropertiesDao propertiesDao,
-                     List<ProfileImporter> importers, PreviewCache dryRunCache, RuleRegistry ruleRegistry,
-                     ProfilesManager profilesManager, System2 system) {
+                     List<ProfileImporter> importers, PreviewCache dryRunCache, RuleRegistry ruleRegistry, System2 system) {
     this.myBatis = myBatis;
     this.dao = dao;
     this.activeRuleDao = activeRuleDao;
@@ -106,7 +90,6 @@ public class QProfileOperations implements ServerComponent {
     this.importers = importers;
     this.dryRunCache = dryRunCache;
     this.ruleRegistry = ruleRegistry;
-    this.profilesManager = profilesManager;
     this.system = system;
   }
 
@@ -143,327 +126,6 @@ public class QProfileOperations implements ServerComponent {
     propertiesDao.setProperty(new PropertyDto().setKey(PROPERTY_PREFIX + qualityProfile.getLanguage()).setValue(qualityProfile.getName()));
   }
 
-  public ActiveRuleDto createActiveRule(QualityProfileDto qualityProfile, RuleDto rule, String severity, UserSession userSession) {
-    checkPermission(userSession);
-    checkSeverity(severity);
-    SqlSession session = myBatis.openSession();
-    try {
-      ActiveRuleDto activeRule = new ActiveRuleDto()
-        .setProfileId(qualityProfile.getId())
-        .setRuleId(rule.getId())
-        .setSeverity(Severity.ordinal(severity));
-      activeRuleDao.insert(activeRule, session);
-
-      List<RuleParamDto> ruleParams = ruleDao.selectParameters(rule.getId(), session);
-      List<ActiveRuleParamDto> activeRuleParams = Lists.newArrayList();
-      for (RuleParamDto ruleParam : ruleParams) {
-        ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto()
-          .setActiveRuleId(activeRule.getId())
-          .setRulesParameterId(ruleParam.getId())
-          .setKey(ruleParam.getName())
-          .setValue(ruleParam.getDefaultValue());
-        activeRuleParams.add(activeRuleParam);
-        activeRuleDao.insert(activeRuleParam, session);
-      }
-      session.commit();
-
-      RuleInheritanceActions actions = profilesManager.activated(qualityProfile.getId(), activeRule.getId(), userSession.name());
-      reindexInheritanceResult(actions, session);
-
-      return activeRule;
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void updateSeverity(ActiveRuleDto activeRule, String newSeverity, UserSession userSession) {
-    checkPermission(userSession);
-    checkSeverity(newSeverity);
-    SqlSession session = myBatis.openSession();
-    try {
-      Integer oldSeverity = activeRule.getSeverity();
-      activeRule.setSeverity(Severity.ordinal(newSeverity));
-      activeRuleDao.update(activeRule, session);
-      session.commit();
-
-      RuleInheritanceActions actions = profilesManager.ruleSeverityChanged(activeRule.getProfileId(), activeRule.getId(),
-        RulePriority.valueOfInt(oldSeverity), RulePriority.valueOf(newSeverity),
-        userSession.name());
-      reindexInheritanceResult(actions, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void deactivateRule(ActiveRuleDto activeRule, UserSession userSession) {
-    checkPermission(userSession);
-
-    SqlSession session = myBatis.openSession();
-    try {
-      RuleInheritanceActions actions = profilesManager.deactivated(activeRule.getProfileId(), activeRule.getId(), userSession.name());
-
-      activeRuleDao.deleteParameters(activeRule.getId(), session);
-      activeRuleDao.delete(activeRule.getId(), session);
-      actions.addToDelete(activeRule.getId());
-      session.commit();
-
-      reindexInheritanceResult(actions, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void createActiveRuleParam(ActiveRuleDto activeRule, String key, String value, UserSession userSession) {
-    checkPermission(userSession);
-
-    SqlSession session = myBatis.openSession();
-    try {
-      RuleParamDto ruleParam = findRuleParamNotNull(activeRule.getRulId(), key, session);
-      validateParam(ruleParam.getType(), value);
-      ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto().setActiveRuleId(activeRule.getId()).setKey(key).setValue(value).setRulesParameterId(ruleParam.getId());
-      activeRuleDao.insert(activeRuleParam, session);
-      session.commit();
-
-      RuleInheritanceActions actions = profilesManager.ruleParamChanged(activeRule.getProfileId(), activeRule.getId(), key, null, value, userSession.name());
-      reindexInheritanceResult(actions, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void deleteActiveRuleParam(ActiveRuleDto activeRule, ActiveRuleParamDto activeRuleParam, UserSession userSession) {
-    checkPermission(userSession);
-
-    SqlSession session = myBatis.openSession();
-    try {
-      activeRuleDao.deleteParameter(activeRuleParam.getId(), session);
-      session.commit();
-
-      RuleInheritanceActions actions = profilesManager.ruleParamChanged(activeRule.getProfileId(), activeRule.getId(), activeRuleParam.getKey(), activeRuleParam.getValue(),
-        null, userSession.name());
-      reindexInheritanceResult(actions, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void updateActiveRuleParam(ActiveRuleDto activeRule, ActiveRuleParamDto activeRuleParam, String value, UserSession userSession) {
-    checkPermission(userSession);
-
-    SqlSession session = myBatis.openSession();
-    try {
-      RuleParamDto ruleParam = findRuleParamNotNull(activeRule.getRulId(), activeRuleParam.getKey(), session);
-      validateParam(ruleParam.getType(), value);
-
-      String sanitizedValue = Strings.emptyToNull(value);
-      String oldValue = activeRuleParam.getValue();
-      activeRuleParam.setValue(sanitizedValue);
-      activeRuleDao.update(activeRuleParam, session);
-      session.commit();
-
-      RuleInheritanceActions actions = profilesManager.ruleParamChanged(activeRule.getProfileId(), activeRule.getId(), activeRuleParam.getKey(), oldValue,
-        sanitizedValue, getLoggedName(userSession));
-      reindexInheritanceResult(actions, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void updateActiveRuleNote(ActiveRuleDto activeRule, String note, UserSession userSession) {
-    checkPermission(userSession);
-    Date now = new Date(system.now());
-    SqlSession session = myBatis.openSession();
-    try {
-      if (activeRule.getNoteData() == null) {
-        activeRule.setNoteCreatedAt(now);
-        activeRule.setNoteUserLogin(userSession.login());
-      }
-      activeRule.setNoteUpdatedAt(now);
-      activeRule.setNoteData(note);
-      activeRuleDao.update(activeRule, session);
-      session.commit();
-
-      reindexActiveRule(activeRule, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void deleteActiveRuleNote(ActiveRuleDto activeRule, UserSession userSession) {
-    checkPermission(userSession);
-
-    SqlSession session = myBatis.openSession();
-    try {
-      activeRule.setNoteData(null);
-      activeRule.setNoteUserLogin(null);
-      activeRule.setNoteCreatedAt(null);
-      activeRule.setNoteUpdatedAt(null);
-      activeRuleDao.update(activeRule);
-      session.commit();
-
-      reindexActiveRule(activeRule, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void updateRuleNote(RuleDto rule, String note, UserSession userSession) {
-    checkPermission(userSession);
-    Date now = new Date(system.now());
-
-    SqlSession session = myBatis.openSession();
-    try {
-      if (rule.getNoteData() == null) {
-        rule.setNoteCreatedAt(now);
-        rule.setNoteUserLogin(getLoggedLogin(userSession));
-      }
-      rule.setNoteUpdatedAt(now);
-      rule.setNoteData(note);
-      ruleDao.update(rule);
-      session.commit();
-
-      reindexRule(rule, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void deleteRuleNote(RuleDto rule, UserSession userSession) {
-    checkPermission(userSession);
-
-    SqlSession session = myBatis.openSession();
-    try {
-      rule.setNoteData(null);
-      rule.setNoteUserLogin(null);
-      rule.setNoteCreatedAt(null);
-      rule.setNoteUpdatedAt(null);
-      ruleDao.update(rule);
-      session.commit();
-
-      reindexRule(rule, session);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public RuleDto createRule(RuleDto templateRule, String name, String severity, String description, Map<String, String> paramsByKey,
-                            UserSession userSession) {
-    checkPermission(userSession);
-    SqlSession session = myBatis.openSession();
-    try {
-      RuleDto rule = new RuleDto()
-        .setParentId(templateRule.getId())
-        .setName(name)
-        .setDescription(description)
-        .setSeverity(Severity.ordinal(severity))
-        .setRepositoryKey(templateRule.getRepositoryKey())
-        .setConfigKey(templateRule.getConfigKey())
-        .setRuleKey(templateRule.getRuleKey() + "_" + system.now())
-        .setCardinality(Cardinality.SINGLE)
-        .setStatus(Rule.STATUS_READY)
-        .setLanguage(templateRule.getLanguage())
-        .setCreatedAt(new Date(system.now()))
-        .setUpdatedAt(new Date(system.now()));
-      ruleDao.insert(rule, session);
-
-      List<RuleParamDto> templateRuleParams = ruleDao.selectParameters(templateRule.getId(), session);
-      List<RuleParamDto> ruleParams = newArrayList();
-      for (RuleParamDto templateRuleParam : templateRuleParams) {
-        String key = templateRuleParam.getName();
-        String value = paramsByKey.get(key);
-
-        RuleParamDto param = new RuleParamDto()
-          .setRuleId(rule.getId())
-          .setName(key)
-          .setDescription(templateRuleParam.getDescription())
-          .setType(templateRuleParam.getType())
-          .setDefaultValue(Strings.emptyToNull(value));
-        ruleDao.insert(param, session);
-        ruleParams.add(param);
-      }
-      session.commit();
-      reindexRule(rule, ruleParams);
-      return rule;
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void updateRule(RuleDto rule, String name, String severity, String description, Map<String, String> paramsByKey,
-                         UserSession userSession) {
-    checkPermission(userSession);
-    SqlSession session = myBatis.openSession();
-    try {
-      rule.setName(name)
-        .setDescription(description)
-        .setSeverity(Severity.ordinal(severity))
-        .setUpdatedAt(new Date(system.now()));
-      ruleDao.update(rule, session);
-
-      List<RuleParamDto> ruleParams = ruleDao.selectParameters(rule.getId(), session);
-      for (RuleParamDto ruleParam : ruleParams) {
-        String value = paramsByKey.get(ruleParam.getName());
-        ruleParam.setDefaultValue(Strings.emptyToNull(value));
-        ruleDao.update(ruleParam, session);
-      }
-      session.commit();
-      reindexRule(rule, ruleParams);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  public void deleteRule(RuleDto rule, UserSession userSession) {
-    checkPermission(userSession);
-    SqlSession session = myBatis.openSession();
-    try {
-      // Set status REMOVED on rule
-      rule.setStatus(Rule.STATUS_REMOVED)
-        .setUpdatedAt(new Date(system.now()));
-      ruleDao.update(rule, session);
-      session.commit();
-      reindexRule(rule, session);
-
-      // Delete all active rules and active rule params linked to the rule
-      List<ActiveRuleDto> activeRules = activeRuleDao.selectByRuleId(rule.getId());
-      for (ActiveRuleDto activeRule : activeRules) {
-        activeRuleDao.deleteParameters(activeRule.getId(), session);
-      }
-      activeRuleDao.deleteFromRule(rule.getId(), session);
-      session.commit();
-      ruleRegistry.deleteActiveRules(newArrayList(Iterables.transform(activeRules, new Function<ActiveRuleDto, Integer>() {
-        @Override
-        public Integer apply(ActiveRuleDto input) {
-          return input.getId();
-        }
-      })));
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
-
-  private void reindexInheritanceResult(RuleInheritanceActions actions, SqlSession session) {
-    ruleRegistry.deleteActiveRules(actions.idsToDelete());
-    List<ActiveRuleDto> activeRules = activeRuleDao.selectByIds(actions.idsToIndex(), session);
-    Multimap<Integer, ActiveRuleParamDto> paramsByActiveRule = ArrayListMultimap.create();
-    for (ActiveRuleParamDto param : activeRuleDao.selectParamsByActiveRuleIds(actions.idsToIndex(), session)) {
-      paramsByActiveRule.put(param.getActiveRuleId(), param);
-    }
-    ruleRegistry.bulkIndexActiveRules(activeRules, paramsByActiveRule);
-  }
-
-  private void reindexActiveRule(ActiveRuleDto activeRuleDto, SqlSession session) {
-    ruleRegistry.save(activeRuleDto, activeRuleDao.selectParamsByActiveRuleId(activeRuleDto.getId(), session));
-  }
-
-  private void reindexRule(RuleDto rule, SqlSession session) {
-    ruleRegistry.save(rule, ruleDao.selectParameters(rule.getId(), session));
-  }
-
-  private void reindexRule(RuleDto rule, List<RuleParamDto> ruleParams) {
-    ruleRegistry.save(rule, ruleParams);
-  }
-
   private List<RulesProfile> readProfilesFromXml(NewProfileResult result, Map<String, String> xmlProfilesByPlugin) {
     List<RulesProfile> profiles = newArrayList();
     ValidationMessages messages = ValidationMessages.create();
@@ -539,40 +201,4 @@ public class QProfileOperations implements ServerComponent {
     userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
   }
 
-  private String getLoggedName(UserSession userSession) {
-    String name = userSession.name();
-    if (Strings.isNullOrEmpty(name)) {
-      throw new BadRequestException("User name can't be null");
-    }
-    return name;
-  }
-
-  private String getLoggedLogin(UserSession userSession) {
-    String login = userSession.login();
-    if (Strings.isNullOrEmpty(login)) {
-      throw new BadRequestException("User login can't be null");
-    }
-    return login;
-  }
-
-  private void checkSeverity(String severity) {
-    if (!Severity.ALL.contains(severity)) {
-      throw new BadRequestException("The severity is not valid");
-    }
-  }
-
-  private RuleParamDto findRuleParamNotNull(Integer ruleId, String key, SqlSession session) {
-    RuleParamDto ruleParam = ruleDao.selectParamByRuleAndKey(ruleId, key, session);
-    if (ruleParam == null) {
-      throw new IllegalArgumentException("No rule param found");
-    }
-    return ruleParam;
-  }
-
-  private void validateParam(String type, String value) {
-    if (type.equals(PropertyType.INTEGER.name()) && !NumberUtils.isDigits(value)) {
-      throw new BadRequestException(String.format("Value '%s' must be an integer.", value));
-    }
-  }
-
 }
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileRuleOperations.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileRuleOperations.java
new file mode 100644 (file)
index 0000000..68c2542
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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.qualityprofile;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import org.apache.ibatis.session.SqlSession;
+import org.sonar.api.ServerComponent;
+import org.sonar.api.rule.Severity;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.utils.System2;
+import org.sonar.check.Cardinality;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.qualityprofile.db.ActiveRuleDao;
+import org.sonar.core.qualityprofile.db.ActiveRuleDto;
+import org.sonar.core.rule.RuleDao;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.core.rule.RuleParamDto;
+import org.sonar.server.exceptions.BadRequestException;
+import org.sonar.server.rule.RuleRegistry;
+import org.sonar.server.user.UserSession;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+public class QProfileRuleOperations implements ServerComponent {
+
+  private final MyBatis myBatis;
+  private final ActiveRuleDao activeRuleDao;
+  private final RuleDao ruleDao;
+  private final RuleRegistry ruleRegistry;
+
+  private final System2 system;
+
+  public QProfileRuleOperations(MyBatis myBatis, ActiveRuleDao activeRuleDao, RuleDao ruleDao, RuleRegistry ruleRegistry) {
+    this(myBatis, activeRuleDao, ruleDao, ruleRegistry, System2.INSTANCE);
+  }
+
+  @VisibleForTesting
+  QProfileRuleOperations(MyBatis myBatis, ActiveRuleDao activeRuleDao, RuleDao ruleDao, RuleRegistry ruleRegistry, System2 system) {
+    this.myBatis = myBatis;
+    this.activeRuleDao = activeRuleDao;
+    this.ruleDao = ruleDao;
+    this.ruleRegistry = ruleRegistry;
+    this.system = system;
+  }
+
+  public void updateRuleNote(RuleDto rule, String note, UserSession userSession) {
+    checkPermission(userSession);
+    Date now = new Date(system.now());
+
+    SqlSession session = myBatis.openSession();
+    try {
+      if (rule.getNoteData() == null) {
+        rule.setNoteCreatedAt(now);
+        rule.setNoteUserLogin(getLoggedLogin(userSession));
+      }
+      rule.setNoteUpdatedAt(now);
+      rule.setNoteData(note);
+      ruleDao.update(rule);
+      session.commit();
+
+      reindexRule(rule, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void deleteRuleNote(RuleDto rule, UserSession userSession) {
+    checkPermission(userSession);
+
+    SqlSession session = myBatis.openSession();
+    try {
+      rule.setNoteData(null);
+      rule.setNoteUserLogin(null);
+      rule.setNoteCreatedAt(null);
+      rule.setNoteUpdatedAt(null);
+      ruleDao.update(rule);
+      session.commit();
+
+      reindexRule(rule, session);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public RuleDto createRule(RuleDto templateRule, String name, String severity, String description, Map<String, String> paramsByKey,
+                            UserSession userSession) {
+    checkPermission(userSession);
+    SqlSession session = myBatis.openSession();
+    try {
+      RuleDto rule = new RuleDto()
+        .setParentId(templateRule.getId())
+        .setName(name)
+        .setDescription(description)
+        .setSeverity(Severity.ordinal(severity))
+        .setRepositoryKey(templateRule.getRepositoryKey())
+        .setConfigKey(templateRule.getConfigKey())
+        .setRuleKey(templateRule.getRuleKey() + "_" + system.now())
+        .setCardinality(Cardinality.SINGLE)
+        .setStatus(Rule.STATUS_READY)
+        .setLanguage(templateRule.getLanguage())
+        .setCreatedAt(new Date(system.now()))
+        .setUpdatedAt(new Date(system.now()));
+      ruleDao.insert(rule, session);
+
+      List<RuleParamDto> templateRuleParams = ruleDao.selectParameters(templateRule.getId(), session);
+      List<RuleParamDto> ruleParams = newArrayList();
+      for (RuleParamDto templateRuleParam : templateRuleParams) {
+        String key = templateRuleParam.getName();
+        String value = paramsByKey.get(key);
+
+        RuleParamDto param = new RuleParamDto()
+          .setRuleId(rule.getId())
+          .setName(key)
+          .setDescription(templateRuleParam.getDescription())
+          .setType(templateRuleParam.getType())
+          .setDefaultValue(Strings.emptyToNull(value));
+        ruleDao.insert(param, session);
+        ruleParams.add(param);
+      }
+      session.commit();
+      reindexRule(rule, ruleParams);
+      return rule;
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void updateRule(RuleDto rule, String name, String severity, String description, Map<String, String> paramsByKey,
+                         UserSession userSession) {
+    checkPermission(userSession);
+    SqlSession session = myBatis.openSession();
+    try {
+      rule.setName(name)
+        .setDescription(description)
+        .setSeverity(Severity.ordinal(severity))
+        .setUpdatedAt(new Date(system.now()));
+      ruleDao.update(rule, session);
+
+      List<RuleParamDto> ruleParams = ruleDao.selectParameters(rule.getId(), session);
+      for (RuleParamDto ruleParam : ruleParams) {
+        String value = paramsByKey.get(ruleParam.getName());
+        ruleParam.setDefaultValue(Strings.emptyToNull(value));
+        ruleDao.update(ruleParam, session);
+      }
+      session.commit();
+      reindexRule(rule, ruleParams);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  public void deleteRule(RuleDto rule, UserSession userSession) {
+    checkPermission(userSession);
+    SqlSession session = myBatis.openSession();
+    try {
+      // Set status REMOVED on rule
+      rule.setStatus(Rule.STATUS_REMOVED)
+        .setUpdatedAt(new Date(system.now()));
+      ruleDao.update(rule, session);
+      session.commit();
+      reindexRule(rule, session);
+
+      // Delete all active rules and active rule params linked to the rule
+      List<ActiveRuleDto> activeRules = activeRuleDao.selectByRuleId(rule.getId());
+      for (ActiveRuleDto activeRule : activeRules) {
+        activeRuleDao.deleteParameters(activeRule.getId(), session);
+      }
+      activeRuleDao.deleteFromRule(rule.getId(), session);
+      session.commit();
+      ruleRegistry.deleteActiveRules(newArrayList(Iterables.transform(activeRules, new Function<ActiveRuleDto, Integer>() {
+        @Override
+        public Integer apply(ActiveRuleDto input) {
+          return input.getId();
+        }
+      })));
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  private void reindexRule(RuleDto rule, SqlSession session) {
+    ruleRegistry.save(rule, ruleDao.selectParameters(rule.getId(), session));
+  }
+
+  private void reindexRule(RuleDto rule, List<RuleParamDto> ruleParams) {
+    ruleRegistry.save(rule, ruleParams);
+  }
+
+  private void checkPermission(UserSession userSession) {
+    userSession.checkLoggedIn();
+    userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  }
+
+  private String getLoggedLogin(UserSession userSession) {
+    String login = userSession.login();
+    if (Strings.isNullOrEmpty(login)) {
+      throw new BadRequestException("User login can't be null");
+    }
+    return login;
+  }
+
+}
index ac5e8073dd82620009201d42532390a8a2dc2fae..f9f04c8cafcef5607f1dd46a7f946ef8cfffdff8 100644 (file)
@@ -56,10 +56,13 @@ public class QProfiles implements ServerComponent {
 
   private final QProfileSearch search;
   private final QProfileOperations operations;
+  private final QProfileActiveRuleOperations activeRuleOperations;
+  private final QProfileRuleOperations ruleOperations;
   private final ProfileRules rules;
 
   public QProfiles(QualityProfileDao qualityProfileDao, ActiveRuleDao activeRuleDao, RuleDao ruleDao, ResourceDao resourceDao,
-                   QProfileProjectService projectService, QProfileSearch search, QProfileOperations operations, ProfileRules rules) {
+                   QProfileProjectService projectService, QProfileSearch search,
+                   QProfileOperations operations, QProfileActiveRuleOperations activeRuleOperations, QProfileRuleOperations ruleOperations, ProfileRules rules) {
     this.qualityProfileDao = qualityProfileDao;
     this.activeRuleDao = activeRuleDao;
     this.ruleDao = ruleDao;
@@ -67,6 +70,8 @@ public class QProfiles implements ServerComponent {
     this.projectService = projectService;
     this.search = search;
     this.operations = operations;
+    this.activeRuleOperations = activeRuleOperations;
+    this.ruleOperations = ruleOperations;
     this.rules = rules;
   }
 
@@ -87,7 +92,7 @@ public class QProfiles implements ServerComponent {
   // ACTIVE RULES
   // bulk activate all
   // bulk deactivate all
-  // revert modification on active rule with inheritance
+  // revert modification on active rule with inheritance -->
   // active rule parameter validation (only Integer types are checked)
 
 
@@ -214,9 +219,9 @@ public class QProfiles implements ServerComponent {
     RuleDto rule = findRuleNotNull(ruleId);
     ActiveRuleDto activeRule = findActiveRule(qualityProfile, rule);
     if (activeRule == null) {
-      activeRule = operations.createActiveRule(qualityProfile, rule, severity, UserSession.get());
+      activeRule = activeRuleOperations.createActiveRule(qualityProfile, rule, severity, UserSession.get());
     } else {
-      operations.updateSeverity(activeRule, severity, UserSession.get());
+      activeRuleOperations.updateSeverity(activeRule, severity, UserSession.get());
     }
     return activeRuleChanged(qualityProfile, activeRule);
   }
@@ -225,8 +230,8 @@ public class QProfiles implements ServerComponent {
     QualityProfileDto qualityProfile = findNotNull(profileId);
     RuleDto rule = findRuleNotNull(ruleId);
     ActiveRuleDto activeRule = findActiveRuleNotNull(qualityProfile, rule);
-    operations.deactivateRule(activeRule, UserSession.get());
-    return activeRuleChanged(qualityProfile, activeRule);
+    activeRuleOperations.deactivateRule(activeRule, UserSession.get());
+    return activeRuleChanged(qualityProfile, rule);
   }
 
   /**
@@ -251,11 +256,11 @@ public class QProfiles implements ServerComponent {
     ActiveRuleDto activeRule = findActiveRuleNotNull(activeRuleId);
     UserSession userSession = UserSession.get();
     if (activeRuleParam == null && sanitizedValue != null) {
-      operations.createActiveRuleParam(activeRule, key, value, userSession);
+      activeRuleOperations.createActiveRuleParam(activeRule, key, value, userSession);
     } else if (activeRuleParam != null && sanitizedValue == null) {
-      operations.deleteActiveRuleParam(activeRule, activeRuleParam, userSession);
+      activeRuleOperations.deleteActiveRuleParam(activeRule, activeRuleParam, userSession);
     } else if (activeRuleParam != null) {
-      operations.updateActiveRuleParam(activeRule, activeRuleParam, value, userSession);
+      activeRuleOperations.updateActiveRuleParam(activeRule, activeRuleParam, value, userSession);
     } else {
       // No active rule param and no value -> do nothing
     }
@@ -266,7 +271,7 @@ public class QProfiles implements ServerComponent {
     ActiveRuleDto activeRule = findActiveRuleNotNull(activeRuleId);
     String sanitizedNote = Strings.emptyToNull(note);
     if (sanitizedNote != null) {
-      operations.updateActiveRuleNote(activeRule, note, UserSession.get());
+      activeRuleOperations.updateActiveRuleNote(activeRule, note, UserSession.get());
     } else {
       // Empty note -> do nothing
     }
@@ -275,7 +280,7 @@ public class QProfiles implements ServerComponent {
 
   public QProfileRule deleteActiveRuleNote(int activeRuleId) {
     ActiveRuleDto activeRule = findActiveRuleNotNull(activeRuleId);
-    operations.deleteActiveRuleNote(activeRule, UserSession.get());
+    activeRuleOperations.deleteActiveRuleNote(activeRule, UserSession.get());
     return rules.getFromActiveRuleId(activeRule.getId());
   }
 
@@ -285,9 +290,9 @@ public class QProfiles implements ServerComponent {
     RuleDto rule = findRuleNotNull(ruleId);
     String sanitizedNote = Strings.emptyToNull(note);
     if (sanitizedNote != null) {
-      operations.updateRuleNote(rule, note, UserSession.get());
+      ruleOperations.updateRuleNote(rule, note, UserSession.get());
     } else {
-      operations.deleteRuleNote(rule, UserSession.get());
+      ruleOperations.deleteRuleNote(rule, UserSession.get());
     }
     ActiveRuleDto activeRule = findActiveRuleNotNull(activeRuleId);
     return rules.getFromActiveRuleId(activeRule.getId());
@@ -301,26 +306,22 @@ public class QProfiles implements ServerComponent {
   public QProfileRule createRule(int ruleId, @Nullable String name, @Nullable String severity, @Nullable String description, Map<String, String> paramsByKey) {
     RuleDto rule = findRuleNotNull(ruleId);
     validateRule(null, name, severity, description);
-    RuleDto newRule = operations.createRule(rule, name, severity, description, paramsByKey, UserSession.get());
+    RuleDto newRule = ruleOperations.createRule(rule, name, severity, description, paramsByKey, UserSession.get());
     return rules.getFromRuleId(newRule.getId());
   }
 
   public QProfileRule updateRule(int ruleId, @Nullable String name, @Nullable String severity, @Nullable String description, Map<String, String> paramsByKey) {
     RuleDto rule = findRuleNotNull(ruleId);
-    if (rule.getParentId() == null) {
-      throw new NotFoundException("Unknown rule");
-    }
+    validateRuleParent(rule);
     validateRule(ruleId, name, severity, description);
-    operations.updateRule(rule, name, severity, description, paramsByKey, UserSession.get());
+    ruleOperations.updateRule(rule, name, severity, description, paramsByKey, UserSession.get());
     return rules.getFromRuleId(ruleId);
   }
 
   public void deleteRule(int ruleId) {
     RuleDto rule = findRuleNotNull(ruleId);
-    if (rule.getParentId() == null) {
-      throw new NotFoundException("Unknown rule");
-    }
-    operations.deleteRule(rule, UserSession.get());
+    validateRuleParent(rule);
+    ruleOperations.deleteRule(rule, UserSession.get());
   }
 
   public int countActiveRules(QProfileRule rule){
@@ -437,6 +438,12 @@ public class QProfiles implements ServerComponent {
     return rule;
   }
 
+  private void validateRuleParent(RuleDto rule){
+    if (rule.getParentId() == null) {
+      throw new NotFoundException("Unknown rule");
+    }
+  }
+
   //
   // Active Rule validation
   //
@@ -476,4 +483,8 @@ public class QProfiles implements ServerComponent {
     return new ActiveRuleChanged(QProfile.from(qualityProfile), rules.getFromActiveRuleId(activeRule.getId()));
   }
 
+  private ActiveRuleChanged activeRuleChanged(QualityProfileDto qualityProfile, RuleDto rule) {
+    return new ActiveRuleChanged(QProfile.from(qualityProfile), rules.getFromRuleId(rule.getId()));
+  }
+
 }
diff --git a/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileActiveRuleOperationsTest.java b/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileActiveRuleOperationsTest.java
new file mode 100644 (file)
index 0000000..e96b51b
--- /dev/null
@@ -0,0 +1,373 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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.qualityprofile;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Multimap;
+import org.apache.ibatis.session.SqlSession;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
+import org.sonar.api.PropertyType;
+import org.sonar.api.rule.Severity;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RulePriority;
+import org.sonar.api.utils.DateUtils;
+import org.sonar.api.utils.System2;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.preview.PreviewCache;
+import org.sonar.core.qualityprofile.db.ActiveRuleDao;
+import org.sonar.core.qualityprofile.db.ActiveRuleDto;
+import org.sonar.core.qualityprofile.db.ActiveRuleParamDto;
+import org.sonar.core.qualityprofile.db.QualityProfileDto;
+import org.sonar.core.rule.RuleDao;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.core.rule.RuleParamDto;
+import org.sonar.server.configuration.ProfilesManager;
+import org.sonar.server.exceptions.BadRequestException;
+import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.rule.RuleRegistry;
+import org.sonar.server.user.MockUserSession;
+import org.sonar.server.user.UserSession;
+
+import java.util.Date;
+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;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class QProfileActiveRuleOperationsTest {
+
+  @Mock
+  MyBatis myBatis;
+
+  @Mock
+  SqlSession session;
+
+  @Mock
+  ActiveRuleDao activeRuleDao;
+
+  @Mock
+  RuleDao ruleDao;
+
+  @Mock
+  PreviewCache dryRunCache;
+
+  @Mock
+  RuleRegistry ruleRegistry;
+
+  @Mock
+  ProfilesManager profilesManager;
+
+  @Mock
+  System2 system;
+
+  Integer currentId = 1;
+
+  UserSession authorizedUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  UserSession unauthorizedUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas");
+
+  QProfileActiveRuleOperations operations;
+
+  @Before
+  public void setUp() throws Exception {
+    when(myBatis.openSession()).thenReturn(session);
+
+    // Associate an id when inserting an object to simulate the db id generator
+    doAnswer(new Answer() {
+      public Object answer(InvocationOnMock invocation) {
+        Object[] args = invocation.getArguments();
+        ActiveRuleDto dto = (ActiveRuleDto) args[0];
+        dto.setId(currentId++);
+        return null;
+      }
+    }).when(activeRuleDao).insert(any(ActiveRuleDto.class), any(SqlSession.class));
+
+    operations = new QProfileActiveRuleOperations(myBatis, activeRuleDao, ruleDao, dryRunCache, ruleRegistry, profilesManager, system);
+  }
+
+  @Test
+  public void fail_to_activate_rule_without_profile_admin_permission() throws Exception {
+    QualityProfileDto qualityProfile = new QualityProfileDto().setId(1).setName("My profile").setLanguage("java");
+    RuleDto rule = new RuleDto().setId(10).setRepositoryKey("squid").setRuleKey("AvoidCycle");
+
+    try {
+      operations.createActiveRule(qualityProfile, rule, Severity.CRITICAL, unauthorizedUserSession);
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(ForbiddenException.class);
+    }
+    verifyNoMoreInteractions(activeRuleDao);
+    verify(session, never()).commit();
+  }
+
+  @Test
+  public void activate_rule() throws Exception {
+    QualityProfileDto qualityProfile = new QualityProfileDto().setId(1).setName("My profile").setLanguage("java");
+    RuleDto rule = new RuleDto().setId(10).setRepositoryKey("squid").setRuleKey("AvoidCycle");
+    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10")));
+    final int idActiveRuleToUpdate = 42;
+    final int idActiveRuleToDelete = 24;
+    RuleInheritanceActions inheritanceActions = new RuleInheritanceActions()
+      .addToIndex(idActiveRuleToUpdate)
+      .addToDelete(idActiveRuleToDelete);
+    when(profilesManager.activated(eq(1), anyInt(), eq("Nicolas"))).thenReturn(inheritanceActions);
+    when(activeRuleDao.selectByIds(anyList(), isA(SqlSession.class))).thenReturn(ImmutableList.<ActiveRuleDto>of(mock(ActiveRuleDto.class)));
+    when(activeRuleDao.selectParamsByActiveRuleIds(anyList(), isA(SqlSession.class))).thenReturn(ImmutableList.<ActiveRuleParamDto>of(mock(ActiveRuleParamDto.class)));
+
+    ActiveRuleDto result = operations.createActiveRule(qualityProfile, rule, Severity.CRITICAL, authorizedUserSession);
+    assertThat(result).isNotNull();
+
+    ArgumentCaptor<ActiveRuleDto> activeRuleArgument = ArgumentCaptor.forClass(ActiveRuleDto.class);
+    verify(activeRuleDao).insert(activeRuleArgument.capture(), eq(session));
+    assertThat(activeRuleArgument.getValue().getRulId()).isEqualTo(10);
+    assertThat(activeRuleArgument.getValue().getSeverity()).isEqualTo(3);
+
+    ArgumentCaptor<ActiveRuleParamDto> activeRuleParamArgument = ArgumentCaptor.forClass(ActiveRuleParamDto.class);
+    verify(activeRuleDao).insert(activeRuleParamArgument.capture(), eq(session));
+    assertThat(activeRuleParamArgument.getValue().getKey()).isEqualTo("max");
+    assertThat(activeRuleParamArgument.getValue().getValue()).isEqualTo("10");
+
+    verify(session).commit();
+    verify(profilesManager).activated(eq(1), anyInt(), eq("Nicolas"));
+    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
+  }
+
+  @Test
+  public void update_severity() throws Exception {
+    Rule rule = Rule.create().setRepositoryKey("squid").setKey("AvoidCycle");
+    rule.setId(10);
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+    when(profilesManager.ruleSeverityChanged(eq(1), eq(5), eq(RulePriority.MINOR), eq(RulePriority.MAJOR), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
+
+    operations.updateSeverity(activeRule, Severity.MAJOR, authorizedUserSession);
+
+    verify(activeRuleDao).update(eq(activeRule), eq(session));
+    verify(session).commit();
+    verify(profilesManager).ruleSeverityChanged(eq(1), eq(5), eq(RulePriority.MINOR), eq(RulePriority.MAJOR), eq("Nicolas"));
+    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
+  }
+
+  @Test
+  public void fail_to_update_severity_on_invalid_severity() throws Exception {
+    Rule rule = Rule.create().setRepositoryKey("squid").setKey("AvoidCycle");
+    rule.setId(10);
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+
+    try {
+      operations.updateSeverity(activeRule, "Unknown", authorizedUserSession);
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(BadRequestException.class);
+    }
+    verify(activeRuleDao, never()).update(eq(activeRule), eq(session));
+    verifyZeroInteractions(profilesManager);
+  }
+
+  @Test
+  public void deactivate_rule() throws Exception {
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+    when(activeRuleDao.selectByProfileAndRule(1, 10)).thenReturn(activeRule);
+    when(profilesManager.deactivated(eq(1), anyInt(), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
+
+    operations.deactivateRule(activeRule, authorizedUserSession);
+
+    verify(activeRuleDao).delete(eq(5), eq(session));
+    verify(activeRuleDao).deleteParameters(eq(5), eq(session));
+    verify(session).commit();
+    verify(profilesManager).deactivated(eq(1), anyInt(), eq("Nicolas"));
+    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
+  }
+
+  @Test
+  public void update_active_rule_param() throws Exception {
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+    ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto().setId(100).setActiveRuleId(5).setKey("max").setValue("20");
+
+    RuleParamDto ruleParam = new RuleParamDto().setRuleId(10).setName("max").setDefaultValue("20").setType(PropertyType.INTEGER.name());
+    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(ruleParam);
+
+    when(profilesManager.ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq("30"), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
+
+    operations.updateActiveRuleParam(activeRule, activeRuleParam, "30", authorizedUserSession);
+
+    ArgumentCaptor<ActiveRuleParamDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleParamDto.class);
+    verify(activeRuleDao).update(argumentCaptor.capture(), eq(session));
+    assertThat(argumentCaptor.getValue().getId()).isEqualTo(100);
+    assertThat(argumentCaptor.getValue().getValue()).isEqualTo("30");
+
+    verify(session).commit();
+    verify(profilesManager).ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq("30"), eq("Nicolas"));
+    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
+  }
+
+  @Test
+  public void remove_active_rule_param() throws Exception {
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+    ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto().setId(100).setActiveRuleId(5).setKey("max").setValue("20");
+    when(profilesManager.ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq((String) null), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
+
+    operations.deleteActiveRuleParam(activeRule, activeRuleParam, authorizedUserSession);
+
+    verify(session).commit();
+    verify(activeRuleDao).deleteParameter(100, session);
+    verify(profilesManager).ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq((String) null), eq("Nicolas"));
+    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
+  }
+
+  @Test
+  public void create_active_rule_param() throws Exception {
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+    RuleParamDto ruleParam = new RuleParamDto().setRuleId(10).setName("max").setDefaultValue("20").setType(PropertyType.INTEGER.name());
+    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(ruleParam);
+    when(profilesManager.ruleParamChanged(eq(1), eq(5), eq("max"), eq((String) null), eq("30"), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
+
+    operations.createActiveRuleParam(activeRule, "max", "30", authorizedUserSession);
+
+    ArgumentCaptor<ActiveRuleParamDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleParamDto.class);
+    verify(activeRuleDao).insert(argumentCaptor.capture(), eq(session));
+    assertThat(argumentCaptor.getValue().getKey()).isEqualTo("max");
+    assertThat(argumentCaptor.getValue().getValue()).isEqualTo("30");
+    assertThat(argumentCaptor.getValue().getActiveRuleId()).isEqualTo(5);
+
+    verify(session).commit();
+    verify(profilesManager).ruleParamChanged(eq(1), eq(5), eq("max"), eq((String) null), eq("30"), eq("Nicolas"));
+    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
+  }
+
+  @Test
+  public void fail_to_create_active_rule_if_no_rule_param() throws Exception {
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(null);
+    try {
+      operations.createActiveRuleParam(activeRule, "max", "30", authorizedUserSession);
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(IllegalArgumentException.class);
+    }
+    verify(activeRuleDao, never()).insert(any(ActiveRuleParamDto.class), eq(session));
+    verifyZeroInteractions(profilesManager);
+  }
+
+  @Test
+  public void fail_to_create_active_rule_if_type_is_invalid() throws Exception {
+    RuleParamDto ruleParam = new RuleParamDto().setRuleId(10).setName("max").setDefaultValue("20").setType(PropertyType.INTEGER.name());
+    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(ruleParam);
+
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
+    try {
+      operations.createActiveRuleParam(activeRule, "max", "invalid integer", authorizedUserSession);
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(BadRequestException.class);
+    }
+    verify(activeRuleDao, never()).insert(any(ActiveRuleParamDto.class), eq(session));
+    verifyZeroInteractions(profilesManager);
+  }
+
+  @Test
+  public void update_active_rule_note_when_no_existing_note() throws Exception {
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1).setNoteCreatedAt(null).setNoteData(null);
+
+    List<ActiveRuleParamDto> activeRuleParams = newArrayList(new ActiveRuleParamDto());
+    when(activeRuleDao.selectParamsByActiveRuleId(eq(5), eq(session))).thenReturn(activeRuleParams);
+
+    long now = System.currentTimeMillis();
+    doReturn(now).when(system).now();
+
+    operations.updateActiveRuleNote(activeRule, "My note", authorizedUserSession);
+
+    ArgumentCaptor<ActiveRuleDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleDto.class);
+    verify(activeRuleDao).update(argumentCaptor.capture(), eq(session));
+    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My note");
+    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
+    assertThat(argumentCaptor.getValue().getNoteCreatedAt().getTime()).isEqualTo(now);
+    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(activeRule), eq(activeRuleParams));
+  }
+
+  @Test
+  public void update_active_rule_note_when_already_note() throws Exception {
+    Date createdAt = DateUtils.parseDate("2013-12-20");
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1)
+      .setNoteCreatedAt(createdAt).setNoteData("My previous note").setNoteUserLogin("nicolas");
+
+    List<ActiveRuleParamDto> activeRuleParams = newArrayList(new ActiveRuleParamDto());
+    when(activeRuleDao.selectParamsByActiveRuleId(eq(5), eq(session))).thenReturn(activeRuleParams);
+
+    long now = System.currentTimeMillis();
+    doReturn(now).when(system).now();
+
+    operations.updateActiveRuleNote(activeRule, "My new note", MockUserSession.create().setLogin("guy").setName("Guy").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN));
+
+    ArgumentCaptor<ActiveRuleDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleDto.class);
+    verify(activeRuleDao).update(argumentCaptor.capture(), eq(session));
+    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My new note");
+    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
+    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isEqualTo(createdAt);
+    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(activeRule), eq(activeRuleParams));
+  }
+
+  @Test
+  public void delete_active_rule_note() throws Exception {
+    Date createdAt = DateUtils.parseDate("2013-12-20");
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1)
+      .setNoteData("My note").setNoteUserLogin("nicolas").setNoteCreatedAt(createdAt).setNoteUpdatedAt(createdAt);
+
+    List<ActiveRuleParamDto> activeRuleParams = newArrayList(new ActiveRuleParamDto());
+    when(activeRuleDao.selectParamsByActiveRuleId(eq(5), eq(session))).thenReturn(activeRuleParams);
+
+    long now = System.currentTimeMillis();
+    doReturn(now).when(system).now();
+
+    operations.deleteActiveRuleNote(activeRule, authorizedUserSession);
+
+    ArgumentCaptor<ActiveRuleDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleDto.class);
+    verify(activeRuleDao).update(argumentCaptor.capture());
+    assertThat(argumentCaptor.getValue().getNoteData()).isNull();
+    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isNull();
+    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isNull();
+    assertThat(argumentCaptor.getValue().getNoteUpdatedAt()).isNull();
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(activeRule), eq(activeRuleParams));
+  }
+
+}
index 833719b57ba4f9b109335393f3d676ae2b26a689..9ea29affcdd8e5fb4e603e6aaef159dc89f3f152 100644 (file)
@@ -20,8 +20,6 @@
 
 package org.sonar.server.qualityprofile;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import org.apache.ibatis.session.SqlSession;
@@ -33,17 +31,13 @@ import org.mockito.Mock;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.mockito.stubbing.Answer;
-import org.sonar.api.PropertyType;
 import org.sonar.api.profiles.ProfileImporter;
 import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.rule.Severity;
 import org.sonar.api.rules.ActiveRule;
 import org.sonar.api.rules.Rule;
 import org.sonar.api.rules.RulePriority;
-import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.System2;
 import org.sonar.api.utils.ValidationMessages;
-import org.sonar.check.Cardinality;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.preview.PreviewCache;
@@ -51,9 +45,6 @@ import org.sonar.core.properties.PropertiesDao;
 import org.sonar.core.properties.PropertyDto;
 import org.sonar.core.qualityprofile.db.*;
 import org.sonar.core.rule.RuleDao;
-import org.sonar.core.rule.RuleDto;
-import org.sonar.core.rule.RuleParamDto;
-import org.sonar.server.configuration.ProfilesManager;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.rule.RuleRegistry;
@@ -61,7 +52,6 @@ import org.sonar.server.user.MockUserSession;
 import org.sonar.server.user.UserSession;
 
 import java.io.Reader;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -70,11 +60,8 @@ import static com.google.common.collect.Maps.newHashMap;
 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.anyInt;
-import static org.mockito.Matchers.anyList;
 import static org.mockito.Matchers.anyListOf;
 import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.*;
 
 @RunWith(MockitoJUnitRunner.class)
@@ -104,9 +91,6 @@ public class QProfileOperationsTest {
   @Mock
   RuleRegistry ruleRegistry;
 
-  @Mock
-  ProfilesManager profilesManager;
-
   @Mock
   System2 system;
 
@@ -133,8 +117,7 @@ public class QProfileOperationsTest {
       }
     }).when(activeRuleDao).insert(any(ActiveRuleDto.class), any(SqlSession.class));
 
-    operations = new QProfileOperations(myBatis, qualityProfileDao, activeRuleDao, ruleDao, propertiesDao, importers, dryRunCache, ruleRegistry, profilesManager,
-      system);
+    operations = new QProfileOperations(myBatis, qualityProfileDao, activeRuleDao, ruleDao, propertiesDao, importers, dryRunCache, ruleRegistry, system);
   }
 
   @Test
@@ -252,390 +235,4 @@ public class QProfileOperationsTest {
     assertThat(argumentCaptor.getValue().getValue()).isEqualTo("My profile");
   }
 
-  @Test
-  public void activate_rule() throws Exception {
-    QualityProfileDto qualityProfile = new QualityProfileDto().setId(1).setName("My profile").setLanguage("java");
-    RuleDto rule = new RuleDto().setId(10).setRepositoryKey("squid").setRuleKey("AvoidCycle");
-    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10")));
-    final int idActiveRuleToUpdate = 42;
-    final int idActiveRuleToDelete = 24;
-    RuleInheritanceActions inheritanceActions = new RuleInheritanceActions()
-      .addToIndex(idActiveRuleToUpdate)
-      .addToDelete(idActiveRuleToDelete);
-    when(profilesManager.activated(eq(1), anyInt(), eq("Nicolas"))).thenReturn(inheritanceActions);
-    when(activeRuleDao.selectByIds(anyList(), isA(SqlSession.class))).thenReturn(ImmutableList.<ActiveRuleDto>of(mock(ActiveRuleDto.class)));
-    when(activeRuleDao.selectParamsByActiveRuleIds(anyList(), isA(SqlSession.class))).thenReturn(ImmutableList.<ActiveRuleParamDto>of(mock(ActiveRuleParamDto.class)));
-
-    ActiveRuleDto result = operations.createActiveRule(qualityProfile, rule, Severity.CRITICAL, authorizedUserSession);
-    assertThat(result).isNotNull();
-
-    ArgumentCaptor<ActiveRuleDto> activeRuleArgument = ArgumentCaptor.forClass(ActiveRuleDto.class);
-    verify(activeRuleDao).insert(activeRuleArgument.capture(), eq(session));
-    assertThat(activeRuleArgument.getValue().getRulId()).isEqualTo(10);
-    assertThat(activeRuleArgument.getValue().getSeverity()).isEqualTo(3);
-
-    ArgumentCaptor<ActiveRuleParamDto> activeRuleParamArgument = ArgumentCaptor.forClass(ActiveRuleParamDto.class);
-    verify(activeRuleDao).insert(activeRuleParamArgument.capture(), eq(session));
-    assertThat(activeRuleParamArgument.getValue().getKey()).isEqualTo("max");
-    assertThat(activeRuleParamArgument.getValue().getValue()).isEqualTo("10");
-
-    verify(session).commit();
-    verify(profilesManager).activated(eq(1), anyInt(), eq("Nicolas"));
-    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
-  }
-
-  @Test
-  public void update_severity() throws Exception {
-    Rule rule = Rule.create().setRepositoryKey("squid").setKey("AvoidCycle");
-    rule.setId(10);
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-    when(profilesManager.ruleSeverityChanged(eq(1), eq(5), eq(RulePriority.MINOR), eq(RulePriority.MAJOR), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
-
-    operations.updateSeverity(activeRule, Severity.MAJOR, authorizedUserSession);
-
-    verify(activeRuleDao).update(eq(activeRule), eq(session));
-    verify(session).commit();
-    verify(profilesManager).ruleSeverityChanged(eq(1), eq(5), eq(RulePriority.MINOR), eq(RulePriority.MAJOR), eq("Nicolas"));
-    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
-  }
-
-  @Test
-  public void fail_to_update_severity_on_invalid_severity() throws Exception {
-    Rule rule = Rule.create().setRepositoryKey("squid").setKey("AvoidCycle");
-    rule.setId(10);
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-
-    try {
-      operations.updateSeverity(activeRule, "Unknown", authorizedUserSession);
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(BadRequestException.class);
-    }
-    verify(activeRuleDao, never()).update(eq(activeRule), eq(session));
-    verifyZeroInteractions(profilesManager);
-  }
-
-  @Test
-  public void deactivate_rule() throws Exception {
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-    when(activeRuleDao.selectByProfileAndRule(1, 10)).thenReturn(activeRule);
-    when(profilesManager.deactivated(eq(1), anyInt(), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
-
-    operations.deactivateRule(activeRule, authorizedUserSession);
-
-    verify(activeRuleDao).delete(eq(5), eq(session));
-    verify(activeRuleDao).deleteParameters(eq(5), eq(session));
-    verify(session).commit();
-    verify(profilesManager).deactivated(eq(1), anyInt(), eq("Nicolas"));
-    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
-  }
-
-  @Test
-  public void update_active_rule_param() throws Exception {
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-    ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto().setId(100).setActiveRuleId(5).setKey("max").setValue("20");
-
-    RuleParamDto ruleParam = new RuleParamDto().setRuleId(10).setName("max").setDefaultValue("20").setType(PropertyType.INTEGER.name());
-    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(ruleParam);
-
-    when(profilesManager.ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq("30"), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
-
-    operations.updateActiveRuleParam(activeRule, activeRuleParam, "30", authorizedUserSession);
-
-    ArgumentCaptor<ActiveRuleParamDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleParamDto.class);
-    verify(activeRuleDao).update(argumentCaptor.capture(), eq(session));
-    assertThat(argumentCaptor.getValue().getId()).isEqualTo(100);
-    assertThat(argumentCaptor.getValue().getValue()).isEqualTo("30");
-
-    verify(session).commit();
-    verify(profilesManager).ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq("30"), eq("Nicolas"));
-    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
-  }
-
-  @Test
-  public void remove_active_rule_param() throws Exception {
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-    ActiveRuleParamDto activeRuleParam = new ActiveRuleParamDto().setId(100).setActiveRuleId(5).setKey("max").setValue("20");
-    when(profilesManager.ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq((String) null), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
-
-    operations.deleteActiveRuleParam(activeRule, activeRuleParam, authorizedUserSession);
-
-    verify(session).commit();
-    verify(activeRuleDao).deleteParameter(100, session);
-    verify(profilesManager).ruleParamChanged(eq(1), eq(5), eq("max"), eq("20"), eq((String) null), eq("Nicolas"));
-    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
-  }
-
-  @Test
-  public void create_active_rule_param() throws Exception {
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-    RuleParamDto ruleParam = new RuleParamDto().setRuleId(10).setName("max").setDefaultValue("20").setType(PropertyType.INTEGER.name());
-    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(ruleParam);
-    when(profilesManager.ruleParamChanged(eq(1), eq(5), eq("max"), eq((String) null), eq("30"), eq("Nicolas"))).thenReturn(new RuleInheritanceActions());
-
-    operations.createActiveRuleParam(activeRule, "max", "30", authorizedUserSession);
-
-    ArgumentCaptor<ActiveRuleParamDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleParamDto.class);
-    verify(activeRuleDao).insert(argumentCaptor.capture(), eq(session));
-    assertThat(argumentCaptor.getValue().getKey()).isEqualTo("max");
-    assertThat(argumentCaptor.getValue().getValue()).isEqualTo("30");
-    assertThat(argumentCaptor.getValue().getActiveRuleId()).isEqualTo(5);
-
-    verify(session).commit();
-    verify(profilesManager).ruleParamChanged(eq(1), eq(5), eq("max"), eq((String) null), eq("30"), eq("Nicolas"));
-    verify(ruleRegistry).bulkIndexActiveRules(anyList(), isA(Multimap.class));
-  }
-
-  @Test
-  public void fail_to_create_active_rule_if_no_rule_param() throws Exception {
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(null);
-    try {
-      operations.createActiveRuleParam(activeRule, "max", "30", authorizedUserSession);
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(IllegalArgumentException.class);
-    }
-    verify(activeRuleDao, never()).insert(any(ActiveRuleParamDto.class), eq(session));
-    verifyZeroInteractions(profilesManager);
-  }
-
-  @Test
-  public void fail_to_create_active_rule_if_type_is_invalid() throws Exception {
-    RuleParamDto ruleParam = new RuleParamDto().setRuleId(10).setName("max").setDefaultValue("20").setType(PropertyType.INTEGER.name());
-    when(ruleDao.selectParamByRuleAndKey(10, "max", session)).thenReturn(ruleParam);
-
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1);
-    try {
-      operations.createActiveRuleParam(activeRule, "max", "invalid integer", authorizedUserSession);
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(BadRequestException.class);
-    }
-    verify(activeRuleDao, never()).insert(any(ActiveRuleParamDto.class), eq(session));
-    verifyZeroInteractions(profilesManager);
-  }
-
-  @Test
-  public void update_active_rule_note_when_no_existing_note() throws Exception {
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1).setNoteCreatedAt(null).setNoteData(null);
-
-    List<ActiveRuleParamDto> activeRuleParams = newArrayList(new ActiveRuleParamDto());
-    when(activeRuleDao.selectParamsByActiveRuleId(eq(5), eq(session))).thenReturn(activeRuleParams);
-
-    long now = System.currentTimeMillis();
-    doReturn(now).when(system).now();
-
-    operations.updateActiveRuleNote(activeRule, "My note", authorizedUserSession);
-
-    ArgumentCaptor<ActiveRuleDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleDto.class);
-    verify(activeRuleDao).update(argumentCaptor.capture(), eq(session));
-    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My note");
-    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
-    assertThat(argumentCaptor.getValue().getNoteCreatedAt().getTime()).isEqualTo(now);
-    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(activeRule), eq(activeRuleParams));
-  }
-
-  @Test
-  public void update_active_rule_note_when_already_note() throws Exception {
-    Date createdAt = DateUtils.parseDate("2013-12-20");
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1)
-      .setNoteCreatedAt(createdAt).setNoteData("My previous note").setNoteUserLogin("nicolas");
-
-    List<ActiveRuleParamDto> activeRuleParams = newArrayList(new ActiveRuleParamDto());
-    when(activeRuleDao.selectParamsByActiveRuleId(eq(5), eq(session))).thenReturn(activeRuleParams);
-
-    long now = System.currentTimeMillis();
-    doReturn(now).when(system).now();
-
-    operations.updateActiveRuleNote(activeRule, "My new note", MockUserSession.create().setLogin("guy").setName("Guy").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN));
-
-    ArgumentCaptor<ActiveRuleDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleDto.class);
-    verify(activeRuleDao).update(argumentCaptor.capture(), eq(session));
-    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My new note");
-    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
-    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isEqualTo(createdAt);
-    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(activeRule), eq(activeRuleParams));
-  }
-
-  @Test
-  public void delete_active_rule_note() throws Exception {
-    Date createdAt = DateUtils.parseDate("2013-12-20");
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1)
-      .setNoteData("My note").setNoteUserLogin("nicolas").setNoteCreatedAt(createdAt).setNoteUpdatedAt(createdAt);
-
-    List<ActiveRuleParamDto> activeRuleParams = newArrayList(new ActiveRuleParamDto());
-    when(activeRuleDao.selectParamsByActiveRuleId(eq(5), eq(session))).thenReturn(activeRuleParams);
-
-    long now = System.currentTimeMillis();
-    doReturn(now).when(system).now();
-
-    operations.deleteActiveRuleNote(activeRule, authorizedUserSession);
-
-    ArgumentCaptor<ActiveRuleDto> argumentCaptor = ArgumentCaptor.forClass(ActiveRuleDto.class);
-    verify(activeRuleDao).update(argumentCaptor.capture());
-    assertThat(argumentCaptor.getValue().getNoteData()).isNull();
-    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isNull();
-    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isNull();
-    assertThat(argumentCaptor.getValue().getNoteUpdatedAt()).isNull();
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(activeRule), eq(activeRuleParams));
-  }
-
-  @Test
-  public void update_rule_note_when_no_existing_note() throws Exception {
-    RuleDto rule = new RuleDto().setId(10).setNoteCreatedAt(null).setNoteData(null);
-
-    List<RuleParamDto> ruleParams = newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10"));
-    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(ruleParams);
-
-    long now = System.currentTimeMillis();
-    doReturn(now).when(system).now();
-
-    operations.updateRuleNote(rule, "My note", authorizedUserSession);
-
-    ArgumentCaptor<RuleDto> argumentCaptor = ArgumentCaptor.forClass(RuleDto.class);
-    verify(ruleDao).update(argumentCaptor.capture());
-    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My note");
-    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
-    assertThat(argumentCaptor.getValue().getNoteCreatedAt().getTime()).isEqualTo(now);
-    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(rule), eq(ruleParams));
-  }
-
-  @Test
-  public void update_rule_note_when_already_note() throws Exception {
-    Date createdAt = DateUtils.parseDate("2013-12-20");
-    RuleDto rule = new RuleDto().setId(10).setNoteCreatedAt(createdAt).setNoteData("My previous note").setNoteUserLogin("nicolas");
-
-    List<RuleParamDto> ruleParams = newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10"));
-    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(ruleParams);
-
-    long now = System.currentTimeMillis();
-    doReturn(now).when(system).now();
-
-    operations.updateRuleNote(rule, "My new note", MockUserSession.create().setLogin("guy").setName("Guy").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN));
-
-    ArgumentCaptor<RuleDto> argumentCaptor = ArgumentCaptor.forClass(RuleDto.class);
-    verify(ruleDao).update(argumentCaptor.capture());
-    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My new note");
-    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
-    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isEqualTo(createdAt);
-    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(rule), eq(ruleParams));
-  }
-
-  @Test
-  public void delete_rule_note() throws Exception {
-    Date createdAt = DateUtils.parseDate("2013-12-20");
-    RuleDto rule = new RuleDto().setId(10).setNoteData("My note").setNoteUserLogin("nicolas").setNoteCreatedAt(createdAt).setNoteUpdatedAt(createdAt);
-
-    List<RuleParamDto> ruleParams = newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10"));
-    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(ruleParams);
-
-    long now = System.currentTimeMillis();
-    doReturn(now).when(system).now();
-
-    operations.deleteRuleNote(rule, authorizedUserSession);
-
-    ArgumentCaptor<RuleDto> argumentCaptor = ArgumentCaptor.forClass(RuleDto.class);
-    verify(ruleDao).update(argumentCaptor.capture());
-    assertThat(argumentCaptor.getValue().getNoteData()).isNull();
-    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isNull();
-    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isNull();
-    assertThat(argumentCaptor.getValue().getNoteUpdatedAt()).isNull();
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(rule), eq(ruleParams));
-  }
-
-  @Test
-  public void create_rule() throws Exception {
-    RuleDto templateRule = new RuleDto().setId(10).setRepositoryKey("squid").setRuleKey("AvoidCycle").setConfigKey("Xpath");
-    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10")));
-
-    Map<String, String> paramsByKey = ImmutableMap.of("max", "20");
-    RuleDto result = operations.createRule(templateRule, "My New Rule", Severity.BLOCKER, "Rule Description", paramsByKey, authorizedUserSession);
-    assertThat(result).isNotNull();
-
-    ArgumentCaptor<RuleDto> ruleArgument = ArgumentCaptor.forClass(RuleDto.class);
-    verify(ruleDao).insert(ruleArgument.capture(), eq(session));
-    assertThat(ruleArgument.getValue().getParentId()).isEqualTo(10);
-    assertThat(ruleArgument.getValue().getName()).isEqualTo("My New Rule");
-    assertThat(ruleArgument.getValue().getDescription()).isEqualTo("Rule Description");
-    assertThat(ruleArgument.getValue().getSeverity()).isEqualTo(4);
-    assertThat(ruleArgument.getValue().getConfigKey()).isEqualTo("Xpath");
-    assertThat(ruleArgument.getValue().getRepositoryKey()).isEqualTo("squid");
-    assertThat(ruleArgument.getValue().getRuleKey()).startsWith("AvoidCycle");
-    assertThat(ruleArgument.getValue().getStatus()).isEqualTo("READY");
-    assertThat(ruleArgument.getValue().getCardinality()).isEqualTo(Cardinality.SINGLE);
-
-    ArgumentCaptor<RuleParamDto> ruleParamArgument = ArgumentCaptor.forClass(RuleParamDto.class);
-    verify(ruleDao).insert(ruleParamArgument.capture(), eq(session));
-    assertThat(ruleParamArgument.getValue().getName()).isEqualTo("max");
-    assertThat(ruleParamArgument.getValue().getDefaultValue()).isEqualTo("20");
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(ruleArgument.getValue()), eq(newArrayList(ruleParamArgument.getValue())));
-  }
-
-  @Test
-  public void update_rule() throws Exception {
-    RuleDto rule = new RuleDto().setId(11).setRepositoryKey("squid").setRuleKey("XPath_1387869254").setConfigKey("Xpath");
-    when(ruleDao.selectParameters(eq(11), eq(session))).thenReturn(newArrayList(new RuleParamDto().setId(21).setName("max").setDefaultValue("20")));
-
-    Map<String, String> paramsByKey = ImmutableMap.of("max", "21");
-    operations.updateRule(rule, "Updated Rule", Severity.MAJOR, "Updated Description", paramsByKey, authorizedUserSession);
-
-    ArgumentCaptor<RuleDto> ruleArgument = ArgumentCaptor.forClass(RuleDto.class);
-    verify(ruleDao).update(ruleArgument.capture(), eq(session));
-    assertThat(ruleArgument.getValue().getName()).isEqualTo("Updated Rule");
-    assertThat(ruleArgument.getValue().getDescription()).isEqualTo("Updated Description");
-    assertThat(ruleArgument.getValue().getSeverity()).isEqualTo(2);
-
-    ArgumentCaptor<RuleParamDto> ruleParamArgument = ArgumentCaptor.forClass(RuleParamDto.class);
-    verify(ruleDao).update(ruleParamArgument.capture(), eq(session));
-    assertThat(ruleParamArgument.getValue().getDefaultValue()).isEqualTo("21");
-
-    verify(session).commit();
-    verify(ruleRegistry).save(eq(ruleArgument.getValue()), eq(newArrayList(ruleParamArgument.getValue())));
-  }
-
-  @Test
-  public void delete_rule() throws Exception {
-    RuleDto rule = new RuleDto().setId(11).setRepositoryKey("squid").setRuleKey("XPath_1387869254").setConfigKey("Xpath").setUpdatedAt(DateUtils.parseDate("2013-12-23"));
-    RuleParamDto param = new RuleParamDto().setId(21).setName("max").setDefaultValue("20");
-    when(ruleDao.selectParameters(eq(11), eq(session))).thenReturn(newArrayList(param));
-
-    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(11).setSeverity(1);
-    when(activeRuleDao.selectByRuleId(11)).thenReturn(newArrayList(activeRule));
-
-    long now = System.currentTimeMillis();
-    doReturn(now).when(system).now();
-
-    operations.deleteRule(rule, authorizedUserSession);
-
-    ArgumentCaptor<RuleDto> ruleArgument = ArgumentCaptor.forClass(RuleDto.class);
-    verify(ruleDao).update(ruleArgument.capture(), eq(session));
-    assertThat(ruleArgument.getValue().getStatus()).isEqualTo(Rule.STATUS_REMOVED);
-    assertThat(ruleArgument.getValue().getUpdatedAt()).isEqualTo(new Date(now));
-
-    verify(ruleRegistry).save(eq(ruleArgument.getValue()), eq(newArrayList(param)));
-    verify(activeRuleDao).deleteParameters(eq(5), eq(session));
-    verify(activeRuleDao).deleteFromRule(eq(11), eq(session));
-    verify(session, times(2)).commit();
-    verify(ruleRegistry).deleteActiveRules(newArrayList(5));
-  }
-
 }
diff --git a/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileRuleOperationsTest.java b/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileRuleOperationsTest.java
new file mode 100644 (file)
index 0000000..d0a9b31
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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.qualityprofile;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.ibatis.session.SqlSession;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
+import org.sonar.api.rule.Severity;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.utils.DateUtils;
+import org.sonar.api.utils.System2;
+import org.sonar.check.Cardinality;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.qualityprofile.db.ActiveRuleDao;
+import org.sonar.core.qualityprofile.db.ActiveRuleDto;
+import org.sonar.core.rule.RuleDao;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.core.rule.RuleParamDto;
+import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.rule.RuleRegistry;
+import org.sonar.server.user.MockUserSession;
+import org.sonar.server.user.UserSession;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
+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.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class QProfileRuleOperationsTest {
+
+  @Mock
+  MyBatis myBatis;
+
+  @Mock
+  SqlSession session;
+
+  @Mock
+  ActiveRuleDao activeRuleDao;
+
+  @Mock
+  RuleDao ruleDao;
+
+  @Mock
+  RuleRegistry ruleRegistry;
+
+  @Mock
+  System2 system;
+
+  Integer currentId = 1;
+
+  UserSession authorizedUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  UserSession unauthorizedUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas");
+
+  QProfileRuleOperations operations;
+
+  @Before
+  public void setUp() throws Exception {
+    when(myBatis.openSession()).thenReturn(session);
+
+    // Associate an id when inserting an object to simulate the db id generator
+    doAnswer(new Answer() {
+      public Object answer(InvocationOnMock invocation) {
+        Object[] args = invocation.getArguments();
+        ActiveRuleDto dto = (ActiveRuleDto) args[0];
+        dto.setId(currentId++);
+        return null;
+      }
+    }).when(activeRuleDao).insert(any(ActiveRuleDto.class), any(SqlSession.class));
+
+    operations = new QProfileRuleOperations(myBatis, activeRuleDao, ruleDao, ruleRegistry, system);
+  }
+
+  @Test
+  public void update_rule_note_when_no_existing_note() throws Exception {
+    RuleDto rule = new RuleDto().setId(10).setNoteCreatedAt(null).setNoteData(null);
+
+    List<RuleParamDto> ruleParams = newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10"));
+    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(ruleParams);
+
+    long now = System.currentTimeMillis();
+    doReturn(now).when(system).now();
+
+    operations.updateRuleNote(rule, "My note", authorizedUserSession);
+
+    ArgumentCaptor<RuleDto> argumentCaptor = ArgumentCaptor.forClass(RuleDto.class);
+    verify(ruleDao).update(argumentCaptor.capture());
+    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My note");
+    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
+    assertThat(argumentCaptor.getValue().getNoteCreatedAt().getTime()).isEqualTo(now);
+    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(rule), eq(ruleParams));
+  }
+
+  @Test
+  public void fail_to_update_rule_note_without_profile_admin_permission() throws Exception {
+    RuleDto rule = new RuleDto().setId(10).setRepositoryKey("squid").setRuleKey("AvoidCycle");
+
+    try {
+      operations.updateRuleNote(rule, "My note", unauthorizedUserSession);
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(ForbiddenException.class);
+    }
+    verifyNoMoreInteractions(ruleDao);
+    verify(session, never()).commit();
+  }
+
+  @Test
+  public void update_rule_note_when_already_note() throws Exception {
+    Date createdAt = DateUtils.parseDate("2013-12-20");
+    RuleDto rule = new RuleDto().setId(10).setNoteCreatedAt(createdAt).setNoteData("My previous note").setNoteUserLogin("nicolas");
+
+    List<RuleParamDto> ruleParams = newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10"));
+    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(ruleParams);
+
+    long now = System.currentTimeMillis();
+    doReturn(now).when(system).now();
+
+    operations.updateRuleNote(rule, "My new note", MockUserSession.create().setLogin("guy").setName("Guy").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN));
+
+    ArgumentCaptor<RuleDto> argumentCaptor = ArgumentCaptor.forClass(RuleDto.class);
+    verify(ruleDao).update(argumentCaptor.capture());
+    assertThat(argumentCaptor.getValue().getNoteData()).isEqualTo("My new note");
+    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isEqualTo("nicolas");
+    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isEqualTo(createdAt);
+    assertThat(argumentCaptor.getValue().getNoteUpdatedAt().getTime()).isEqualTo(now);
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(rule), eq(ruleParams));
+  }
+
+  @Test
+  public void delete_rule_note() throws Exception {
+    Date createdAt = DateUtils.parseDate("2013-12-20");
+    RuleDto rule = new RuleDto().setId(10).setNoteData("My note").setNoteUserLogin("nicolas").setNoteCreatedAt(createdAt).setNoteUpdatedAt(createdAt);
+
+    List<RuleParamDto> ruleParams = newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10"));
+    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(ruleParams);
+
+    long now = System.currentTimeMillis();
+    doReturn(now).when(system).now();
+
+    operations.deleteRuleNote(rule, authorizedUserSession);
+
+    ArgumentCaptor<RuleDto> argumentCaptor = ArgumentCaptor.forClass(RuleDto.class);
+    verify(ruleDao).update(argumentCaptor.capture());
+    assertThat(argumentCaptor.getValue().getNoteData()).isNull();
+    assertThat(argumentCaptor.getValue().getNoteUserLogin()).isNull();
+    assertThat(argumentCaptor.getValue().getNoteCreatedAt()).isNull();
+    assertThat(argumentCaptor.getValue().getNoteUpdatedAt()).isNull();
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(rule), eq(ruleParams));
+  }
+
+  @Test
+  public void create_rule() throws Exception {
+    RuleDto templateRule = new RuleDto().setId(10).setRepositoryKey("squid").setRuleKey("AvoidCycle").setConfigKey("Xpath");
+    when(ruleDao.selectParameters(eq(10), eq(session))).thenReturn(newArrayList(new RuleParamDto().setId(20).setName("max").setDefaultValue("10")));
+
+    Map<String, String> paramsByKey = ImmutableMap.of("max", "20");
+    RuleDto result = operations.createRule(templateRule, "My New Rule", Severity.BLOCKER, "Rule Description", paramsByKey, authorizedUserSession);
+    assertThat(result).isNotNull();
+
+    ArgumentCaptor<RuleDto> ruleArgument = ArgumentCaptor.forClass(RuleDto.class);
+    verify(ruleDao).insert(ruleArgument.capture(), eq(session));
+    assertThat(ruleArgument.getValue().getParentId()).isEqualTo(10);
+    assertThat(ruleArgument.getValue().getName()).isEqualTo("My New Rule");
+    assertThat(ruleArgument.getValue().getDescription()).isEqualTo("Rule Description");
+    assertThat(ruleArgument.getValue().getSeverity()).isEqualTo(4);
+    assertThat(ruleArgument.getValue().getConfigKey()).isEqualTo("Xpath");
+    assertThat(ruleArgument.getValue().getRepositoryKey()).isEqualTo("squid");
+    assertThat(ruleArgument.getValue().getRuleKey()).startsWith("AvoidCycle");
+    assertThat(ruleArgument.getValue().getStatus()).isEqualTo("READY");
+    assertThat(ruleArgument.getValue().getCardinality()).isEqualTo(Cardinality.SINGLE);
+
+    ArgumentCaptor<RuleParamDto> ruleParamArgument = ArgumentCaptor.forClass(RuleParamDto.class);
+    verify(ruleDao).insert(ruleParamArgument.capture(), eq(session));
+    assertThat(ruleParamArgument.getValue().getName()).isEqualTo("max");
+    assertThat(ruleParamArgument.getValue().getDefaultValue()).isEqualTo("20");
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(ruleArgument.getValue()), eq(newArrayList(ruleParamArgument.getValue())));
+  }
+
+  @Test
+  public void update_rule() throws Exception {
+    RuleDto rule = new RuleDto().setId(11).setRepositoryKey("squid").setRuleKey("XPath_1387869254").setConfigKey("Xpath");
+    when(ruleDao.selectParameters(eq(11), eq(session))).thenReturn(newArrayList(new RuleParamDto().setId(21).setName("max").setDefaultValue("20")));
+
+    Map<String, String> paramsByKey = ImmutableMap.of("max", "21");
+    operations.updateRule(rule, "Updated Rule", Severity.MAJOR, "Updated Description", paramsByKey, authorizedUserSession);
+
+    ArgumentCaptor<RuleDto> ruleArgument = ArgumentCaptor.forClass(RuleDto.class);
+    verify(ruleDao).update(ruleArgument.capture(), eq(session));
+    assertThat(ruleArgument.getValue().getName()).isEqualTo("Updated Rule");
+    assertThat(ruleArgument.getValue().getDescription()).isEqualTo("Updated Description");
+    assertThat(ruleArgument.getValue().getSeverity()).isEqualTo(2);
+
+    ArgumentCaptor<RuleParamDto> ruleParamArgument = ArgumentCaptor.forClass(RuleParamDto.class);
+    verify(ruleDao).update(ruleParamArgument.capture(), eq(session));
+    assertThat(ruleParamArgument.getValue().getDefaultValue()).isEqualTo("21");
+
+    verify(session).commit();
+    verify(ruleRegistry).save(eq(ruleArgument.getValue()), eq(newArrayList(ruleParamArgument.getValue())));
+  }
+
+  @Test
+  public void delete_rule() throws Exception {
+    RuleDto rule = new RuleDto().setId(11).setRepositoryKey("squid").setRuleKey("XPath_1387869254").setConfigKey("Xpath").setUpdatedAt(DateUtils.parseDate("2013-12-23"));
+    RuleParamDto param = new RuleParamDto().setId(21).setName("max").setDefaultValue("20");
+    when(ruleDao.selectParameters(eq(11), eq(session))).thenReturn(newArrayList(param));
+
+    ActiveRuleDto activeRule = new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(11).setSeverity(1);
+    when(activeRuleDao.selectByRuleId(11)).thenReturn(newArrayList(activeRule));
+
+    long now = System.currentTimeMillis();
+    doReturn(now).when(system).now();
+
+    operations.deleteRule(rule, authorizedUserSession);
+
+    ArgumentCaptor<RuleDto> ruleArgument = ArgumentCaptor.forClass(RuleDto.class);
+    verify(ruleDao).update(ruleArgument.capture(), eq(session));
+    assertThat(ruleArgument.getValue().getStatus()).isEqualTo(Rule.STATUS_REMOVED);
+    assertThat(ruleArgument.getValue().getUpdatedAt()).isEqualTo(new Date(now));
+
+    verify(ruleRegistry).save(eq(ruleArgument.getValue()), eq(newArrayList(param)));
+    verify(activeRuleDao).deleteParameters(eq(5), eq(session));
+    verify(activeRuleDao).deleteFromRule(eq(11), eq(session));
+    verify(session, times(2)).commit();
+    verify(ruleRegistry).deleteActiveRules(newArrayList(5));
+  }
+
+}
index e31dfabf775eca88e06c4ac00d073ff4176ecc87..8a30360ec39134788c023a9a1ee33f3a6abd3421 100644 (file)
@@ -74,6 +74,12 @@ public class QProfilesTest {
   @Mock
   QProfileOperations service;
 
+  @Mock
+  QProfileActiveRuleOperations activeRuleOperations;
+
+  @Mock
+  QProfileRuleOperations ruleOperations;
+
   @Mock
   ProfileRules rules;
 
@@ -81,7 +87,7 @@ public class QProfilesTest {
 
   @Before
   public void setUp() throws Exception {
-    qProfiles = new QProfiles(qualityProfileDao, activeRuleDao, ruleDao, resourceDao, projectService, search, service, rules);
+    qProfiles = new QProfiles(qualityProfileDao, activeRuleDao, ruleDao, resourceDao, projectService, search, service, activeRuleOperations, ruleOperations, rules);
   }
 
   @Test
@@ -320,12 +326,12 @@ public class QProfilesTest {
     RuleDto rule = new RuleDto().setId(10).setRepositoryKey("squid").setRuleKey("AvoidCycle");
     when(ruleDao.selectById(10)).thenReturn(rule);
 
-    when(service.createActiveRule(eq(qualityProfile), eq(rule), eq(Severity.BLOCKER), any(UserSession.class)))
+    when(activeRuleOperations.createActiveRule(eq(qualityProfile), eq(rule), eq(Severity.BLOCKER), any(UserSession.class)))
       .thenReturn(new ActiveRuleDto().setId(5).setProfileId(1).setRuleId(10).setSeverity(1));
 
     qProfiles.activateRule(1, 10, Severity.BLOCKER);
 
-    verify(service).createActiveRule(eq(qualityProfile), eq(rule), eq(Severity.BLOCKER), any(UserSession.class));
+    verify(activeRuleOperations).createActiveRule(eq(qualityProfile), eq(rule), eq(Severity.BLOCKER), any(UserSession.class));
   }
 
   @Test
@@ -357,7 +363,7 @@ public class QProfilesTest {
 
     qProfiles.activateRule(1, 10, Severity.BLOCKER);
 
-    verify(service).updateSeverity(eq(activeRule), eq(Severity.BLOCKER), any(UserSession.class));
+    verify(activeRuleOperations).updateSeverity(eq(activeRule), eq(Severity.BLOCKER), any(UserSession.class));
   }
 
   @Test
@@ -371,7 +377,7 @@ public class QProfilesTest {
 
     qProfiles.deactivateRule(1, 10);
 
-    verify(service).deactivateRule(eq(activeRule), any(UserSession.class));
+    verify(activeRuleOperations).deactivateRule(eq(activeRule), any(UserSession.class));
   }
 
   @Test
@@ -416,7 +422,7 @@ public class QProfilesTest {
 
     qProfiles.updateActiveRuleParam(1, 50, "max", "20");
 
-    verify(service).updateActiveRuleParam(eq(activeRule), eq(activeRuleParam), eq("20"), any(UserSession.class));
+    verify(activeRuleOperations).updateActiveRuleParam(eq(activeRule), eq(activeRuleParam), eq("20"), any(UserSession.class));
   }
 
   @Test
@@ -445,7 +451,7 @@ public class QProfilesTest {
 
     qProfiles.updateActiveRuleParam(1, 50, "max", "20");
 
-    verify(service).createActiveRuleParam(eq(activeRule), eq("max"), eq("20"), any(UserSession.class));
+    verify(activeRuleOperations).createActiveRuleParam(eq(activeRule), eq("max"), eq("20"), any(UserSession.class));
   }
 
   @Test
@@ -459,7 +465,7 @@ public class QProfilesTest {
 
     qProfiles.updateActiveRuleParam(1, 50, "max", "");
 
-    verify(service).deleteActiveRuleParam(eq(activeRule), eq(activeRuleParam), any(UserSession.class));
+    verify(activeRuleOperations).deleteActiveRuleParam(eq(activeRule), eq(activeRuleParam), any(UserSession.class));
   }
 
   @Test
@@ -481,7 +487,7 @@ public class QProfilesTest {
 
     qProfiles.updateActiveRuleNote(50, "My note");
 
-    verify(service).updateActiveRuleNote(eq(activeRule), eq("My note"), any(UserSession.class));
+    verify(activeRuleOperations).updateActiveRuleNote(eq(activeRule), eq("My note"), any(UserSession.class));
   }
 
   @Test
@@ -491,7 +497,7 @@ public class QProfilesTest {
 
     qProfiles.updateActiveRuleNote(50, "");
 
-    verify(service, never()).updateActiveRuleNote(eq(activeRule), anyString(), any(UserSession.class));
+    verify(activeRuleOperations, never()).updateActiveRuleNote(eq(activeRule), anyString(), any(UserSession.class));
   }
 
   @Test
@@ -501,7 +507,7 @@ public class QProfilesTest {
 
     qProfiles.deleteActiveRuleNote(50);
 
-    verify(service).deleteActiveRuleNote(eq(activeRule), any(UserSession.class));
+    verify(activeRuleOperations).deleteActiveRuleNote(eq(activeRule), any(UserSession.class));
   }
 
   @Test
@@ -514,7 +520,7 @@ public class QProfilesTest {
 
     qProfiles.updateRuleNote(50, 10, "My note");
 
-    verify(service).updateRuleNote(eq(rule), eq("My note"), any(UserSession.class));
+    verify(ruleOperations).updateRuleNote(eq(rule), eq("My note"), any(UserSession.class));
   }
 
   @Test
@@ -527,7 +533,7 @@ public class QProfilesTest {
 
     qProfiles.updateRuleNote(50, 10, "");
 
-    verify(service).deleteRuleNote(eq(rule), any(UserSession.class));
+    verify(ruleOperations).deleteRuleNote(eq(rule), any(UserSession.class));
   }
 
   @Test
@@ -544,11 +550,11 @@ public class QProfilesTest {
 
     RuleDto newRule = new RuleDto().setId(11);
     Map<String, String> paramsByKey = ImmutableMap.of("max", "20");
-    when(service.createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My note"), eq(paramsByKey), any(UserSession.class))).thenReturn(newRule);
+    when(ruleOperations.createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My note"), eq(paramsByKey), any(UserSession.class))).thenReturn(newRule);
 
     qProfiles.createRule(10, "Rule name", Severity.MAJOR, "My note", paramsByKey);
 
-    verify(service).createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My note"), eq(paramsByKey), any(UserSession.class));
+    verify(ruleOperations).createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My note"), eq(paramsByKey), any(UserSession.class));
     verify(rules).getFromRuleId(11);
   }
 
@@ -559,7 +565,7 @@ public class QProfilesTest {
 
     RuleDto newRule = new RuleDto().setId(11);
     Map<String, String> paramsByKey = ImmutableMap.of("max", "20");
-    when(service.createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My note"), eq(paramsByKey), any(UserSession.class))).thenReturn(newRule);
+    when(ruleOperations.createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My note"), eq(paramsByKey), any(UserSession.class))).thenReturn(newRule);
 
     try {
       qProfiles.createRule( 10, "", "", "", paramsByKey);
@@ -581,7 +587,7 @@ public class QProfilesTest {
 
     RuleDto newRule = new RuleDto().setId(11);
     Map<String, String> paramsByKey = ImmutableMap.of("max", "20");
-    when(service.createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My description"), eq(paramsByKey), any(UserSession.class))).thenReturn(newRule);
+    when(ruleOperations.createRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("My description"), eq(paramsByKey), any(UserSession.class))).thenReturn(newRule);
 
     try {
       qProfiles.createRule(10, "Rule name", Severity.MAJOR, "My description", paramsByKey);
@@ -604,7 +610,7 @@ public class QProfilesTest {
 
     qProfiles.updateRule(11, "Updated name", Severity.MAJOR, "Updated description", paramsByKey);
 
-    verify(service).updateRule(eq(rule), eq("Updated name"), eq(Severity.MAJOR), eq("Updated description"), eq(paramsByKey), any(UserSession.class));
+    verify(ruleOperations).updateRule(eq(rule), eq("Updated name"), eq(Severity.MAJOR), eq("Updated description"), eq(paramsByKey), any(UserSession.class));
     verify(rules).getFromRuleId(11);
   }
 
@@ -618,7 +624,7 @@ public class QProfilesTest {
 
     qProfiles.updateRule(11, "Rule name", Severity.MAJOR, "Updated description", paramsByKey);
 
-    verify(service).updateRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("Updated description"), eq(paramsByKey), any(UserSession.class));
+    verify(ruleOperations).updateRule(eq(rule), eq("Rule name"), eq(Severity.MAJOR), eq("Updated description"), eq(paramsByKey), any(UserSession.class));
     verify(rules).getFromRuleId(11);
   }
 
@@ -647,7 +653,7 @@ public class QProfilesTest {
 
     qProfiles.deleteRule(11);
 
-    verify(service).deleteRule(eq(rule), any(UserSession.class));
+    verify(ruleOperations).deleteRule(eq(rule), any(UserSession.class));
   }
 
   @Test