]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3702 API : AnnotationRuleParser does not detect overridden rule parameters
authorSimon Brandhof <simon.brandhof@gmail.com>
Thu, 26 Jul 2012 21:37:58 +0000 (23:37 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Thu, 26 Jul 2012 21:37:58 +0000 (23:37 +0200)
sonar-plugin-api/src/main/java/org/sonar/api/rules/AnnotationRuleParser.java
sonar-plugin-api/src/test/java/org/sonar/api/rules/AnnotationRuleParserTest.java

index df43d139657d6f59fd3284b648c9e1ea03eca311..ce3bdfacae0bbafcf559d13bd1f106fcbb3f512d 100644 (file)
@@ -19,8 +19,6 @@
  */
 package org.sonar.api.rules;
 
-import org.sonar.api.utils.SonarException;
-
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
@@ -29,6 +27,8 @@ import org.slf4j.LoggerFactory;
 import org.sonar.api.PropertyType;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.utils.AnnotationUtils;
+import org.sonar.api.utils.FieldUtils2;
+import org.sonar.api.utils.SonarException;
 import org.sonar.check.Check;
 
 import java.lang.reflect.Field;
@@ -72,13 +72,10 @@ public final class AnnotationRuleParser implements ServerComponent {
     rule.setSeverity(RulePriority.fromCheckPriority(ruleAnnotation.priority()));
     rule.setCardinality(ruleAnnotation.cardinality());
 
-    Field[] fields = clazz.getDeclaredFields();
-    if (fields != null) {
-      for (Field field : fields) {
-        addRuleProperty(rule, field);
-      }
+    List<Field> fields = FieldUtils2.getFields(clazz, true);
+    for (Field field : fields) {
+      addRuleProperty(rule, field);
     }
-
     return rule;
   }
 
@@ -89,11 +86,9 @@ public final class AnnotationRuleParser implements ServerComponent {
     rule.setDescription(checkAnnotation.description());
     rule.setSeverity(RulePriority.fromCheckPriority(checkAnnotation.priority()));
 
-    Field[] fields = clazz.getDeclaredFields();
-    if (fields != null) {
-      for (Field field : fields) {
-        addCheckProperty(rule, field);
-      }
+    List<Field> fields = FieldUtils2.getFields(clazz, true);
+    for (Field field : fields) {
+      addCheckProperty(rule, field);
     }
     return rule;
   }
index 2fa2b5c30de39532cefc678183f09182be12ca1c..74877514357622cde923e41ef0d895fab922e512 100644 (file)
  */
 package org.sonar.api.rules;
 
-import org.sonar.api.utils.SonarException;
-
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.sonar.api.PropertyType;
+import org.sonar.api.utils.SonarException;
 import org.sonar.check.IsoCategory;
 import org.sonar.check.Priority;
 
@@ -115,6 +114,18 @@ public class AnnotationRuleParserTest {
     assertThat(rule.getSeverity()).isEqualTo(RulePriority.MAJOR);
   }
 
+  @Test
+  public void overridden_rule() {
+    List<Rule> rules = parseAnnotatedClass(OverridingRule.class);
+    assertThat(rules).hasSize(1);
+    Rule rule = rules.get(0);
+    assertThat(rule.getKey()).isEqualTo("overriding_foo");
+    assertThat(rule.getName()).isEqualTo("Overriding Foo");
+    assertThat(rule.getDescription()).isNull();
+    assertThat(rule.getSeverity()).isEqualTo(RulePriority.MAJOR);
+    assertThat(rule.getParams()).hasSize(2);
+  }
+
   @Test
   public void supportDeprecatedAnnotations() {
     List<Rule> rules = parseAnnotatedClass(Check.class);
@@ -141,19 +152,25 @@ public class AnnotationRuleParserTest {
   @org.sonar.check.Rule(key = "foo", name = "bar", description = "Foo Bar", priority = Priority.BLOCKER)
   static class RuleWithProperty {
     @org.sonar.check.RuleProperty(description = "Ignore ?", defaultValue = "false")
-    public String property;
+    private String property;
+  }
+
+  @org.sonar.check.Rule(key = "overriding_foo", name = "Overriding Foo")
+  static class OverridingRule extends RuleWithProperty {
+    @org.sonar.check.RuleProperty
+    private String additionalProperty;
   }
 
   @org.sonar.check.Rule(key = "foo", name = "bar", description = "Foo Bar", priority = Priority.BLOCKER)
   static class RuleWithIntegerProperty {
     @org.sonar.check.RuleProperty(description = "Max", defaultValue = "12")
-    public Integer property;
+    private Integer property;
   }
 
   @org.sonar.check.Rule(key = "foo", name = "bar", description = "Foo Bar", priority = Priority.BLOCKER)
   static class RuleWithTextProperty {
     @org.sonar.check.RuleProperty(description = "text", defaultValue = "Long text", type = "TEXT")
-    public String property;
+    protected String property;
   }
 
   @org.sonar.check.Rule(key = "foo", name = "bar", description = "Foo Bar", priority = Priority.BLOCKER)