From: Simon Brandhof Date: Mon, 15 Aug 2011 17:36:19 +0000 (+0200) Subject: SONAR-2694 Provide a new optional 'category' attribute on the @Property annotation X-Git-Tag: 2.11^2~150 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=04cde730a288fc1dd0de91e3ee0cd0c96ed41919;p=sonarqube.git SONAR-2694 Provide a new optional 'category' attribute on the @Property annotation --- diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java index 60f7d250ba0..db162da7c70 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java @@ -48,21 +48,25 @@ import java.util.List; key = CoreProperties.ORGANIZATION, name = "Organization", description = "Identify your installation. Required to generate the server key and to benefit from licensed plugins. Server must be restarted for the change to take effect.", - global = true), + global = true, + category = "General" + ), @Property( key = CoreProperties.SERVER_BASE_URL, defaultValue = CoreProperties.SERVER_BASE_URL_DEFAULT_VALUE, name = "Server base URL", description = "HTTP address of the Sonar server, such as http://yourhost.yourdomain/sonar. This value is used i.e. to create links in emails and to generate server key.", project = false, - global = true), + global = true, + category = "General"), @Property( key = CoreProperties.CORE_COVERAGE_PLUGIN_PROPERTY, defaultValue = "cobertura", name = "Code coverage plugin", description = "Key of the code coverage plugin to use.", project = true, - global = true), + global = true, + category = "Coverage"), @Property( key = CoreProperties.CORE_IMPORT_SOURCES_PROPERTY, defaultValue = "" + CoreProperties.CORE_IMPORT_SOURCES_DEFAULT_VALUE, @@ -70,14 +74,16 @@ import java.util.List; description = "Set to false if sources should not be displayed, e.g. for security reasons.", project = true, module = true, - global = true), + global = true, + category = "General"), @Property( key = CoreProperties.CORE_TENDENCY_DEPTH_PROPERTY, defaultValue = "" + CoreProperties.CORE_TENDENCY_DEPTH_DEFAULT_VALUE, name = "Tendency period", description = TendencyDecorator.PROP_DAYS_DESCRIPTION, project = false, - global = true), + global = true, + category = "General"), @Property( key = CoreProperties.SKIP_TENDENCIES_PROPERTY, defaultValue = "" + CoreProperties.SKIP_TENDENCIES_DEFAULT_VALUE, @@ -85,41 +91,47 @@ import java.util.List; description = "Skip calculation of measure tendencies", project = true, module = false, - global = true), + global = true, + category = "General"), @Property( key = CoreProperties.CORE_SKIPPED_MODULES_PROPERTY, name = "Exclude modules", description = "Maven artifact ids of modules to exclude (comma-separated).", project = true, - global = false), + global = false, + category = "General"), @Property( key = CoreProperties.CORE_RULE_WEIGHTS_PROPERTY, defaultValue = CoreProperties.CORE_RULE_WEIGHTS_DEFAULT_VALUE, name = "Rules weight", description = "A weight is associated to each priority to calculate the Rules Compliance Index.", project = false, - global = true), + global = true, + category = "General"), @Property( key = CoreProperties.CORE_FORCE_AUTHENTICATION_PROPERTY, defaultValue = "" + CoreProperties.CORE_FORCE_AUTHENTICATION_DEFAULT_VALUE, name = "Force user authentication", description = "Forcing user authentication stops un-logged users to access Sonar.", project = false, - global = true), + global = true, + category = "General"), @Property( key = CoreProperties.CORE_ALLOW_USERS_TO_SIGNUP_PROPERTY, defaultValue = "" + CoreProperties.CORE_ALLOW_USERS_TO_SIGNUP_DEAULT_VALUE, name = "Allow users to sign up online", description = "Users can sign up online.", project = false, - global = true), + global = true, + category = "General"), @Property( key = CoreProperties.CORE_DEFAULT_GROUP, defaultValue = CoreProperties.CORE_DEFAULT_GROUP_DEFAULT_VALUE, name = "Default user group", description = "Any new users will automatically join this group.", project = false, - global = true + global = true, + category = "General" ), @Property( key = CoreProperties.CORE_VIOLATION_LOCALE_PROPERTY, @@ -127,7 +139,8 @@ import java.util.List; name = "Locale used for violation messages", description = "Locale to be used when generating violation messages. It's up to each rule engine to support this global internationalization property", project = true, - global = true), + global = true, + category = "General"), @Property( key = "sonar.timemachine.period1", name = "Period 1", @@ -136,7 +149,8 @@ import java.util.List; "compare to previous analysis
  • A version, for example 1.2
  • ", project = false, global = true, - defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_1 + defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_1, + category = "Time Machine" ), @Property( key = "sonar.timemachine.period2", @@ -144,7 +158,8 @@ import java.util.List; description = "See the property 'Period 1'", project = false, global = true, - defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_2 + defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_2, + category = "Time Machine" ), @Property( key = "sonar.timemachine.period3", @@ -152,7 +167,8 @@ import java.util.List; description = "See the property 'Period 1'", project = false, global = true, - defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_3 + defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_3, + category = "Time Machine" ), @Property( key = "sonar.timemachine.period4", @@ -162,7 +178,8 @@ import java.util.List; "for example 2010-12-25
  • 'previous_analysis' to compare to previous analysis
  • A version, for example 1.2
  • ", project = true, global = false, - defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_4 + defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_4, + category = "Time Machine" ), @Property( key = "sonar.timemachine.period5", @@ -170,7 +187,8 @@ import java.util.List; description = "See the property 'Period 4'", project = true, global = false, - defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_5 + defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_5, + category = "Time Machine" ) }) public class CorePlugin extends SonarPlugin { diff --git a/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties b/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties index 6695634552d..4d5541356c2 100644 --- a/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties +++ b/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties @@ -414,6 +414,16 @@ dashboard.edit_dashboard=Edit dashboard dashboard.update_dashboard=Update dashboard +#------------------------------------------------------------------------------ +# +# SETTINGS +# +#------------------------------------------------------------------------------ +settings.save_category=Save {0} settings +settings.category.General=General + + + #------------------------------------------------------------------------------ # # WIDGETS diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/Property.java b/sonar-plugin-api/src/main/java/org/sonar/api/Property.java index b71fe2af2d4..02f38d19331 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/Property.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/Property.java @@ -57,6 +57,11 @@ public @interface Property { String description() default ""; + /** + * @since 2.11 + */ + String category() default ""; + /** * Is the property displayed in projet settings page ? */ diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb index 79ae8f0ed59..d5c5bceae45 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb @@ -71,6 +71,19 @@ class ProjectController < ApplicationController if !@project.project? && !@project.module? redirect_to :action => 'index', :id => params[:id] end + + @category=params[:category] ||= 'General' + @properties_per_category={} + java_facade.getPluginsMetadata().each do |plugin| + properties=java_facade.getPluginProperties(plugin).select { |property| + (@project.module? && property.module()) || (@project.project? && property.project()) + } + properties.each do |property| + category = (property.category().present? ? property.category() : plugin.name()) + @properties_per_category[category]||=[] + @properties_per_category[category]< :post, :only => ['update'], :redirect_to => { :action => :index } + verify :method => :post, :only => ['update'], :redirect_to => {:action => :index} def index - return access_denied unless is_admin? + return access_denied unless is_admin? + load_properties() + @category ||= 'General' end def update if params[:resource_id] project=Project.by_key(params[:resource_id]) - return access_denied unless is_admin?(project) + return access_denied unless (project && is_admin?(project)) resource_id=project.id else return access_denied unless is_admin? + resource_id=nil end - plugins = java_facade.getPluginsMetadata() - plugins.each do |plugin| - properties=java_facade.getPluginProperties(plugin) - properties.each do |property| + load_properties() + + if @category && @properties_per_category[@category] + @properties_per_category[@category].each do |property| value=params[property.key()] persisted_property = Property.find(:first, :conditions => {:prop_key=> property.key(), :resource_id => resource_id, :user_id => nil}) @@ -48,20 +51,34 @@ class SettingsController < ApplicationController Property.delete_all('prop_key' => property.key(), 'resource_id' => resource_id, 'user_id' => nil) elsif persisted_property.text_value != value.to_s persisted_property.text_value = value.to_s - persisted_property.save + persisted_property.save! end - elsif !value.blank? + elsif !value.blank? Property.create(:prop_key => property.key(), :text_value => value.to_s, :resource_id => resource_id) end end + java_facade.reloadConfiguration() + flash[:notice] = 'Parameters updated' end - java_facade.reloadConfiguration() - flash[:notice] = 'Parameters updated.' if resource_id - redirect_to :controller => 'project', :action => 'settings', :id => resource_id + redirect_to :controller => 'project', :action => 'settings', :id => resource_id, :category => @category else - redirect_to :action => 'index' + redirect_to :controller => 'settings', :action => 'index', :category => @category + end + end + + private + + def load_properties + @category=params[:category] + @properties_per_category={} + java_facade.getPluginsMetadata().each do |plugin| + java_facade.getPluginProperties(plugin).select { |property| property.global }.each do |property| + category = (property.category().present? ? property.category() : plugin.name()) + @properties_per_category[category]||=[] + @properties_per_category[category]< -

    Delete project

    +

    Delete project

    This operation can not be undone. diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_exclusions.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_exclusions.html.erb index 2e315bc8248..b2208db0f2b 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_exclusions.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_exclusions.html.erb @@ -1,4 +1,4 @@ -

    Exclude sources from code analysis

    +

    Exclude sources from code analysis

    diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_links.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_links.html.erb index 4ae38c09f8d..8f79d83807e 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_links.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings/_links.html.erb @@ -1,4 +1,4 @@ -

    Project links

    +

    Project links