]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3819 Use the "options" parameter on @WidgetProperty to filter metrics
authorDavid Gageot <david@gageot.net>
Fri, 5 Oct 2012 14:25:01 +0000 (16:25 +0200)
committerDavid Gageot <david@gageot.net>
Fri, 5 Oct 2012 14:25:01 +0000 (16:25 +0200)
sonar-plugin-api/src/main/java/org/sonar/api/web/WidgetProperty.java
sonar-server/src/main/webapp/WEB-INF/app/helpers/properties_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/helpers/rules_configuration_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/helpers/settings_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/helpers/widget_properties_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/views/settings/_type_METRIC.html.erb

index 4fd661a7dfb91758bd739041169086d1a4f667b4..90fe3ea39fe634ce5d77a1243079bf0391f98a24 100644 (file)
@@ -37,4 +37,18 @@ public @interface WidgetProperty {
   String description() default "";
 
   boolean optional() default true;
+
+  /**
+   * Options for property of type WidgetPropertyType.METRIC</code>.
+   *
+   * If no option is specified, any metric will match.
+   * If options are specified, all must match for the metric to be displayed.
+   * Three types of filter are supported <code>key:REGEXP</code>, <code>domain:REGEXP</code> and <code>type:comma_separated__list_of_types</code>.
+   * For example <code>key:new_.*</code> will match any metric which key starts by <code>new_</code>.
+   * For example <code>type:INT,FLOAT</code> will match any metric of type <code>INT</code> or <code>FLOAT</code>.
+   * For example <code>type:NUMERIC</code> will match any metric of numerictype.
+   *
+   * @since 3.3
+   */
+  String[] options() default {};
 }
index 3aef3b645bdd9cc7f1059b10350b35dc49b13661..f2809b086bfc159b9f7837e8124135dca8b25845 100644 (file)
 #
 module PropertiesHelper
 
-  def property_value(key, type, value, options = {})
+  def property_input_field(key, type, value, options, additionalOptions = {})
     if type==PropertyType::TYPE_STRING
-      text_field_tag key, value, {:size => 25}.update(options)
+      text_field_tag key, value, {:size => 25}.update(additionalOptions)
 
     elsif type==PropertyType::TYPE_TEXT
-      text_area_tag key, value, {:rows => '6', :style => 'width: 100%'}.update(options)
+      text_area_tag key, value, {:rows => '6', :style => 'width: 100%'}.update(additionalOptions)
 
     elsif type==PropertyType::TYPE_PASSWORD
-      password_field_tag key, value, {:size => 25}.update(options)
+      password_field_tag key, value, {:size => 25}.update(additionalOptions)
 
     elsif type==PropertyType::TYPE_BOOLEAN
-      (hidden_field_tag key, 'false', options) + (check_box_tag key, 'true', value=='true', options)
+      (hidden_field_tag key, 'false', additionalOptions) + (check_box_tag key, 'true', value=='true', additionalOptions)
 
     elsif type==PropertyType::TYPE_INTEGER
-      text_field_tag key, value, {:size => 10}.update(options)
+      text_field_tag key, value, {:size => 10}.update(additionalOptions)
 
     elsif type==PropertyType::TYPE_FLOAT
-      text_field_tag key, value, {:size => 10}.update(options)
+      text_field_tag key, value, {:size => 10}.update(additionalOptions)
 
     elsif type==PropertyType::TYPE_METRIC
-      metric_select_tag key, Metric.all.select{|m| m.display?}, :selected_key => value, :allow_empty => true
+      metric_select_tag key, metrics_filtered_by(options), :selected_key => value, :allow_empty => true
 
     elsif type==PropertyType::TYPE_REGULAR_EXPRESSION
-      text_field_tag key, value, {:size => 25}.update(options)
+      text_field_tag key, value, {:size => 25}.update(additionalOptions)
 
     elsif type==PropertyType::TYPE_FILTER
       user_filters = options_key(value, ::Filter.find(:all, :conditions => ['user_id=?', current_user.id]).sort_by(&:id))
       shared_filters = options_key(value, ::Filter.find(:all, :conditions => ['(user_id<>? or user_id is null) and shared=?', current_user.id, true]).sort_by(&:id))
 
