diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2014-06-06 20:09:16 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@sonarsource.com> | 2014-06-06 20:09:16 +0200 |
commit | 37351e9f46baa1bfe2dd701db4d7764b942d60dc (patch) | |
tree | 74f73ff09fb708af755fb5877eaa30183f663e4f /sonar-server/src/main | |
parent | 5df41898c6e29d3db47915777d7fb579f158cab2 (diff) | |
download | sonarqube-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.java | 148 | ||||
-rw-r--r-- | sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java | 1 | ||||
-rw-r--r-- | sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java | 60 | ||||
-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.java | 26 |
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); } } } |