summaryrefslogtreecommitdiffstats
path: root/sonar-server/src/main
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@sonarsource.com>2014-06-06 20:09:16 +0200
committerSimon Brandhof <simon.brandhof@sonarsource.com>2014-06-06 20:09:16 +0200
commit37351e9f46baa1bfe2dd701db4d7764b942d60dc (patch)
tree74f73ff09fb708af755fb5877eaa30183f663e4f /sonar-server/src/main
parent5df41898c6e29d3db47915777d7fb579f158cab2 (diff)
downloadsonarqube-37351e9f46baa1bfe2dd701db4d7764b942d60dc.tar.gz
sonarqube-37351e9f46baa1bfe2dd701db4d7764b942d60dc.zip
SONAR-5007 fix deactivation of removed rules
Diffstat (limited to 'sonar-server/src/main')
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java148
-rw-r--r--sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java1
-rw-r--r--sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java60
-rw-r--r--sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivatorContext.java (renamed from sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivationContext.java)38
-rw-r--r--sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivatorContextFactory.java (renamed from sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivationContextFactory.java)29
-rw-r--r--sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java26
6 files changed, 227 insertions, 75 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
index 35a2803784f..a9755d354ca 100644
--- a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
+++ b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
@@ -52,7 +52,13 @@ import org.sonar.core.measure.db.MeasureFilterDao;
import org.sonar.core.metric.DefaultMetricFinder;
import org.sonar.core.notification.DefaultNotificationManager;
import org.sonar.core.permission.PermissionFacade;
-import org.sonar.core.persistence.*;
+import org.sonar.core.persistence.DaoUtils;
+import org.sonar.core.persistence.DatabaseVersion;
+import org.sonar.core.persistence.DefaultDatabase;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.persistence.PreviewDatabaseFactory;
+import org.sonar.core.persistence.SemaphoreUpdater;
+import org.sonar.core.persistence.SemaphoresImpl;
import org.sonar.core.preview.PreviewCache;
import org.sonar.core.profiling.Profiling;
import org.sonar.core.purge.PurgeProfiler;
@@ -86,11 +92,33 @@ import org.sonar.server.db.DbClient;
import org.sonar.server.db.EmbeddedDatabaseFactory;
import org.sonar.server.db.migrations.DatabaseMigrations;
import org.sonar.server.db.migrations.DatabaseMigrator;
-import org.sonar.server.debt.*;
+import org.sonar.server.debt.DebtCharacteristicsXMLImporter;
+import org.sonar.server.debt.DebtModelBackup;
+import org.sonar.server.debt.DebtModelLookup;
+import org.sonar.server.debt.DebtModelOperations;
+import org.sonar.server.debt.DebtModelPluginRepository;
+import org.sonar.server.debt.DebtModelService;
+import org.sonar.server.debt.DebtModelXMLExporter;
+import org.sonar.server.debt.DebtRulesXMLImporter;
import org.sonar.server.duplication.ws.DuplicationsParser;
import org.sonar.server.duplication.ws.DuplicationsWriter;
import org.sonar.server.duplication.ws.DuplicationsWs;
-import org.sonar.server.issue.*;
+import org.sonar.server.issue.ActionService;
+import org.sonar.server.issue.AssignAction;
+import org.sonar.server.issue.CommentAction;
+import org.sonar.server.issue.DefaultIssueFinder;
+import org.sonar.server.issue.InternalRubyIssueService;
+import org.sonar.server.issue.IssueBulkChangeService;
+import org.sonar.server.issue.IssueChangelogFormatter;
+import org.sonar.server.issue.IssueChangelogService;
+import org.sonar.server.issue.IssueCommentService;
+import org.sonar.server.issue.IssueService;
+import org.sonar.server.issue.IssueStatsFinder;
+import org.sonar.server.issue.PlanAction;
+import org.sonar.server.issue.PublicRubyIssueService;
+import org.sonar.server.issue.ServerIssueStorage;
+import org.sonar.server.issue.SetSeverityAction;
+import org.sonar.server.issue.TransitionAction;
import org.sonar.server.issue.actionplan.ActionPlanService;
import org.sonar.server.issue.actionplan.ActionPlanWs;
import org.sonar.server.issue.filter.IssueFilterService;
@@ -119,22 +147,83 @@ import org.sonar.server.platform.ws.L10nWs;
import org.sonar.server.platform.ws.RestartHandler;
import org.sonar.server.platform.ws.ServerWs;
import org.sonar.server.platform.ws.SystemWs;
-import org.sonar.server.plugins.*;
+import org.sonar.server.plugins.BatchWs;
+import org.sonar.server.plugins.InstalledPluginReferentialFactory;
+import org.sonar.server.plugins.PluginDownloader;
+import org.sonar.server.plugins.ServerExtensionInstaller;
+import org.sonar.server.plugins.ServerPluginJarInstaller;
+import org.sonar.server.plugins.ServerPluginJarsInstaller;
+import org.sonar.server.plugins.ServerPluginRepository;
+import org.sonar.server.plugins.UpdateCenterClient;
+import org.sonar.server.plugins.UpdateCenterMatrixFactory;
import org.sonar.server.qualitygate.QgateProjectFinder;
import org.sonar.server.qualitygate.QualityGates;
import org.sonar.server.qualitygate.RegisterQualityGates;
-import org.sonar.server.qualitygate.ws.*;
-import org.sonar.server.qualityprofile.*;
+import org.sonar.server.qualitygate.ws.QGatesAppAction;
+import org.sonar.server.qualitygate.ws.QGatesCopyAction;
+import org.sonar.server.qualitygate.ws.QGatesCreateAction;
+import org.sonar.server.qualitygate.ws.QGatesCreateConditionAction;
+import org.sonar.server.qualitygate.ws.QGatesDeleteConditionAction;
+import org.sonar.server.qualitygate.ws.QGatesDeselectAction;
+import org.sonar.server.qualitygate.ws.QGatesDestroyAction;
+import org.sonar.server.qualitygate.ws.QGatesListAction;
+import org.sonar.server.qualitygate.ws.QGatesRenameAction;
+import org.sonar.server.qualitygate.ws.QGatesSearchAction;
+import org.sonar.server.qualitygate.ws.QGatesSelectAction;
+import org.sonar.server.qualitygate.ws.QGatesSetAsDefaultAction;
+import org.sonar.server.qualitygate.ws.QGatesShowAction;
+import org.sonar.server.qualitygate.ws.QGatesUnsetDefaultAction;
+import org.sonar.server.qualitygate.ws.QGatesUpdateConditionAction;
+import org.sonar.server.qualitygate.ws.QGatesWs;
+import org.sonar.server.qualityprofile.BuiltInProfiles;
+import org.sonar.server.qualityprofile.ProfilesManager;
+import org.sonar.server.qualityprofile.QProfileBackuper;
+import org.sonar.server.qualityprofile.QProfileCopier;
+import org.sonar.server.qualityprofile.QProfileLookup;
+import org.sonar.server.qualityprofile.QProfileOperations;
+import org.sonar.server.qualityprofile.QProfileProjectLookup;
+import org.sonar.server.qualityprofile.QProfileProjectOperations;
+import org.sonar.server.qualityprofile.QProfileRepositoryExporter;
+import org.sonar.server.qualityprofile.QProfileReset;
+import org.sonar.server.qualityprofile.QProfileService;
+import org.sonar.server.qualityprofile.QProfiles;
+import org.sonar.server.qualityprofile.RegisterQualityProfiles;
+import org.sonar.server.qualityprofile.RuleActivator;
+import org.sonar.server.qualityprofile.RuleActivatorContextFactory;
import org.sonar.server.qualityprofile.db.ActiveRuleDao;
import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer;
-import org.sonar.server.qualityprofile.ws.*;
-import org.sonar.server.rule.*;
+import org.sonar.server.qualityprofile.ws.BulkRuleActivationActions;
+import org.sonar.server.qualityprofile.ws.ProfilesWs;
+import org.sonar.server.qualityprofile.ws.QProfileRecreateBuiltInAction;
+import org.sonar.server.qualityprofile.ws.QProfilesWs;
+import org.sonar.server.qualityprofile.ws.RuleActivationActions;
+import org.sonar.server.rule.DeprecatedRulesDefinition;
+import org.sonar.server.rule.RegisterRules;
+import org.sonar.server.rule.RubyRuleService;
+import org.sonar.server.rule.RuleCreator;
+import org.sonar.server.rule.RuleDefinitionsLoader;
+import org.sonar.server.rule.RuleDeleter;
+import org.sonar.server.rule.RuleOperations;
+import org.sonar.server.rule.RuleRepositories;
+import org.sonar.server.rule.RuleService;
+import org.sonar.server.rule.RuleUpdater;
import org.sonar.server.rule.db.RuleDao;
import org.sonar.server.rule.index.RuleIndex;
import org.sonar.server.rule.index.RuleNormalizer;
-import org.sonar.server.rule.ws.*;
-import org.sonar.server.search.*;
+import org.sonar.server.rule.ws.ActiveRuleCompleter;
+import org.sonar.server.rule.ws.AppAction;
+import org.sonar.server.rule.ws.DeleteAction;
+import org.sonar.server.rule.ws.RuleMapping;
+import org.sonar.server.rule.ws.RulesWebService;
+import org.sonar.server.rule.ws.SearchAction;
+import org.sonar.server.rule.ws.TagsAction;
+import org.sonar.server.rule.ws.UpdateAction;
+import org.sonar.server.search.ESNode;
+import org.sonar.server.search.IndexClient;
+import org.sonar.server.search.IndexQueue;
+import org.sonar.server.search.IndexQueueWorker;
+import org.sonar.server.search.IndexSynchronizer;
import org.sonar.server.source.CodeColorizers;
import org.sonar.server.source.DeprecatedSourceDecorator;
import org.sonar.server.source.HtmlSourceDecorator;
@@ -143,9 +232,27 @@ import org.sonar.server.source.ws.ScmAction;
import org.sonar.server.source.ws.ScmWriter;
import org.sonar.server.source.ws.ShowAction;
import org.sonar.server.source.ws.SourcesWs;
-import org.sonar.server.startup.*;
+import org.sonar.server.startup.CleanPreviewAnalysisCache;
+import org.sonar.server.startup.CopyRequirementsFromCharacteristicsToRules;
+import org.sonar.server.startup.GeneratePluginIndex;
+import org.sonar.server.startup.GwtPublisher;
+import org.sonar.server.startup.JdbcDriverDeployer;
+import org.sonar.server.startup.LogServerId;
+import org.sonar.server.startup.RegisterDashboards;
+import org.sonar.server.startup.RegisterDebtModel;
+import org.sonar.server.startup.RegisterMetrics;
+import org.sonar.server.startup.RegisterNewMeasureFilters;
+import org.sonar.server.startup.RegisterPermissionTemplates;
+import org.sonar.server.startup.RegisterServletFilters;
+import org.sonar.server.startup.RenameDeprecatedPropertyKeys;
+import org.sonar.server.startup.ServerMetadataPersister;
import org.sonar.server.test.CoverageService;
-import org.sonar.server.test.ws.*;
+import org.sonar.server.test.ws.CoverageShowAction;
+import org.sonar.server.test.ws.CoverageWs;
+import org.sonar.server.test.ws.TestsCoveredFilesAction;
+import org.sonar.server.test.ws.TestsShowAction;
+import org.sonar.server.test.ws.TestsTestCasesAction;
+import org.sonar.server.test.ws.TestsWs;
import org.sonar.server.text.MacroInterpreter;
import org.sonar.server.text.RubyTextService;
import org.sonar.server.ui.JRubyI18n;
@@ -153,9 +260,20 @@ import org.sonar.server.ui.JRubyProfiling;
import org.sonar.server.ui.PageDecorations;
import org.sonar.server.ui.Views;
import org.sonar.server.updatecenter.ws.UpdateCenterWs;
-import org.sonar.server.user.*;
+import org.sonar.server.user.DefaultUserService;
+import org.sonar.server.user.DoPrivileged;
+import org.sonar.server.user.GroupMembershipFinder;
+import org.sonar.server.user.GroupMembershipService;
+import org.sonar.server.user.NewUserNotifier;
+import org.sonar.server.user.SecurityRealmFactory;
import org.sonar.server.user.ws.UsersWs;
-import org.sonar.server.util.*;
+import org.sonar.server.util.BooleanTypeValidation;
+import org.sonar.server.util.FloatTypeValidation;
+import org.sonar.server.util.IntegerTypeValidation;
+import org.sonar.server.util.StringListTypeValidation;
+import org.sonar.server.util.StringTypeValidation;
+import org.sonar.server.util.TextTypeValidation;
+import org.sonar.server.util.TypeValidations;
import org.sonar.server.ws.ListingWs;
import org.sonar.server.ws.WebServiceEngine;
@@ -319,7 +437,7 @@ class ServerComponents {
pico.addSingleton(BulkRuleActivationActions.class);
pico.addSingleton(RuleActivator.class);
pico.addSingleton(QProfileService.class);
- pico.addSingleton(RuleActivationContextFactory.class);
+ pico.addSingleton(RuleActivatorContextFactory.class);
pico.addSingleton(QProfileCopier.class);
pico.addSingleton(QProfileBackuper.class);
pico.addSingleton(QProfileReset.class);
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java
index 20b358c7da2..0d74a2caa81 100644
--- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java
+++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java
@@ -106,7 +106,6 @@ public class QProfileService implements ServerComponent {
return ruleActivator.deactivate(key);
}
-
public Multimap<String, String> bulkActivate(RuleQuery ruleQuery, QualityProfileKey profile, @Nullable String severity) {
verifyAdminPermission();
return ruleActivator.bulkActivate(ruleQuery, profile, severity);
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java
index 394e8fa9fc1..afbebafd5b2 100644
--- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java
+++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java
@@ -34,6 +34,7 @@ import org.sonar.core.qualityprofile.db.ActiveRuleKey;
import org.sonar.core.qualityprofile.db.ActiveRuleParamDto;
import org.sonar.core.qualityprofile.db.QualityProfileDto;
import org.sonar.core.qualityprofile.db.QualityProfileKey;
+import org.sonar.core.rule.RuleDto;
import org.sonar.core.rule.RuleParamDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.BadRequestException;
@@ -66,13 +67,13 @@ public class RuleActivator implements ServerComponent {
private final DbClient db;
private final TypeValidations typeValidations;
- private final RuleActivationContextFactory contextFactory;
+ private final RuleActivatorContextFactory contextFactory;
private final PreviewCache previewCache;
private final IndexClient index;
private final LogService log;
public RuleActivator(DbClient db, IndexClient index,
- RuleActivationContextFactory contextFactory, TypeValidations typeValidations,
+ RuleActivatorContextFactory contextFactory, TypeValidations typeValidations,
PreviewCache previewCache, LogService log) {
this.db = db;
this.index = index;
@@ -100,7 +101,8 @@ public class RuleActivator implements ServerComponent {
}
List<ActiveRuleChange> activate(DbSession dbSession, RuleActivation activation) {
- RuleActivationContext context = contextFactory.create(activation.getKey(), dbSession);
+ RuleActivatorContext context = contextFactory.create(activation.getKey(), dbSession);
+ context.verifyForActivation();
List<ActiveRuleChange> changes = Lists.newArrayList();
ActiveRuleChange change;
if (context.activeRule() == null) {
@@ -169,7 +171,7 @@ public class RuleActivator implements ServerComponent {
return changes;
}
- private ActiveRuleDto persist(ActiveRuleChange change, RuleActivationContext context, DbSession dbSession) {
+ private ActiveRuleDto persist(ActiveRuleChange change, RuleActivatorContext context, DbSession dbSession) {
ActiveRuleDao dao = db.activeRuleDao();
ActiveRuleDto activeRule = null;
if (change.getType() == ActiveRuleChange.Type.ACTIVATED) {
@@ -244,32 +246,55 @@ public class RuleActivator implements ServerComponent {
* Deactivate a rule on a Quality profile WITHOUT committing db session and WITHOUT checking permissions
*/
List<ActiveRuleChange> deactivate(DbSession dbSession, ActiveRuleKey key) {
- return cascadeDeactivation(key, dbSession, false);
+ return deactivate(dbSession, key, false);
}
- private List<ActiveRuleChange> cascadeDeactivation(ActiveRuleKey key, DbSession dbSession, boolean isCascade) {
+ public List<ActiveRuleChange> deactivate(RuleDto ruleDto) {
+ DbSession dbSession = db.openSession(false);
+ try {
+ return deactivate(dbSession, ruleDto);
+ } finally {
+ dbSession.close();
+ }
+ }
+
+ private List<ActiveRuleChange> deactivate(DbSession dbSession, RuleDto ruleDto) {
+ List<ActiveRuleChange> changes = Lists.newArrayList();
+ List<ActiveRuleDto> activeRules = db.activeRuleDao().findByRule(dbSession, ruleDto);
+ for (ActiveRuleDto activeRule : activeRules) {
+ changes.addAll(deactivate(dbSession, activeRule.getKey(), true));
+ }
+ dbSession.commit();
+ return changes;
+ }
+
+ /**
+ * @param force if true then inherited rules are deactivated
+ */
+ private List<ActiveRuleChange> deactivate(DbSession dbSession, ActiveRuleKey key, boolean force) {
+ return cascadeDeactivation(key, dbSession, false, force);
+ }
+
+ private List<ActiveRuleChange> cascadeDeactivation(ActiveRuleKey key, DbSession dbSession, boolean isCascade, boolean force) {
List<ActiveRuleChange> changes = Lists.newArrayList();
- RuleActivationContext context = contextFactory.create(key, dbSession);
+ RuleActivatorContext context = contextFactory.create(key, dbSession);
ActiveRuleChange change;
if (context.activeRule() == null) {
return changes;
}
- if (!isCascade && (context.activeRule().isInherited() ||
- context.activeRule().doesOverride())) {
+ if (!force && !isCascade && context.activeRule().getInheritance() != null) {
throw new IllegalStateException("Cannot deactivate inherited rule '" + key.ruleKey() + "'");
}
change = new ActiveRuleChange(ActiveRuleChange.Type.DEACTIVATED, key);
changes.add(change);
persist(change, context, dbSession);
-
// get all inherited profiles
- List<QualityProfileDto> profiles =
- db.qualityProfileDao().findByParentKey(dbSession, key.qProfile());
+ List<QualityProfileDto> profiles = db.qualityProfileDao().findByParentKey(dbSession, key.qProfile());
for (QualityProfileDto profile : profiles) {
ActiveRuleKey activeRuleKey = ActiveRuleKey.of(profile.getKey(), key.ruleKey());
- changes.addAll(cascadeDeactivation(activeRuleKey, dbSession, true));
+ changes.addAll(cascadeDeactivation(activeRuleKey, dbSession, true, force));
}
if (!changes.isEmpty()) {
@@ -370,8 +395,8 @@ public class RuleActivator implements ServerComponent {
RuleActivation activation = new RuleActivation(ActiveRuleKey.of(key, parentActiveRule.getKey().ruleKey()));
activate(dbSession, activation);
}
- dbSession.commit();
}
+ dbSession.commit();
} finally {
dbSession.close();
@@ -386,7 +411,12 @@ public class RuleActivator implements ServerComponent {
profileDto.setParent(null);
db.qualityProfileDao().update(dbSession, profileDto);
for (ActiveRuleDto activeRule : db.activeRuleDao().findByProfileKey(dbSession, profileDto.getKey())) {
- deactivate(dbSession, activeRule.getKey());
+ if (ActiveRuleDto.INHERITED.equals(activeRule.getInheritance())) {
+ deactivate(dbSession, activeRule.getKey(), true);
+ } else if (ActiveRuleDto.OVERRIDES.equals(activeRule.getInheritance())) {
+ activeRule.setInheritance(null);
+ db.activeRuleDao().update(dbSession, activeRule);
+ }
}
}
}
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivationContext.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivatorContext.java
index 25ba2e92a45..f4f279fb1b4 100644
--- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivationContext.java
+++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivatorContext.java
@@ -21,18 +21,22 @@ package org.sonar.server.qualityprofile;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;
+import org.sonar.api.rule.RuleStatus;
+import org.sonar.check.Cardinality;
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.RuleDto;
import org.sonar.core.rule.RuleParamDto;
+import org.sonar.server.exceptions.BadRequestException;
+import org.sonar.server.rule.Rule;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Map;
-class RuleActivationContext {
+class RuleActivatorContext {
private RuleDto rule;
private final Map<String, RuleParamDto> ruleParams = Maps.newHashMap();
@@ -44,7 +48,7 @@ class RuleActivationContext {
return rule;
}
- RuleActivationContext setRule(RuleDto rule) {
+ RuleActivatorContext setRule(RuleDto rule) {
this.rule = rule;
return this;
}
@@ -57,7 +61,7 @@ class RuleActivationContext {
return ruleParams.values();
}
- RuleActivationContext setRuleParams(Collection<RuleParamDto> ruleParams) {
+ RuleActivatorContext setRuleParams(Collection<RuleParamDto> ruleParams) {
this.ruleParams.clear();
for (RuleParamDto ruleParam : ruleParams) {
this.ruleParams.put(ruleParam.getName(), ruleParam);
@@ -69,7 +73,7 @@ class RuleActivationContext {
return profile;
}
- RuleActivationContext setProfile(QualityProfileDto profile) {
+ RuleActivatorContext setProfile(QualityProfileDto profile) {
this.profile = profile;
return this;
}
@@ -79,7 +83,7 @@ class RuleActivationContext {
return parentProfile;
}
- RuleActivationContext setParentProfile(@Nullable QualityProfileDto p) {
+ RuleActivatorContext setParentProfile(@Nullable QualityProfileDto p) {
this.parentProfile = p;
return this;
}
@@ -89,12 +93,12 @@ class RuleActivationContext {
return activeRule;
}
- RuleActivationContext setActiveRule(@Nullable ActiveRuleDto a) {
+ RuleActivatorContext setActiveRule(@Nullable ActiveRuleDto a) {
this.activeRule = a;
return this;
}
- RuleActivationContext setParentActiveRule(@Nullable ActiveRuleDto a) {
+ RuleActivatorContext setParentActiveRule(@Nullable ActiveRuleDto a) {
this.parentActiveRule = a;
return this;
}
@@ -117,7 +121,7 @@ class RuleActivationContext {
return activeRuleParams.values();
}
- RuleActivationContext setActiveRuleParams(@Nullable Collection<ActiveRuleParamDto> a) {
+ RuleActivatorContext setActiveRuleParams(@Nullable Collection<ActiveRuleParamDto> a) {
activeRuleParams.clear();
if (a != null) {
for (ActiveRuleParamDto ar : a) {
@@ -127,7 +131,7 @@ class RuleActivationContext {
return this;
}
- RuleActivationContext setParentActiveRuleParams(@Nullable Collection<ActiveRuleParamDto> a) {
+ RuleActivatorContext setParentActiveRuleParams(@Nullable Collection<ActiveRuleParamDto> a) {
parentActiveRuleParams.clear();
if (a != null) {
for (ActiveRuleParamDto ar : a) {
@@ -169,4 +173,20 @@ class RuleActivationContext {
}
return false;
}
+
+ void verifyForActivation() {
+ if (RuleStatus.REMOVED == rule.getStatus()) {
+ throw new BadRequestException("Rule was removed: " + rule.getKey());
+ }
+ if (Cardinality.MULTIPLE.equals(rule.getCardinality())) {
+ throw new BadRequestException("Rule template can't be activated on a Quality profile: " + rule.getKey());
+ }
+ if (Rule.MANUAL_REPOSITORY_KEY.equals(rule.getRepositoryKey())) {
+ throw new BadRequestException("Manual rule can't be activated on a Quality profile: " + rule.getKey());
+ }
+ if (!profile.getLanguage().equals(rule.getLanguage())) {
+ throw new BadRequestException(String.format("Rule %s and profile %s have different languages", rule.getKey(), profile.getKey()));
+ }
+
+ }
}
diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivationContextFactory.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivatorContextFactory.java
index 02a32f3e891..57e35e1327c 100644
--- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivationContextFactory.java
+++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivatorContextFactory.java
@@ -21,8 +21,6 @@ package org.sonar.server.qualityprofile;
import org.sonar.api.ServerComponent;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rule.RuleStatus;
-import org.sonar.check.Cardinality;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.qualityprofile.db.ActiveRuleDto;
import org.sonar.core.qualityprofile.db.ActiveRuleKey;
@@ -32,28 +30,24 @@ import org.sonar.core.qualityprofile.db.QualityProfileKey;
import org.sonar.core.rule.RuleDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.rule.Rule;
import java.util.Collection;
-public class RuleActivationContextFactory implements ServerComponent {
+public class RuleActivatorContextFactory implements ServerComponent {
private final DbClient db;
- public RuleActivationContextFactory(DbClient db) {
+ public RuleActivatorContextFactory(DbClient db) {
this.db = db;
}
- public RuleActivationContext create(ActiveRuleKey key, DbSession session) {
- RuleActivationContext context = new RuleActivationContext();
+ public RuleActivatorContext create(ActiveRuleKey key, DbSession session) {
+ RuleActivatorContext context = new RuleActivatorContext();
RuleDto rule = initRule(key.ruleKey(), context, session);
QualityProfileDto profile = initProfile(key, context, session, false);
initActiveRules(key, context, session, false);
- if (!profile.getLanguage().equals(rule.getLanguage())) {
- throw new BadRequestException(String.format("Rule %s and profile %s have different languages", rule.getKey(), profile.getKey()));
- }
if (profile.getParent() != null) {
ActiveRuleKey parentKey = ActiveRuleKey.of(
@@ -64,26 +58,17 @@ public class RuleActivationContextFactory implements ServerComponent {
return context;
}
- private RuleDto initRule(RuleKey ruleKey, RuleActivationContext context, DbSession dbSession) {
+ private RuleDto initRule(RuleKey ruleKey, RuleActivatorContext context, DbSession dbSession) {
RuleDto rule = db.ruleDao().getNullableByKey(dbSession, ruleKey);
if (rule == null) {
throw new BadRequestException("Rule not found: " + ruleKey);
}
- if (RuleStatus.REMOVED == rule.getStatus()) {
- throw new BadRequestException("Rule was removed: " + ruleKey);
- }
- if (Cardinality.MULTIPLE.equals(rule.getCardinality())) {
- throw new BadRequestException("Rule template can't be activated on a Quality profile: " + ruleKey);
- }
- if (Rule.MANUAL_REPOSITORY_KEY.equals(rule.getRepositoryKey())) {
- throw new BadRequestException("Manual rule can't be activated on a Quality profile: " + ruleKey);
- }
context.setRule(rule);
context.setRuleParams(db.ruleDao().findRuleParamsByRuleKey(dbSession, rule.getKey()));
return rule;
}
- private QualityProfileDto initProfile(ActiveRuleKey key, RuleActivationContext context, DbSession session, boolean parent) {
+ private QualityProfileDto initProfile(ActiveRuleKey key, RuleActivatorContext context, DbSession session, boolean parent) {
QualityProfileDto profile = db.qualityProfileDao().getByKey(session, key.qProfile());
if (profile == null) {
throw new BadRequestException("Quality profile not found: " + key.qProfile());
@@ -96,7 +81,7 @@ public class RuleActivationContextFactory implements ServerComponent {
return profile;
}
- private void initActiveRules(ActiveRuleKey key, RuleActivationContext context, DbSession session, boolean parent) {
+ private void initActiveRules(ActiveRuleKey key, RuleActivatorContext context, DbSession session, boolean parent) {
ActiveRuleDto activeRule = db.activeRuleDao().getNullableByKey(session, key);
Collection<ActiveRuleParamDto> activeRuleParams = null;
if (activeRule != null) {
diff --git a/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java b/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
index 1cf13c34b69..d0d69ea2349 100644
--- a/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
+++ b/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
@@ -41,16 +41,19 @@ import org.sonar.core.rule.RuleParamDto;
import org.sonar.core.technicaldebt.db.CharacteristicDao;
import org.sonar.core.technicaldebt.db.CharacteristicDto;
import org.sonar.server.db.DbClient;
-import org.sonar.server.qualityprofile.ActiveRule;
-import org.sonar.server.qualityprofile.QProfileService;
+import org.sonar.server.qualityprofile.RuleActivator;
import org.sonar.server.search.IndexDefinition;
import org.sonar.server.search.action.EmbeddedIndexAction;
import org.sonar.server.search.action.IndexAction;
import org.sonar.server.search.action.KeyIndexAction;
import javax.annotation.Nullable;
-
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import static com.google.common.collect.Lists.newArrayList;
@@ -62,22 +65,22 @@ public class RegisterRules implements Startable {
private static final Logger LOG = LoggerFactory.getLogger(RegisterRules.class);
private final RuleDefinitionsLoader defLoader;
- private final QProfileService profileService;
+ private final RuleActivator ruleActivator;
private final DbClient dbClient;
private final CharacteristicDao characteristicDao;
- public RegisterRules(RuleDefinitionsLoader defLoader, QProfileService profileService,
+ public RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator,
DbClient dbClient) {
- this(defLoader, profileService, dbClient, System2.INSTANCE);
+ this(defLoader, ruleActivator, dbClient, System2.INSTANCE);
}
@VisibleForTesting
- RegisterRules(RuleDefinitionsLoader defLoader, QProfileService profileService,
+ RegisterRules(RuleDefinitionsLoader defLoader, RuleActivator ruleActivator,
DbClient dbClient, System2 system) {
this.defLoader = defLoader;
- this.profileService = profileService;
+ this.ruleActivator = ruleActivator;
this.dbClient = dbClient;
this.characteristicDao = dbClient.debtCharacteristicDao();
}
@@ -392,10 +395,7 @@ public class RegisterRules implements Startable {
for (RuleDto rule : removedRules) {
// SONAR-4642 Remove active rules only when repository still exists
if (repositoryKeys.contains(rule.getRepositoryKey())) {
- List<ActiveRule> activeRules = profileService.findActiveRulesByRule(rule.getKey());
- for (ActiveRule activeRule : activeRules) {
- profileService.deactivate(activeRule.key());
- }
+ ruleActivator.deactivate(rule);
}
}
}