Skip to content

Commit b1970e1

Browse files
committed
HHH-18863 probably more efficient way to detect if a class is a Panache thing
1 parent 453f0ff commit b1970e1

File tree

2 files changed

+58
-68
lines changed

2 files changed

+58
-68
lines changed

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.hibernate.query.sqm.tree.expression.SqmParameter;
3131
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
3232

33-
import javax.annotation.processing.ProcessingEnvironment;
3433
import javax.lang.model.element.AnnotationMirror;
3534
import javax.lang.model.element.AnnotationValue;
3635
import javax.lang.model.element.Element;
@@ -48,7 +47,6 @@
4847
import javax.lang.model.type.TypeMirror;
4948
import javax.lang.model.type.TypeVariable;
5049
import javax.lang.model.type.WildcardType;
51-
import javax.lang.model.util.Elements;
5250
import javax.lang.model.util.Types;
5351
import javax.tools.Diagnostic;
5452

@@ -85,10 +83,12 @@
8583
import static org.hibernate.processor.util.TypeUtils.containsAnnotation;
8684
import static org.hibernate.processor.util.TypeUtils.determineAccessTypeForHierarchy;
8785
import static org.hibernate.processor.util.TypeUtils.determineAnnotationSpecifiedAccessType;
86+
import static org.hibernate.processor.util.TypeUtils.extendsClass;
8887
import static org.hibernate.processor.util.TypeUtils.findMappedSuperClass;
8988
import static org.hibernate.processor.util.TypeUtils.getAnnotationMirror;
9089
import static org.hibernate.processor.util.TypeUtils.getAnnotationValue;
9190
import static org.hibernate.processor.util.TypeUtils.hasAnnotation;
91+
import static org.hibernate.processor.util.TypeUtils.implementsInterface;
9292
import static org.hibernate.processor.util.TypeUtils.primitiveClassMatchesKind;
9393
import static org.hibernate.processor.util.TypeUtils.propertyName;
9494

@@ -652,41 +652,18 @@ boolean needsDefaultConstructor() {
652652
}
653653

654654
private boolean isPanacheType(TypeElement type) {
655-
return isOrmPanacheType( type )
656-
|| isReactivePanacheType( type );
655+
return context.usesQuarkusOrm() && isOrmPanacheType( type )
656+
|| context.usesQuarkusReactive() && isReactivePanacheType( type );
657657
}
658658

659659
private boolean isOrmPanacheType(TypeElement type) {
660-
final ProcessingEnvironment processingEnvironment = context.getProcessingEnvironment();
661-
final Elements elements = processingEnvironment.getElementUtils();
662-
final TypeElement panacheRepositorySuperType = elements.getTypeElement( PANACHE_ORM_REPOSITORY_BASE );
663-
final TypeElement panacheEntitySuperType = elements.getTypeElement( PANACHE_ORM_ENTITY_BASE );
664-
if ( panacheRepositorySuperType == null || panacheEntitySuperType == null ) {
665-
return false;
666-
}
667-
else {
668-
final Types types = processingEnvironment.getTypeUtils();
669-
// check against a raw supertype of PanacheRepositoryBase, which .asType() is not
670-
return types.isSubtype( type.asType(), types.getDeclaredType( panacheRepositorySuperType ) )
671-
|| types.isSubtype( type.asType(), panacheEntitySuperType.asType() );
672-
}
660+
return implementsInterface( type, PANACHE_ORM_REPOSITORY_BASE )
661+
|| extendsClass( type, PANACHE_ORM_ENTITY_BASE );
673662
}
674663

675664
private boolean isReactivePanacheType(TypeElement type) {
676-
final ProcessingEnvironment processingEnvironment = context.getProcessingEnvironment();
677-
final Elements elements = processingEnvironment.getElementUtils();
678-
final TypeElement panacheRepositorySuperType = elements.getTypeElement( PANACHE_REACTIVE_REPOSITORY_BASE );
679-
final TypeElement panacheEntitySuperType = elements.getTypeElement( PANACHE_REACTIVE_ENTITY_BASE );
680-
681-
if ( panacheRepositorySuperType == null || panacheEntitySuperType == null ) {
682-
return false;
683-
}
684-
else {
685-
final Types types = processingEnvironment.getTypeUtils();
686-
// check against a raw supertype of PanacheRepositoryBase, which .asType() is not
687-
return types.isSubtype( type.asType(), types.getDeclaredType( panacheRepositorySuperType ) )
688-
|| types.isSubtype( type.asType(), panacheEntitySuperType.asType() );
689-
}
665+
return implementsInterface( type, PANACHE_REACTIVE_REPOSITORY_BASE )
666+
|| extendsClass( type, PANACHE_REACTIVE_ENTITY_BASE );
690667
}
691668

