]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3819 Use the "options" parameter on @Property to filter metrics
authorDavid Gageot <david@gageot.net>
Thu, 4 Oct 2012 16:54:51 +0000 (18:54 +0200)
committerDavid Gageot <david@gageot.net>
Thu, 4 Oct 2012 17:16:34 +0000 (19:16 +0200)
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java
sonar-plugin-api/src/main/java/org/sonar/api/Property.java
sonar-server/src/main/webapp/WEB-INF/app/helpers/settings_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/views/settings/_type_METRIC.html.erb

index e1c7f2eab749613bd733980289165c7d944eb057..c059833d500ed0c3802fc36947baa239ff7c0be7 100644 (file)
@@ -177,7 +177,9 @@ import java.util.List;
       @PropertyField(
         key = "metric",
         name = "metric",
-        type = PropertyType.METRIC),
+        type = PropertyType.METRIC,
+        options = {"regexp_on_key: new_.*"}
+      ),
       @PropertyField(
         key = "password",
         name = "password",
index 3d85cfb46f00b0aaf87fe511fcb39a0558dbf6a1..b0179ceedf3ae749711ec7748be26b251288c5db 100644 (file)
@@ -88,7 +88,15 @@ public @interface Property {
   /**
    * Options for *_LIST types
    *
-   * @since 3.0
+   * @since 3.0  Options for property of type PropertyType.SINGLE_SELECT_LIST</code>
+   *
+   * @since 3.3  Options for property of type PropertyType.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.
    */
   String[] options() default {};
 
index 13603e2af3547b3d4f54db2b9796d66d8c4f5de5..0272059d815bc6dced9c9ca2a0539678cfda1c27 100644 (file)
@@ -86,4 +86,23 @@ 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 c4329684079c881a327566a4ee5e1d5cdeade378..61840cb7fa40b44f3c5951928e2414fc92c8c0fd 100644 (file)
@@ -1,27 +1,21 @@
 <select name="<%= name -%>" id="<%= id -%>">
   <option value=""><%= message('default') -%></option>
   <%
-   metrics_per_domain={}
-   Metric.all.select { |m| m.display? }.sort_by { |m| m.short_name }.each do |metric|
-     domain=metric.domain || ''
-     metrics_per_domain[domain]||=[]
-     metrics_per_domain[domain]<<metric
-   end
-
-   metrics_per_domain.keys.sort.each do |domain|
-%>
-
-     <optgroup label="<%= h domain -%>">
-<%
-     metrics_per_domain[domain].each do |m|
-       selected_attr = (m.key==value || m.id==value) ? " selected='selected'" : ''
-%>
-       <option value="<%= m.key -%>" <%= selected_attr -%>><%= m.short_name -%></option>
-<%
+     metrics_per_domain={}
+     metrics_for_property(property).each do |metric|
+       domain=metric.domain || ''
+       metrics_per_domain[domain]||=[]
+       metrics_per_domain[domain]<<metric
      end
-%>
-   </optgroup>
-<%
-  end
-%>
+
+     metrics_per_domain.keys.sort.each do |domain|
+  %>
+    <optgroup label="<%= h domain -%>">
+      <% metrics_per_domain[domain].each do |m|
+        selected_attr = (m.key==value || m.id==value) ? " selected='selected'" : ''
+      %>
+        <option value="<%= m.key -%>" <%= selected_attr -%>><%= m.short_name -%></option>
+      <% end -%>
+    </optgroup>
+  <% end -%>
 </select>
\ No newline at end of file