From d4806d8ddf1e67e8355c481820b75c7acdc4217a Mon Sep 17 00:00:00 2001 From: Stanislav Muhametsin Date: Thu, 24 Jun 2010 05:46:05 +0300 Subject: [PATCH] Fixed a bug where @Queryable annotation would not get read from super-types. --- api/src/main/java/org/qi4j/api/util/Classes.java | 35 ++++++++++++++++++-- .../java/org/qi4j/runtime/entity/EntityModel.java | 3 +- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/qi4j/api/util/Classes.java b/api/src/main/java/org/qi4j/api/util/Classes.java index efea1a3..c3efe79 100644 --- a/api/src/main/java/org/qi4j/api/util/Classes.java +++ b/api/src/main/java/org/qi4j/api/util/Classes.java @@ -14,11 +14,25 @@ package org.qi4j.api.util; -import java.lang.reflect.*; -import java.util.*; - import static java.util.Arrays.asList; +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * Class-related utility methods */ @@ -127,6 +141,21 @@ public final class Classes return types; } + public static AnnotationType getAnnotationOfTypeOrAnyOfSuperTypes(Class type, Class annotationClass) + { + AnnotationType result = null; + for (Class clazz : typesOf(type)) + { + result = clazz.getAnnotation( annotationClass ); + if (result != null) + { + break; + } + } + + return result; + } + public static Class[] toClassArray( Set types ) { Class[] array = new Class[types.size()]; diff --git a/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java b/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java index 1a92e33..0fd5c8c 100644 --- a/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java +++ b/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java @@ -33,6 +33,7 @@ import org.qi4j.api.entity.Queryable; import org.qi4j.api.property.Immutable; import org.qi4j.api.property.StateHolder; import org.qi4j.api.unitofwork.EntityCompositeAlreadyExistsException; +import org.qi4j.api.util.Classes; import org.qi4j.bootstrap.AssociationDeclarations; import org.qi4j.bootstrap.BindingException; import org.qi4j.bootstrap.ManyAssociationDeclarations; @@ -129,7 +130,7 @@ public final class EntityModel { super( type, visibility, info, mixinsModel, stateModel, compositeMethodsModel ); - final Queryable queryable = type.getAnnotation( Queryable.class ); + final Queryable queryable = Classes.getAnnotationOfTypeOrAnyOfSuperTypes( type, Queryable.class ); this.queryable = queryable == null || queryable.value(); } -- 1.7.0.2.msysgit.0