SONAR-2052: Support inheritance of quality profiles in backup of global configuration
@Column(name = "inherited", updatable = true, nullable = true)
private Boolean inherited;
- @Column(name = "overrides", updatable = true, nullable = true)
- private Boolean overrides;
+ @Column(name = "overridden", updatable = true, nullable = true)
+ private Boolean overridden;
/**
* @deprecated visibility should be reduced to protected or package
*
* @since 2.5
*/
- public Boolean isOverrides() {
- return overrides == null ? false : overrides;
+ public boolean isOverridden() {
+ return overridden == null ? false : overridden;
}
/**
*
* @since 2.5
*/
- public void setOverrides(Boolean overrides) {
- this.overrides = overrides;
+ public void setOverridden(Boolean overridden) {
+ this.overridden = overridden;
}
/**
public Object clone() {
final ActiveRule clone = new ActiveRule(getRulesProfile(), getRule(), getSeverity());
clone.setInherited(isInherited());
+ clone.setOverridden(isOverridden());
if (CollectionUtils.isNotEmpty(getActiveRuleParams())) {
clone.setActiveRuleParams(new ArrayList<ActiveRuleParam>(CollectionUtils.collect(getActiveRuleParams(), new Transformer() {
public Object transform(Object input) {
writeNode(writer, "key", rule.getRule().getKey());
writeNode(writer, "plugin", rule.getRule().getRepositoryKey());
writeNode(writer, "level", rule.getSeverity().name());
+ writeNode(writer, "inherited", Boolean.toString(rule.isInherited()));
+ writeNode(writer, "overridden", Boolean.toString(rule.isOverridden()));
if (!rule.getActiveRuleParams().isEmpty()) {
writer.startNode("params");
ActiveRule activeRule = new ActiveRule(null, new Rule(valuesRule.get("plugin"), valuesRule.get("key")), RulePriority
.valueOf(valuesRule.get("level")));
activeRule.setActiveRuleParams(params);
+ activeRule.setInherited(Boolean.parseBoolean(valuesRule.get("inherited")));
+ activeRule.setOverridden(Boolean.parseBoolean(valuesRule.get("overridden")));
return activeRule;
}
public void activatedOrChanged(int parentProfileId, int activeRuleId) {
List<RulesProfile> children = getChildren(parentProfileId);
ActiveRule parentActiveRule = getSession().getEntity(ActiveRule.class, activeRuleId);
- if (parentActiveRule.isInherited() && !parentActiveRule.isOverrides()) {
- parentActiveRule.setOverrides(true);
+ if (parentActiveRule.isInherited() && !parentActiveRule.isOverridden()) {
+ parentActiveRule.setOverridden(true);
getSession().saveWithoutFlush(parentActiveRule);
}
for (RulesProfile child : children) {
public void revert(int profileId, int activeRuleId) {
RulesProfile profile = getSession().getEntity(RulesProfile.class, profileId);
ActiveRule activeRule = getSession().getEntity(ActiveRule.class, activeRuleId);
- if (activeRule != null && activeRule.isInherited() && activeRule.isOverrides()) {
+ if (activeRule != null && activeRule.isInherited() && activeRule.isOverridden()) {
ActiveRule parentActiveRule = getParentProfile(profile).getActiveRule(activeRule.getRule());
removeActiveRule(profile, activeRule);
activeRule = (ActiveRule) parentActiveRule.clone();
private void activateOrChange(RulesProfile profile, ActiveRule parentActiveRule) {
ActiveRule activeRule = profile.getActiveRule(parentActiveRule.getRule());
if (activeRule != null) {
- if (activeRule.isInherited() && !activeRule.isOverrides()) {
+ if (activeRule.isInherited() && !activeRule.isOverridden()) {
removeActiveRule(profile, activeRule);
} else {
activeRule.setInherited(true);
- activeRule.setOverrides(true);
+ activeRule.setOverridden(true);
getSession().saveWithoutFlush(activeRule);
return;
}
private void deactivate(RulesProfile profile, Rule rule) {
ActiveRule activeRule = profile.getActiveRule(rule);
if (activeRule != null) {
- if (activeRule.isInherited() && !activeRule.isOverrides()) {
+ if (activeRule.isInherited() && !activeRule.isOverridden()) {
removeActiveRule(profile, activeRule);
} else {
activeRule.setInherited(false);
- activeRule.setOverrides(false);
+ activeRule.setOverridden(false);
getSession().saveWithoutFlush(activeRule);
}
}
<td nowrap valign="top" class="left" x="<%= active_rule.failure_level if active_rule -%>" width="1%">
<% inherited = active_rule.inherited if active_rule
- overrides = active_rule.overrides if active_rule
+ overridden = active_rule.overridden if active_rule
%>
<form id="levels_<%= rule.id -%>" action="">
<% enable_modification = is_admin && !profile.provided?
</td>
<td valign="top" class="left">
<% if inherited %>
- <% if overrides %>
+ <% if overridden %>
Overrides rule from parent profile.<br/>
<%= button_to "Revert", :action => 'revert_rule', :id => profile.id, :active_rule_id => active_rule.id %><br/>
<% else %>
def self.up
add_column 'active_rules', 'inherited', :boolean, :null => true
- add_column 'active_rules', 'overrides', :boolean, :null => true
+ add_column 'active_rules', 'overridden', :boolean, :null => true
ActiveRule.reset_column_information
- ActiveRule.update_all(ActiveRule.sanitize_sql_for_assignment({:inherited => false, :overrides => false}))
+ ActiveRule.update_all(ActiveRule.sanitize_sql_for_assignment({:inherited => false, :overridden => false}))
add_column 'rules_profiles', 'parent_name', :string, :limit => 40, :null => true
Profile.reset_column_information
}
Collection<RulesProfile> profiles = sonarConfig.getProfiles();
- assertEquals(3, profiles.size());
+ assertEquals(2, profiles.size());
Iterator<RulesProfile> profilesIter = profiles.iterator();
RulesProfile testProfile = profilesIter.next();
assertNotNull(testActiveRule.getRule());
assertEquals("test key", testActiveRule.getRule().getKey());
assertEquals("test plugin", testActiveRule.getRule().getRepositoryKey());
+ assertThat(testActiveRule.isInherited(), is(false));
+ assertThat(testActiveRule.isOverridden(), is(false));
assertEquals(1, testActiveRule.getActiveRuleParams().size());
ActiveRuleParam testActiveRuleParam = testActiveRule.getActiveRuleParams().get(0);
assertNotNull(testAlert.getMetric());
assertEquals("test key", testAlert.getMetric().getKey());
+ // Child profile
testProfile = profilesIter.next();
- assertEquals("test2 parent", testProfile.getParentName());
+ assertEquals("test2 name", testProfile.getName());
+ assertEquals("test name", testProfile.getParentName());
+ testActiveRule = testProfile.getActiveRules().get(0);
+ assertThat(testActiveRule.isInherited(), is(true));
+ assertThat(testActiveRule.isOverridden(), is(true));
Collection<Rule> rules = sonarConfig.getRules();
assertThat(rules.size(), is(1));
private List<RulesProfile> getProfiles() {
List<RulesProfile> profiles = new ArrayList<RulesProfile>();
+ Rule rule = Rule.create("test plugin", "test key", null);
+ rule.createParameter("test param key");
+
RulesProfile profile1 = RulesProfile.create("test name", "test language");
profile1.setDefaultProfile(true);
profile1.setProvided(true);
profiles.add(profile1);
- RulesProfile parentProfile = RulesProfile.create("test2 parent", "test2 language");
- profiles.add(parentProfile);
+ ActiveRule activeRule = profile1.activateRule(rule, RulePriority.MAJOR);
+ activeRule.setParameter("test param key", "test value");
- RulesProfile profile2 = RulesProfile.create("test2 name", "test2 language");
- profile2.setParentName(parentProfile.getName());
+ RulesProfile profile2 = RulesProfile.create("test2 name", "test language");
+ profile2.setParentName(profile1.getName());
profiles.add(profile2);
- Rule rule = Rule.create("test plugin", "test key", null);
- rule.createParameter("test param key");
-
- ActiveRule activeRule = profile1.activateRule(rule, RulePriority.MAJOR);
- activeRule.setParameter("test param key", "test value");
+ ActiveRule activeRule2 = profile2.activateRule(rule, RulePriority.MINOR);
+ activeRule2.setParameter("test param key", "test value");
+ activeRule2.setInherited(true);
+ activeRule2.setOverridden(true);
profiles.get(0).getAlerts().add(new Alert(null, new Metric("test key"), Alert.OPERATOR_GREATER, "testError", "testWarn"));
<name><![CDATA[test2 name]]></name>
<default-profile><![CDATA[false]]></default-profile>
<provided><![CDATA[false]]></provided>
- <language><![CDATA[test2 language]]></language>
- <parentName><![CDATA[test2 parent]]></parentName>
- <active-rules/>
- <alerts/>
- </profile>
- <profile>
- <name><![CDATA[test2 parent]]></name>
- <default-profile><![CDATA[false]]></default-profile>
- <provided><![CDATA[false]]></provided>
- <language><![CDATA[test2 language]]></language>
- <active-rules/>
+ <language><![CDATA[test language]]></language>
+ <parentName><![CDATA[test name]]></parentName>
+ <active-rules>
+ <active-rule>
+ <key><![CDATA[test key]]></key>
+ <plugin><![CDATA[test plugin]]></plugin>
+ <level><![CDATA[ERROR]]></level>
+ <inherited><![CDATA[true]]></inherited>
+ <overridden><![CDATA[true]]></overridden>
+ <params>
+ <param>
+ <key><![CDATA[test param key]]></key>
+ <value><![CDATA[test value]]></value>
+ </param>
+ </params>
+ </active-rule>
+ </active-rules>
<alerts/>
</profile>
</profiles>
<key><![CDATA[test key]]></key>
<plugin><![CDATA[test plugin]]></plugin>
<level><![CDATA[MAJOR]]></level>
+ <inherited><![CDATA[false]]></inherited>
+ <overridden><![CDATA[false]]></overridden>
<params>
<param>
<key><![CDATA[test param key]]></key>
</alert>
</alerts>
</profile>
- <profile>
- <name><![CDATA[test2 parent]]></name>
- <default-profile><![CDATA[false]]></default-profile>
- <provided><![CDATA[false]]></provided>
- <language><![CDATA[test2 language]]></language>
- <active-rules/>
- <alerts/>
- </profile>
<profile>
<name><![CDATA[test2 name]]></name>
<default-profile><![CDATA[false]]></default-profile>
<provided><![CDATA[false]]></provided>
- <language><![CDATA[test2 language]]></language>
- <parentName><![CDATA[test2 parent]]></parentName>
- <active-rules/>
+ <language><![CDATA[test language]]></language>
+ <parentName><![CDATA[test name]]></parentName>
+ <active-rules>
+ <active-rule>
+ <key><![CDATA[test key]]></key>
+ <plugin><![CDATA[test plugin]]></plugin>
+ <level><![CDATA[MINOR]]></level>
+ <inherited><![CDATA[true]]></inherited>
+ <overridden><![CDATA[true]]></overridden>
+ <params>
+ <param>
+ <key><![CDATA[test param key]]></key>
+ <value><![CDATA[test value]]></value>
+ </param>
+ </params>
+ </active-rule>
+ </active-rules>
<alerts/>
</profile>
</profiles>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
<active_rule_parameters id="1" active_rule_id="1" rules_parameter_id="1" value="30"/>
- <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overrides="[null]"/>
+ <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overridden="[null]"/>
<active_rule_parameters id="2" active_rule_id="2" rules_parameter_id="1" value="30"/>
</dataset>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
<active_rule_parameters id="1" active_rule_id="1" rules_parameter_id="1" value="30"/>
</dataset>
<rules_profiles id="3" provided="false" name="child" default_profile="0" language="java" parent_name="new_parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
- <active_rules id="2" profile_id="2" rule_id="2" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="2" profile_id="2" rule_id="2" failure_level="2" inherited="false" overridden="[null]"/>
- <active_rules id="4" profile_id="3" rule_id="2" failure_level="2" inherited="true" overrides="[null]"/>
+ <active_rules id="4" profile_id="3" rule_id="2" failure_level="2" inherited="true" overridden="[null]"/>
</dataset>
<rules_profiles id="3" provided="false" name="child" default_profile="0" language="java" parent_name="parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
- <active_rules id="2" profile_id="2" rule_id="2" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="2" profile_id="2" rule_id="2" failure_level="2" inherited="false" overridden="[null]"/>
- <active_rules id="3" profile_id="3" rule_id="1" failure_level="2" inherited="true" overrides="[null]"/>
+ <active_rules id="3" profile_id="3" rule_id="1" failure_level="2" inherited="true" overridden="[null]"/>
</dataset>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
</dataset>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
- <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overrides="[null]"/>
+ <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overridden="[null]"/>
</dataset>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="[null]"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
</dataset>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
- <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overrides="[null]"/>
+ <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overridden="[null]"/>
</dataset>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="parent"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
- <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overrides="[null]"/>
+ <active_rules id="2" profile_id="2" rule_id="1" failure_level="2" inherited="true" overridden="[null]"/>
</dataset>
<rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_name="[null]"/>
- <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overrides="[null]"/>
+ <active_rules id="1" profile_id="1" rule_id="1" failure_level="2" inherited="false" overridden="[null]"/>
</dataset>