]> source.dussan.org Git - sonarqube.git/commitdiff
Fix org.sonar.api.utils.AnnotationUtils: search for annotations in interfaces too
authorsimonbrandhof <simon.brandhof@gmail.com>
Wed, 2 Feb 2011 07:08:24 +0000 (08:08 +0100)
committersimonbrandhof <simon.brandhof@gmail.com>
Wed, 2 Feb 2011 07:09:02 +0000 (08:09 +0100)
sonar-plugin-api/src/main/java/org/sonar/api/utils/AnnotationUtils.java
sonar-plugin-api/src/test/java/org/sonar/api/utils/AnnotationUtilsTest.java

index 10d1b15f64ed7d05054f2b29b00bf751b805f05f..bcf9e1a512ec94e949c8fa231e37a37ad9c828d5 100644 (file)
@@ -19,8 +19,6 @@
  */
 package org.sonar.api.utils;
 
-import java.lang.annotation.Annotation;
-
 /**
  * A utility class for annotations
  *
@@ -35,14 +33,23 @@ public final class AnnotationUtils {
    * Searches for a class annotation. All inheritance tree is analysed.
    */
   public static <A> A getClassAnnotation(final Object object, final Class<A> annotationClass) {
-    Class aClass = (object instanceof Class ? (Class)object : object.getClass());
-    while (aClass != null) {
-      Annotation annotation = aClass.getAnnotation(annotationClass);
-      if (annotation != null) {
-        return (A) annotation;
-      }
+    Class initialClass = (object instanceof Class ? (Class) object : object.getClass());
+    A result = null;
+    Class aClass=initialClass;
+    while (aClass != null && result == null) {
+      result = (A)aClass.getAnnotation(annotationClass);
       aClass = aClass.getSuperclass();
     }
-    return null;
+
+    if (result==null) {
+      Class[] interfaces = initialClass.getInterfaces();
+      for (Class anInterface : interfaces) {
+        result = (A)anInterface.getAnnotation(annotationClass);
+        if (result!=null) {
+          break;
+        }
+      }
+    }
+    return result;
   }
 }
index 395c60396a0a208aeab5ecaa90e67c72e5d23cd6..b29a86787c90a17596e7dfbd17834fa2b1b1faf8 100644 (file)
@@ -19,9 +19,6 @@
  */
 package org.sonar.api.utils;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.core.IsNull.nullValue;
-import static org.junit.Assert.assertThat;
 import org.junit.Test;
 
 import java.lang.annotation.ElementType;
@@ -29,6 +26,10 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
 public class AnnotationUtilsTest {
 
   @Test
@@ -43,6 +44,12 @@ public class AnnotationUtilsTest {
     assertThat(annotation.value(), is("foo"));
   }
 
+  @Test
+  public void searchClassAnnotationInInterface() {
+    FakeAnnotation annotation = AnnotationUtils.getClassAnnotation(new ImplementedClass(), FakeAnnotation.class);
+    assertThat(annotation.value(), is("foo"));
+  }
+
   @Test
   public void noClassAnnotation() {
     FakeAnnotation annotation = AnnotationUtils.getClassAnnotation("a string", FakeAnnotation.class);
@@ -72,4 +79,12 @@ class SuperClass {
 
 class ChildClass extends SuperClass {
 
+}
+
+@FakeAnnotation("foo")
+interface AnnotatedInterface {
+}
+
+class ImplementedClass implements AnnotatedInterface {
+
 }
\ No newline at end of file