692669
/**

tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,11 @@ protected TypeMirror defaultAction(TypeMirror e, Void aVoid) {
129129
}
130130

131131
public static @Nullable TypeElement getSuperclassTypeElement(TypeElement element) {
132-
final TypeMirror superClass = element.getSuperclass();
132+
final TypeMirror superclass = element.getSuperclass();
133133
//superclass of Object is of NoType which returns some other kind
134-
if ( superClass.getKind() == TypeKind.DECLARED ) {
135-
//F..king Ch...t Have those people used their horrible APIs even once?
136-
final Element superClassElement = ( (DeclaredType) superClass ).asElement();
137-
return (TypeElement) superClassElement;
134+
if ( superclass.getKind() == TypeKind.DECLARED ) {
135+
final DeclaredType declaredType = (DeclaredType) superclass;
136+
return (TypeElement) declaredType.asElement();
138137
}
139138
else {
140139
return null;
@@ -466,14 +465,11 @@ private static void setDefaultAccessTypeForMappedSuperclassesInHierarchy(TypeEle
466465
}
467466

468467
private static @Nullable AccessType getAccessTypeOfIdAnnotation(Element element) {
469-
switch ( element.getKind() ) {
470-
case FIELD:
471-
return AccessType.FIELD;
472-
case METHOD:
473-
return AccessType.PROPERTY;
474-
default:
475-
return null;
476-
}
468+
return switch ( element.getKind() ) {
469+
case FIELD -> AccessType.FIELD;
470+
case METHOD -> AccessType.PROPERTY;
471+
default -> null;
472+
};
477473
}
478474

479475
private static boolean isIdAnnotation(AnnotationMirror annotationMirror) {
@@ -522,26 +518,17 @@ public static boolean isClassOrRecordType(Element element) {
522518
}
523519

524520
public static boolean primitiveClassMatchesKind(Class<?> itemType, TypeKind kind) {
525-
switch (kind) {
526-
case SHORT:
527-
return itemType.equals(Short.class);
528-
case INT:
529-
return itemType.equals(Integer.class);
530-
case LONG:
531-
return itemType.equals(Long.class);
532-
case BOOLEAN:
533-
return itemType.equals(Boolean.class);
534-
case FLOAT:
535-
return itemType.equals(Float.class);
536-
case DOUBLE:
537-
return itemType.equals(Double.class);
538-
case CHAR:
539-
return itemType.equals(Character.class);
540-
case BYTE:
541-
return itemType.equals(Byte.class);
542-
default:
543-
return false;
544-
}
521+
return switch ( kind ) {
522+
case SHORT -> itemType.equals( Short.class );
523+
case INT -> itemType.equals( Integer.class );
524+
case LONG -> itemType.equals( Long.class );
525+
case BOOLEAN -> itemType.equals( Boolean.class );
526+
case FLOAT -> itemType.equals( Float.class );
527+
case DOUBLE -> itemType.equals( Double.class );
528+
case CHAR -> itemType.equals( Character.class );
529+
case BYTE -> itemType.equals( Byte.class );
530+
default -> false;
531+
};
545532
}
546533

547534
public static boolean isPropertyGetter(ExecutableType executable, Element element) {
@@ -602,7 +589,7 @@ else if ( element.getKind() == ElementKind.METHOD ) {
602589
return elementsUtil.getName(decapitalize(name.substring(3))).toString();
603590
}
604591
else if ( name.startsWith( "is" ) ) {
605-
return (elementsUtil.getName(decapitalize(name.substring(2)))).toString();
592+
return elementsUtil.getName(decapitalize(name.substring(2))).toString();
606593
}
607594
return elementsUtil.getName(decapitalize(name)).toString();
608595
}
@@ -613,8 +600,7 @@ else if ( name.startsWith( "is" ) ) {
613600

614601
public static @Nullable String findMappedSuperClass(Metamodel entity, Context context) {
615602
final Element element = entity.getElement();
616-
if ( element instanceof TypeElement ) {
617-
final TypeElement typeElement = (TypeElement) element;
603+
if ( element instanceof TypeElement typeElement ) {
618604
TypeMirror superClass = typeElement.getSuperclass();
619605
//superclass of Object is of NoType which returns some other kind
620606
while ( superClass.getKind() == TypeKind.DECLARED ) {
@@ -654,6 +640,33 @@ private static boolean extendsSuperMetaModel(Element superClassElement, boolean
654640
|| !entityMetaComplete && containsAnnotation( superClassElement, ENTITY, MAPPED_SUPERCLASS );
655641
}
656642

643+
public static boolean implementsInterface(TypeElement type, String interfaceName) {
644+
for ( TypeMirror iface : type.getInterfaces() ) {
645+
if ( iface.getKind() == TypeKind.DECLARED ) {
646+
final DeclaredType declaredType = (DeclaredType) iface;
647+
final TypeElement typeElement = (TypeElement) declaredType.asElement();
648+
if ( typeElement.getQualifiedName().contentEquals( interfaceName )
649+
|| implementsInterface( typeElement, interfaceName ) ) {
650+
return true;
651+
}
652+
}
653+
}
654+
return false;
655+
}
656+
657+
public static boolean extendsClass(TypeElement type, String className) {
658+
TypeMirror superclass = type.getSuperclass();
659+
while ( superclass != null && superclass.getKind() == TypeKind.DECLARED ) {
660+
final DeclaredType declaredType = (DeclaredType) superclass;
661+
final TypeElement typeElement = (TypeElement) declaredType.asElement();
662+
if ( typeElement.getQualifiedName().contentEquals( className ) ) {
663+
return true;
664+
}
665+
superclass = typeElement.getSuperclass();
666+
}
667+
return false;
668+
}
669+
657670
static class EmbeddedAttributeVisitor extends SimpleTypeVisitor8<@Nullable TypeElement, Element> {
658671
private final Context context;
659672

@@ -665,7 +678,7 @@ static class EmbeddedAttributeVisitor extends SimpleTypeVisitor8<@Nullable TypeE
665678
public @Nullable TypeElement visitDeclared(DeclaredType declaredType, Element element) {
666679
final TypeElement returnedElement = (TypeElement)
667680
context.getTypeUtils().asElement( declaredType );
668-
return containsAnnotation( NullnessUtil.castNonNull( returnedElement ), EMBEDDABLE ) ? returnedElement : null;
681+
return containsAnnotation( castNonNull( returnedElement ), EMBEDDABLE ) ? returnedElement : null;
669682
}
670683

671684
@Override

0 commit comments

Comments
 (0)