-      filters_combo = select_tag key, option_group('My Filters', user_filters) + option_group('Shared Filters', shared_filters), options
+      filters_combo = select_tag key, option_group('My Filters', user_filters) + option_group('Shared Filters', shared_filters), additionalOptions
       filter_link = link_to message('widget.filter.edit'), {:controller => :filters, :action => :manage}, :class => 'link-action'
 
       "#{filters_combo} #{filter_link}"
 
     else
-      hidden_field_tag key, options
+      hidden_field_tag key, additionalOptions
     end
   end
 
@@ -70,4 +70,23 @@ module PropertiesHelper
     options.empty? ? '' : "<optgroup label=\"#{h(name)}\">" + options + "</optgroup>"
   end
 
+  def metrics_filtered_by(options)
+    Metric.all.select(&:display?).sort_by(&:short_name).select do |metric|
+      options.blank? || options.any? { |option| metric_matches(metric, option) }
+    end
+  end
+
+  def metric_matches(metric, option)
+    if /key:(.*)/.match(option)
+      Regexp.new(Regexp.last_match(1).strip).match(metric.key)
+    elsif /domain:(.*)/.match(option)
+      Regexp.new(Regexp.last_match(1)).match(metric.domain)
+    elsif /type:(.*)/.match(option)
+      false
+      Regexp.last_match(1).split(',').any? { |type| (type == metric.value_type) || ((type == 'NUMERIC') && metric.numeric?) }
+    else
+      false
+    end
+  end
+
 end
index aa4beee3dbf6aafe4f1e8e136cf1fefca8ae36d5..8f797bcd9fd6118c9d07126d8b2ea4f00590c1e0 100644 (file)
@@ -50,7 +50,7 @@ module RulesConfigurationHelper
   def param_value_input(parameter, value, options = {})
     type=type_with_compatibility(parameter.param_type)
 
-    property_value 'value', type, value, {:id => parameter.id}.update(options)
+    property_input_field 'value', type, value, nil, {:id => parameter.id}.update(options)
   end
 
   def is_set(type)
index 0272059d815bc6dced9c9ca2a0539678cfda1c27..857026a8042df21aa84204ef779722545393b9ea 100644 (file)
@@ -18,6 +18,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 #
 module SettingsHelper
+  include PropertiesHelper
+
   def category_name(category)
     message("property.category.#{category}", :default => category)
   end
@@ -86,23 +88,4 @@ module SettingsHelper
     end
     name
   end
-
-  def metrics_for_property(property)
-    Metric.all.select(&:display?).sort_by(&:short_name).select do |metric|
-      property.options.blank? || property.options.any? { |option| metric_matches(metric, option) }
-    end
-  end
-
-  def metric_matches(metric, option)
-    if /key:(.*)/.match(option)
-      Regexp.new(Regexp.last_match(1).strip).match(metric.key)
-    elsif /domain:(.*)/.match(option)
-      Regexp.new(Regexp.last_match(1)).match(metric.domain)
-    elsif /type:(.*)/.match(option)
-      false
-      Regexp.last_match(1).split(',').any? { |type| (type == metric.value_type) || ((type == 'NUMERIC') && metric.numeric?) }
-    else
-      false
-    end
-  end
 end
index c6a3dda51492e33dc301402efc8cdebb40076ddc..00de6bec37c5159d1d78e5f16ded6e827b12caa3 100644 (file)
@@ -21,7 +21,7 @@ module WidgetPropertiesHelper
   include PropertiesHelper
 
   def property_value_field(definition, value)
-    property_value definition.key(), definition.type.name(), value.nil? ? definition.defaultValue() : value
+    property_input_field definition.key, definition.type.name, value.nil? ? definition.defaultValue : value, definition.options
   end
 
 end
index 61840cb7fa40b44f3c5951928e2414fc92c8c0fd..d06c87e3272ea1d2d93b90bf81cfa376bf83a569 100644 (file)
@@ -2,7 +2,7 @@
   <option value=""><%= message('default') -%></option>
   <%
      metrics_per_domain={}
-     metrics_for_property(property).each do |metric|
+     metrics_filtered_by(property.options).each do |metric|
        domain=metric.domain || ''
        metrics_per_domain[domain]||=[]
        metrics_per_domain[domain]<<metric