<dataset>
- <rules_profiles id="1" parent_id="[null]" provided="true" name="profile" default_profile="1" language="java"/>
+ <rules_profiles id="1" parent_name="[null]" provided="true" name="profile" default_profile="1" language="java"/>
<rules_categories id="1" name="category one" description="[null]"/>
@Column(name = "language", updatable = true, nullable = false)
private String language;
+ @Column(name = "parent_name", updatable = true, nullable = true)
+ private String parentName;
+
@OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
private List<ActiveRule> activeRules = new ArrayList<ActiveRule>();
@OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY)
private List<ResourceModel> projects = new ArrayList<ResourceModel>();
- // @ManyToOne(fetch = FetchType.LAZY)
- // @JoinColumn(name = "parent_id", updatable = true, nullable = true)
- // private RulesProfile parentProfile;
-
- @Column(name = "parent_id", updatable = true, nullable = true)
- private Integer parentId;
-
/**
* @deprecated use the factory method create()
*/
*
* @since 2.5
*/
- public Integer getParentId() {
- return parentId;
+ public String getParentName() {
+ return parentName;
}
/**
*
* @since 2.5
*/
- public void setParentId(Integer parentId) {
- this.parentId = parentId;
+ public void setParentName(String parentName) {
+ this.parentName = parentName;
}
/**
RulesProfile clone = RulesProfile.create(getName(), getLanguage());
clone.setDefaultProfile(getDefaultProfile());
clone.setProvided(getProvided());
- clone.setParentId(getParentId());
+ clone.setParentName(getParentName());
if (CollectionUtils.isNotEmpty(getActiveRules())) {
clone.setActiveRules(new ArrayList<ActiveRule>(CollectionUtils.collect(getActiveRules(), new Transformer() {
public Object transform(Object input) {
// Managing inheritance of profiles
// Only one level of inheritance supported
- public void changeParentProfile(Integer profileId, Integer parentId) {
+ public void changeParentProfile(Integer profileId, String parentName) {
RulesProfile profile = getSession().getEntity(RulesProfile.class, profileId);
- if (profile != null && !profile.getProvided() && profileId != parentId) {
- RulesProfile oldParent = getProfile(profile.getParentId());
- RulesProfile newParent = getProfile(parentId);
+ // TODO check cycles
+ if (profile != null && !profile.getProvided()) {
+ RulesProfile oldParent = getParentProfile(profile);
+ RulesProfile newParent = getProfile(profile.getLanguage(), parentName);
// Deactivate all inherited rules
if (oldParent != null) {
for (ActiveRule activeRule : oldParent.getActiveRules()) {
for (ActiveRule activeRule : newParent.getActiveRules()) {
activateOrChange(profile, activeRule);
}
+ } else {
}
- profile.setParentId(parentId);
+ profile.setParentName(newParent == null ? null : newParent.getName());
getSession().saveWithoutFlush(profile);
getSession().commit();
}
RulesProfile profile = getSession().getEntity(RulesProfile.class, profileId);
ActiveRule activeRule = getSession().getEntity(ActiveRule.class, activeRuleId);
if (activeRule != null && activeRule.isInherited() && activeRule.isOverrides()) {
- ActiveRule parentActiveRule = getProfile(profile.getParentId()).getActiveRule(activeRule.getRule());
+ ActiveRule parentActiveRule = getParentProfile(profile).getActiveRule(activeRule.getRule());
removeActiveRule(profile, activeRule);
activeRule = (ActiveRule) parentActiveRule.clone();
activeRule.setRulesProfile(profile);
}
private List<RulesProfile> getChildren(int parentId) {
- return getSession().getResults(RulesProfile.class, "parentId", parentId, "provided", false);
+ RulesProfile parent = getProfile(parentId);
+ return getSession().getResults(RulesProfile.class,
+ "language", parent.getLanguage(),
+ "parentName", parent.getName(),
+ "provided", false);
}
private void removeActiveRule(RulesProfile profile, ActiveRule activeRule) {
return id == null ? null : getSession().getEntity(RulesProfile.class, id);
}
+ private RulesProfile getProfile(String language, String name) {
+ return getSession().getSingleResult(RulesProfile.class,
+ "language", language,
+ "name", name);
+ }
+
+ private RulesProfile getParentProfile(RulesProfile profile) {
+ if (profile.getParentName() == null) {
+ return null;
+ }
+ return getProfile(profile.getLanguage(), profile.getParentName());
+ }
+
}
getProfilesManager().deleteProfile((int) profileId);
}
- public void changeParentProfile(int profileId, Integer parentId) {
- getProfilesManager().changeParentProfile(profileId, parentId);
+ public void changeParentProfile(int profileId, String parentName) {
+ getProfilesManager().changeParentProfile(profileId, parentName);
}
public void ruleActivatedOrChanged(int parentProfileId, int activeRuleId) {
@select_priority = ANY_SELECTION + RULE_PRIORITIES\r
@select_status = [['Any',''], ["Active", STATUS_ACTIVE], ["Inactive", STATUS_INACTIVE]]\r
- @child_profiles = RulesProfile.find(:all, :conditions => {:parent_id => @profile.id})
- @select_parent = [['', nil]] + RulesProfile.find(:all, :conditions => {:language => @profile.language, :parent_id => nil}).collect { |profile| [profile.name, profile.id] }.sort
+ @child_profiles = RulesProfile.find(:all, :conditions => {:language => @profile.language, :parent_name => @profile.name})
+ @select_parent = [['', nil]] + RulesProfile.find(:all).collect { |profile| [profile.name, profile.name] }.sort
@rules = Rule.search(java_facade, {\r
:profile => @profile, :status => @status, :priorities => @priorities,\r
#
#
- # POST /rules_configuration/change_parent?id=<profile id>&parent_id=<parent profile id>
+ # POST /rules_configuration/change_parent?id=<profile id>&parent_name=<parent profile name>
#
#
def change_parent
id = params[:id].to_i
- parent_id = params[:parent_id]
- if parent_id.blank?
+ parent_name = params[:parent_name]
+ if parent_name.blank?
java_facade.changeParentProfile(id, nil)
else
- java_facade.changeParentProfile(id, parent_id.to_i)
+ java_facade.changeParentProfile(id, parent_name)
end
redirect_to :action => 'index', :id => params[:id]
end
class Profile < ActiveRecord::Base
set_table_name 'rules_profiles'
- belongs_to :parent_profile, :class_name => 'Profile', :foreign_key => 'parent_id'
-
has_many :alerts, :dependent => :delete_all
has_many :active_rules, :class_name => 'ActiveRule', :foreign_key => 'profile_id', :dependent => :destroy, :include => ['rule']
has_many :projects, :order => 'name asc'
# DEPRECATED - use profile.rb instead
class RulesProfile < ActiveRecord::Base
- belongs_to :parent_profile, :class_name => 'Profile', :foreign_key => 'parent_id'
-
has_many :active_rules, :class_name => 'ActiveRule', :foreign_key => 'profile_id',
:dependent => :destroy, :include => ['rule']
<div>
<% if @child_profiles.size == 0 %>
<% if !@profile.provided? %>
- <% parent_id = @profile.parent_profile.id if @profile.parent_profile %>
<% form_tag({:action => 'change_parent'}, {:method => 'post'}) do %>
<%= hidden_field_tag "id", @id %>
- Parent profile: <%= select_tag "parent_id", options_for_select(@select_parent, parent_id), :disabled => !enable_modification %>
+ Parent profile: <%= select_tag "parent_name", options_for_select(@select_parent, @profile.parent_name), :disabled => !enable_modification %>
<%= submit_tag "Change", :id => 'submit_parent', :disabled => !enable_modification %>
<% end %>
<% end %>
ActiveRule.reset_column_information
ActiveRule.update_all(ActiveRule.sanitize_sql_for_assignment({:inherited => false, :overrides => false}))
- add_column 'rules_profiles', 'parent_id', :integer, :null => true
+ add_column 'rules_profiles', 'parent_name', :string, :limit => 40, :null => true
Profile.reset_column_information
end
}
Collection<RulesProfile> profiles = sonarConfig.getProfiles();
- assertEquals(2, profiles.size());
+ assertEquals(3, profiles.size());
- RulesProfile testProfile = profiles.iterator().next();
+ Iterator<RulesProfile> profilesIter = profiles.iterator();
+ RulesProfile testProfile = profilesIter.next();
assertEquals("test name", testProfile.getName());
assertEquals(true, testProfile.getDefaultProfile());
assertEquals("test language", testProfile.getLanguage());
assertNotNull(testAlert.getMetric());
assertEquals("test key", testAlert.getMetric().getKey());
+ testProfile = profilesIter.next();
+ assertEquals("test2 parent", testProfile.getParentName());
+
Collection<Rule> rules = sonarConfig.getRules();
assertThat(rules.size(), is(1));
Rule rule = rules.iterator().next();
profile1.setProvided(true);
profiles.add(profile1);
+ RulesProfile parentProfile = RulesProfile.create("test2 parent", "test2 language");
+ profiles.add(parentProfile);
+
RulesProfile profile2 = RulesProfile.create("test2 name", "test2 language");
+ profile2.setParentName(parentProfile.getName());
profiles.add(profile2);
Rule rule = Rule.create("test plugin", "test key", null);
@Test
public void shouldSetParent() {
setupData("shouldSetParent");
- profilesManager.changeParentProfile(2, 1);
+ profilesManager.changeParentProfile(2, "parent");
checkTables("shouldSetParent", "active_rules", "rules_profiles");
}
@Test
public void shouldChangeParent() {
setupData("shouldChangeParent");
- profilesManager.changeParentProfile(3, 2);
+ profilesManager.changeParentProfile(3, "new_parent");
checkTables("shouldChangeParent", "active_rules", "rules_profiles");
}
import org.junit.Before;
import org.junit.Test;
-import org.sonar.jpa.test.AbstractDbUnitTestCase;
import org.sonar.api.measures.Metric;
import org.sonar.api.profiles.Alert;
import org.sonar.api.profiles.RulesProfile;
import org.sonar.api.rules.*;
+import org.sonar.jpa.test.AbstractDbUnitTestCase;
import java.util.Arrays;
<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/>
<alerts/>
</profile>
</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/>
<alerts/>
</profile>
<rules_parameters id="1" rule_id="1" name="param1" description="[null]" param_type="r"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="1"/>
+ <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_rule_parameters id="1" active_rule_id="1" rules_parameter_id="1" value="30"/>
<rules_parameters id="1" rule_id="1" name="param1" description="[null]" param_type="r"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="1"/>
+ <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_rule_parameters id="1" active_rule_id="1" rules_parameter_id="1" value="30"/>
<rules id="2" name="bar" description="test" plugin_config_key="checker/bar"
plugin_rule_key="checkstyle.rule2" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="new_child" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="2" provided="false" name="new_parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="3" provided="false" name="old_child" default_profile="0" language="java" parent_id="2"/>
+ <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]"/>
<rules id="2" name="bar" description="test" plugin_config_key="checker/bar"
plugin_rule_key="checkstyle.rule2" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="new_child" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="2" provided="false" name="new_parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="3" provided="false" name="old_child" default_profile="0" language="java" parent_id="1"/>
+ <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]"/>
<rules id="1" name="foo" description="test" plugin_config_key="checker/foo"
plugin_rule_key="checkstyle.rule1" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="1"/>
+ <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]"/>
<rules id="1" name="foo" description="test" plugin_config_key="checker/foo"
plugin_rule_key="checkstyle.rule1" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="1"/>
+ <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]"/>
<rules id="1" name="foo" description="test" plugin_config_key="checker/foo"
plugin_rule_key="checkstyle.rule1" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="[null]"/>
+ <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]"/>
<rules id="1" name="foo" description="test" plugin_config_key="checker/foo"
plugin_rule_key="checkstyle.rule1" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="1"/>
+ <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]"/>
<rules id="1" name="foo" description="test" plugin_config_key="checker/foo"
plugin_rule_key="checkstyle.rule1" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="1"/>
+ <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]"/>
<rules id="1" name="foo" description="test" plugin_config_key="checker/foo"
plugin_rule_key="checkstyle.rule1" plugin_name="plugin" enabled="true" cardinality="SINGLE" parent_id="[null]"/>
- <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_id="[null]"/>
+ <rules_profiles id="1" provided="false" name="parent" default_profile="0" language="java" parent_name="[null]"/>
- <rules_profiles id="2" provided="false" name="child" default_profile="0" language="java" parent_id="[null]"/>
+ <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]"/>